mirror of
https://github.com/flibusta-apps/book_library_server.git
synced 2025-12-06 07:05:36 +01:00
Update books query
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,3 +2,4 @@
|
|||||||
|
|
||||||
.env
|
.env
|
||||||
.vscode
|
.vscode
|
||||||
|
.idea
|
||||||
|
|||||||
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
@@ -20,7 +20,7 @@ pub struct BookFilter {
|
|||||||
pub id_lte: Option<i32>,
|
pub id_lte: Option<i32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize, sqlx::FromRow)]
|
||||||
pub struct RemoteBook {
|
pub struct RemoteBook {
|
||||||
pub id: i32,
|
pub id: i32,
|
||||||
pub title: String,
|
pub title: String,
|
||||||
|
|||||||
@@ -27,30 +27,61 @@ pub async fn get_books(
|
|||||||
axum_extra::extract::Query(book_filter): axum_extra::extract::Query<BookFilter>,
|
axum_extra::extract::Query(book_filter): axum_extra::extract::Query<BookFilter>,
|
||||||
pagination: Query<Pagination>,
|
pagination: Query<Pagination>,
|
||||||
) -> impl IntoResponse {
|
) -> impl IntoResponse {
|
||||||
let books_count = sqlx::query_scalar!(
|
let books_count = {
|
||||||
r#"
|
let mut query_builder =
|
||||||
SELECT COUNT(*) FROM books
|
sqlx::query_builder::QueryBuilder::new("SELECT COUNT(*) FROM books");
|
||||||
WHERE lang = ANY($1) AND
|
|
||||||
($2::boolean IS NULL OR is_deleted = $2) AND
|
query_builder.push(" WHERE lang = ANY(?)");
|
||||||
($3::date IS NULL OR uploaded >= $3) AND
|
query_builder.push_bind(&book_filter.allowed_langs);
|
||||||
($4::date IS NULL OR uploaded <= $4) AND
|
|
||||||
($5::integer IS NULL OR id >= $5) AND
|
if let Some(is_deleted) = book_filter.is_deleted {
|
||||||
($6::integer IS NULL OR id <= $6)
|
query_builder.push(" AND is_deleted = ?");
|
||||||
"#,
|
query_builder.push_bind(is_deleted);
|
||||||
&book_filter.allowed_langs,
|
}
|
||||||
book_filter.is_deleted,
|
|
||||||
book_filter.uploaded_gte,
|
match (book_filter.uploaded_gte, book_filter.uploaded_lte) {
|
||||||
book_filter.uploaded_lte,
|
(Some(uploaded_gte), Some(uploaded_lte)) => {
|
||||||
book_filter.id_gte,
|
query_builder.push(" AND uploaded BETWEEN ? AND ?");
|
||||||
book_filter.id_lte,
|
query_builder.push_bind(uploaded_gte);
|
||||||
)
|
query_builder.push_bind(uploaded_lte);
|
||||||
|
}
|
||||||
|
(Some(uploaded_gte), None) => {
|
||||||
|
query_builder.push(" AND uploaded >= ?");
|
||||||
|
query_builder.push_bind(uploaded_gte);
|
||||||
|
}
|
||||||
|
(None, Some(uploaded_lte)) => {
|
||||||
|
query_builder.push(" AND uploaded <= ?");
|
||||||
|
query_builder.push_bind(uploaded_lte);
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
match (book_filter.id_gte, book_filter.id_lte) {
|
||||||
|
(Some(id_gte), Some(id_lte)) => {
|
||||||
|
query_builder.push(" AND id BETWEEN ? AND ?");
|
||||||
|
query_builder.push_bind(id_gte);
|
||||||
|
query_builder.push_bind(id_lte);
|
||||||
|
}
|
||||||
|
(Some(id_gte), None) => {
|
||||||
|
query_builder.push(" AND id >= ?");
|
||||||
|
query_builder.push_bind(id_gte);
|
||||||
|
}
|
||||||
|
(None, Some(id_lte)) => {
|
||||||
|
query_builder.push(" AND id <= ?");
|
||||||
|
query_builder.push_bind(id_lte);
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
query_builder
|
||||||
|
.build_query_scalar()
|
||||||
.fetch_one(&db.0)
|
.fetch_one(&db.0)
|
||||||
.await
|
.await
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.unwrap();
|
};
|
||||||
|
|
||||||
let books = sqlx::query_as!(
|
let books = {
|
||||||
RemoteBook,
|
let mut query_builder = sqlx::query_builder::QueryBuilder::new(
|
||||||
r#"
|
r#"
|
||||||
SELECT
|
SELECT
|
||||||
b.id,
|
b.id,
|
||||||
@@ -129,28 +160,65 @@ pub async fn get_books(
|
|||||||
) AS "source!: Source",
|
) AS "source!: Source",
|
||||||
b.remote_id
|
b.remote_id
|
||||||
FROM books b
|
FROM books b
|
||||||
WHERE lang = ANY($1) AND
|
|
||||||
($2::boolean IS NULL OR is_deleted = $2) AND
|
|
||||||
($3::date IS NULL OR uploaded >= $3) AND
|
|
||||||
($4::date IS NULL OR uploaded <= $4) AND
|
|
||||||
($5::integer IS NULL OR id >= $5) AND
|
|
||||||
($6::integer IS NULL OR id <= $6)
|
|
||||||
ORDER BY b.id ASC
|
|
||||||
OFFSET $7
|
|
||||||
LIMIT $8
|
|
||||||
"#,
|
"#,
|
||||||
&book_filter.allowed_langs,
|
);
|
||||||
book_filter.is_deleted,
|
|
||||||
book_filter.uploaded_gte,
|
query_builder.push(" WHERE lang = ANY(?)");
|
||||||
book_filter.uploaded_lte,
|
query_builder.push_bind(&book_filter.allowed_langs);
|
||||||
book_filter.id_gte,
|
|
||||||
book_filter.id_lte,
|
if let Some(is_deleted) = book_filter.is_deleted {
|
||||||
(pagination.page - 1) * pagination.size,
|
query_builder.push(" AND is_deleted = ?");
|
||||||
pagination.size,
|
query_builder.push_bind(is_deleted);
|
||||||
)
|
}
|
||||||
|
|
||||||
|
match (book_filter.uploaded_gte, book_filter.uploaded_lte) {
|
||||||
|
(Some(uploaded_gte), Some(uploaded_lte)) => {
|
||||||
|
query_builder.push(" AND uploaded BETWEEN ? AND ?");
|
||||||
|
query_builder.push_bind(uploaded_gte);
|
||||||
|
query_builder.push_bind(uploaded_lte);
|
||||||
|
}
|
||||||
|
(Some(uploaded_gte), None) => {
|
||||||
|
query_builder.push(" AND uploaded >= ?");
|
||||||
|
query_builder.push_bind(uploaded_gte);
|
||||||
|
}
|
||||||
|
(None, Some(uploaded_lte)) => {
|
||||||
|
query_builder.push(" AND uploaded <= ?");
|
||||||
|
query_builder.push_bind(uploaded_lte);
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
match (book_filter.id_gte, book_filter.id_lte) {
|
||||||
|
(Some(id_gte), Some(id_lte)) => {
|
||||||
|
query_builder.push(" AND id BETWEEN ? AND ?");
|
||||||
|
query_builder.push_bind(id_gte);
|
||||||
|
query_builder.push_bind(id_lte);
|
||||||
|
}
|
||||||
|
(Some(id_gte), None) => {
|
||||||
|
query_builder.push(" AND id >= ?");
|
||||||
|
query_builder.push_bind(id_gte);
|
||||||
|
}
|
||||||
|
(None, Some(id_lte)) => {
|
||||||
|
query_builder.push(" AND id <= ?");
|
||||||
|
query_builder.push_bind(id_lte);
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
query_builder.push(" ORDER BY b.id ASC");
|
||||||
|
|
||||||
|
query_builder.push(" OFFSET ?");
|
||||||
|
query_builder.push_bind((pagination.page - 1) * pagination.size);
|
||||||
|
|
||||||
|
query_builder.push(" LIMIT ?");
|
||||||
|
query_builder.push_bind(pagination.size);
|
||||||
|
|
||||||
|
query_builder
|
||||||
|
.build_query_as()
|
||||||
.fetch_all(&db.0)
|
.fetch_all(&db.0)
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap()
|
||||||
|
};
|
||||||
|
|
||||||
let page: Page<RemoteBook> = Page::new(books, books_count, &pagination);
|
let page: Page<RemoteBook> = Page::new(books, books_count, &pagination);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user