v0.11-paginationP1
This commit is contained in:
16
README.md
Normal file
16
README.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
TODO
|
||||||
|
|
||||||
|
Pagination
|
||||||
|
|
||||||
|
Update
|
||||||
|
|
||||||
|
Search - meilisearch
|
||||||
|
|
||||||
|
GoodreadID, GoogleID, Description, Excerpt
|
||||||
|
|
||||||
|
Publishers
|
||||||
|
|
||||||
|
ISBN - mass fill - different format
|
||||||
|
|
||||||
|
GoogleAPI fallback
|
||||||
|
|
||||||
@@ -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{
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user