use ::entity::entities::book::Entity as Book; use ::entity::entities::user::Entity as User; //, book_author::Entity as Author, book_person::Entity as Person, book_place::Entity as Place, book_subject::Entity as Subject, book_time::Entity as Time, book_isbn::Entity as ISBN}; use ::entity::entities::{book,book_author,book_person,book_place,book_subject,book_time,book_isbn,user}; //use ::entity::entities::{prelude::*, *}; use sea_orm::*; //use sea_query::Expr; #[derive(Clone)] pub struct BookAndMetaV2 { pub book: book::Model, pub authors: Vec, pub persons: Vec, pub places: Vec, pub subjects: Vec, pub times: Vec, pub isbns: Vec, } //use ::entity::entities::prelude::Book; pub struct Query; impl Query { pub async fn find_book_by_id(db: &DbConn, id: i32) -> Result, DbErr> { Book::find_by_id(id).one(db).await } pub async fn find_user_by_id(db: &DbConn, id: i32) -> Result, DbErr> { User::find_by_id(id).one(db).await } pub async fn list_all_users(db: &DbConn) -> Result, DbErr> { User::find().all(db).await } /* pub async fn find_bookplusmeta_by_id(db: &DbConn, id: i32) -> Result, Vec)>, DbErr> { let book = Book::find_by_id(id).one(db).await?.unwrap(); let authors = book.find_related(Author).all(db).await?; let persons = book.find_related(Person).all(db).await?; Ok(Some((book, authors, persons))) } */ /// If ok, returns (post models, num pages). pub async fn find_books_in_page( db: &DbConn, page: u64, posts_per_page: u64, userid: i32, ) -> Result<(Vec, u64), DbErr> { // Setup paginator let paginator = Book::find() .filter(book::Column::UserId.eq(userid)) .order_by_asc(book::Column::Id) .paginate(db, posts_per_page); let num_pages = paginator.num_pages().await?; // Fetch paginated posts paginator.fetch_page(page - 1).await.map(|p| (p, num_pages)) } pub async fn find_books_plus_meta_in_page( db: &DbConn, page: usize, posts_per_page: usize, userid: i32, ) -> Result<(Vec, u64), DbErr> { // Setup paginator let books = Self::find_books_in_page(db,page.try_into().unwrap(),posts_per_page.try_into().unwrap(),userid).await?; let book_ids: Vec = books.0.clone().into_iter().map(|b| b.id).collect(); let mut resbooks: Vec = Vec::with_capacity(book_ids.len()); for book in books.0.iter() { let bauthors: Vec = book.find_related(book_author::Entity).all(db).await?; let bpersons: Vec = book.find_related(book_person::Entity).all(db).await?; let bplaces: Vec = book.find_related(book_place::Entity).all(db).await?; let bsubjects: Vec = book.find_related(book_subject::Entity).all(db).await?; let btimes: Vec = book.find_related(book_time::Entity).all(db).await?; let bisbns: Vec = book.find_related(book_isbn::Entity).all(db).await?; let bookandmeta = BookAndMetaV2 { book: (book.clone()), authors: bauthors, persons: bpersons, places: bplaces, subjects: bsubjects, times: btimes, isbns: bisbns }; resbooks.push(bookandmeta); } Ok((resbooks,books.1)) } }