v0.11-paginationP1

This commit is contained in:
2022-11-06 21:34:29 +05:30
parent b64633bf53
commit d0caca5e59
3 changed files with 47 additions and 12 deletions

16
README.md Normal file
View File

@@ -0,0 +1,16 @@
TODO
Pagination
Update
Search - meilisearch
GoodreadID, GoogleID, Description, Excerpt
Publishers
ISBN - mass fill - different format
GoogleAPI fallback

View File

@@ -76,6 +76,12 @@ struct Books {
} }
#[derive(Deserialize, Serialize, Debug)]
struct PaginatedBookUIList {
num_pages: u32,
books: Vec<BookUI>,
}
#[derive(Deserialize, Serialize, Debug)] #[derive(Deserialize, Serialize, Debug)]
struct BookPageOL { struct BookPageOL {
description: Option<DescriptionOL>, description: Option<DescriptionOL>,
@@ -167,8 +173,8 @@ pub async fn main() {
let app = Router::new() let app = Router::new()
.route("/api/search_openlibrary", get(search_openlibrary)) .route("/api/search_openlibrary", get(search_openlibrary))
.route("/api/delete/:id", post(delete_book)) .route("/api/delete/:id", get(delete_book))
.route("/api/list", post(list_book)) .route("/api/list", get(list_book))
.route("/api/create", post(create_book)) .route("/api/create", post(create_book))
.nest("/images", get_service(ServeDir::new("../images")).handle_error(handle_error)) .nest("/images", get_service(ServeDir::new("../images")).handle_error(handle_error))
.merge(SpaRouter::new("/assets", opt.static_dir)) .merge(SpaRouter::new("/assets", opt.static_dir))
@@ -254,8 +260,11 @@ async fn delete_book(
async fn list_book( async fn list_book(
Extension(ref conn): Extension<DatabaseConnection>, Extension(ref conn): Extension<DatabaseConnection>,
axum::extract::Query(params): axum::extract::Query<HashMap<String, String>>,
) -> impl IntoResponse { ) -> 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 .await
.expect("could not list books"); .expect("could not list books");
@@ -264,7 +273,7 @@ async fn list_book(
data_grouped.push((key, group.collect())); data_grouped.push((key, group.collect()));
} }
let mut res: Vec<BookUI> = Vec::with_capacity(5); let mut resbooks: Vec<BookUI> = Vec::with_capacity(5);
for (id,group) in data_grouped.into_iter() { for (id,group) in data_grouped.into_iter() {
let mut cover = group.clone().into_iter().clone().map(|u| u.cover).next(); let mut cover = group.clone().into_iter().clone().map(|u| u.cover).next();
if !cover.is_none() { 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()), 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<BookUI> = (books.0).iter() /* let mut res: Vec<BookUI> = (books.0).iter()
.group_by(|x| (x.id, x.title.clone()) ).into_iter() .group_by(|x| (x.id, x.title.clone()) ).into_iter()
.map(|((id,title), group )| BookUI{ .map(|((id,title), group )| BookUI{

View File

@@ -38,6 +38,11 @@ pub struct BookUIProp {
bookitem: BookUI, bookitem: BookUI,
} }
#[derive(Deserialize, Serialize, Debug)]
struct PaginatedBookUIList {
num_pages: u32,
books: Vec<BookUI>,
}
#[derive(Debug, Default, Clone)] #[derive(Debug, Default, Clone)]
pub struct AppState { pub struct AppState {
@@ -74,15 +79,15 @@ async fn add_book(record: BookUI) -> Result<reqwasm::http::Response, reqwasm::Er
async fn delete_book(id: i32) -> Result<reqwasm::http::Response, reqwasm::Error> { async fn delete_book(id: i32) -> Result<reqwasm::http::Response, reqwasm::Error> {
let url = format!("http://localhost:8081/api/delete/{}", id); 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) Ok(resp)
} }
async fn list_books() -> Result<Vec<BookUI>, reqwasm::Error> { async fn list_books(page: u32) -> Result<PaginatedBookUIList, reqwasm::Error> {
let url = format!("http://localhost:8081/api/list"); let url = format!("http://localhost:8081/api/list?page={}",page);
let resp = Request::post(&url).send().await?; let resp = Request::get(&url).send().await?;
println!("Fetching books\n"); println!("Fetching books\n");
let body = resp.json::<Vec<BookUI>>().await?; let body = resp.json::<PaginatedBookUIList>().await?;
Ok(body) Ok(body)
} }
@@ -140,9 +145,9 @@ async fn ListDB<G: Html>(cx: Scope<'_>) -> View<G> {
if *app_state.openlibrary.get() == false { if *app_state.openlibrary.get() == false {
spawn_local(async move { spawn_local(async move {
app_state.books.set( app_state.books.set(
list_books() list_books(1)
.await .await
.unwrap(), .unwrap().books,
) )
}); });
} }