diff --git a/README.md b/README.md new file mode 100644 index 0000000..6aeedee --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +TODO + +Pagination + +Update + +Search - meilisearch + +GoodreadID, GoogleID, Description, Excerpt + +Publishers + +ISBN - mass fill - different format + +GoogleAPI fallback + diff --git a/backend/api/src/lib.rs b/backend/api/src/lib.rs index daecb4e..a392509 100644 --- a/backend/api/src/lib.rs +++ b/backend/api/src/lib.rs @@ -76,6 +76,12 @@ struct Books { } +#[derive(Deserialize, Serialize, Debug)] +struct PaginatedBookUIList { + num_pages: u32, + books: Vec, +} + #[derive(Deserialize, Serialize, Debug)] struct BookPageOL { description: Option, @@ -167,8 +173,8 @@ pub async fn main() { let app = Router::new() .route("/api/search_openlibrary", get(search_openlibrary)) - .route("/api/delete/:id", post(delete_book)) - .route("/api/list", post(list_book)) + .route("/api/delete/:id", get(delete_book)) + .route("/api/list", get(list_book)) .route("/api/create", post(create_book)) .nest("/images", get_service(ServeDir::new("../images")).handle_error(handle_error)) .merge(SpaRouter::new("/assets", opt.static_dir)) @@ -254,8 +260,11 @@ async fn delete_book( async fn list_book( Extension(ref conn): Extension, + axum::extract::Query(params): axum::extract::Query>, ) -> impl IntoResponse { - let books = QueryCore::find_books_plus_meta_in_page(conn,1,5) + let page: usize = params.get("page").unwrap().parse().unwrap(); + + let books = QueryCore::find_books_plus_meta_in_page(conn,page,5) .await .expect("could not list books"); @@ -264,7 +273,7 @@ async fn list_book( data_grouped.push((key, group.collect())); } -let mut res: Vec = Vec::with_capacity(5); +let mut resbooks: Vec = Vec::with_capacity(5); for (id,group) in data_grouped.into_iter() { let mut cover = group.clone().into_iter().clone().map(|u| u.cover).next(); if !cover.is_none() { @@ -292,8 +301,13 @@ time: Some(group.clone().into_iter().map(|u| u.time).collect()), isbn: Some(group.clone().into_iter().map(|u| u.isbn).collect()), }; - res.push(bookui); + resbooks.push(bookui); } + + let res = PaginatedBookUIList{ + num_pages: books.1 as u32, + books: resbooks + }; /* let mut res: Vec = (books.0).iter() .group_by(|x| (x.id, x.title.clone()) ).into_iter() .map(|((id,title), group )| BookUI{ diff --git a/frontend/src/main.rs b/frontend/src/main.rs index baa27a0..d1abc06 100644 --- a/frontend/src/main.rs +++ b/frontend/src/main.rs @@ -38,6 +38,11 @@ pub struct BookUIProp { bookitem: BookUI, } +#[derive(Deserialize, Serialize, Debug)] +struct PaginatedBookUIList { + num_pages: u32, + books: Vec, +} #[derive(Debug, Default, Clone)] pub struct AppState { @@ -74,15 +79,15 @@ async fn add_book(record: BookUI) -> Result Result { let url = format!("http://localhost:8081/api/delete/{}", id); - let resp = Request::post(&url).send().await?; + let resp = Request::get(&url).send().await?; Ok(resp) } -async fn list_books() -> Result, reqwasm::Error> { - let url = format!("http://localhost:8081/api/list"); - let resp = Request::post(&url).send().await?; +async fn list_books(page: u32) -> Result { + let url = format!("http://localhost:8081/api/list?page={}",page); + let resp = Request::get(&url).send().await?; println!("Fetching books\n"); - let body = resp.json::>().await?; + let body = resp.json::().await?; Ok(body) } @@ -140,9 +145,9 @@ async fn ListDB(cx: Scope<'_>) -> View { if *app_state.openlibrary.get() == false { spawn_local(async move { app_state.books.set( - list_books() + list_books(1) .await - .unwrap(), + .unwrap().books, ) }); }