Add migration and books
This commit is contained in:
parent
30be91390b
commit
4cd32831c1
19 changed files with 819 additions and 245 deletions
|
|
@ -1,3 +1,5 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use askama::Template;
|
||||
use askama_web::WebTemplate;
|
||||
use axum::{
|
||||
|
|
@ -9,25 +11,57 @@ use serde::Deserialize;
|
|||
use snafu::prelude::*;
|
||||
|
||||
use crate::{
|
||||
models::user::{self, UserOperator},
|
||||
models::{
|
||||
book::BookOperator,
|
||||
user::{self, UserOperator},
|
||||
},
|
||||
state::{
|
||||
AppState,
|
||||
error::{AppStateError, UserSnafu},
|
||||
error::{AppStateError, BookSnafu, UserSnafu},
|
||||
},
|
||||
};
|
||||
|
||||
#[derive(Template, WebTemplate)]
|
||||
#[template(path = "users/index.html")]
|
||||
struct UsersIndexTemplate {
|
||||
users: Vec<user::Model>,
|
||||
user_with_books_number: Vec<(user::Model, usize, usize)>,
|
||||
}
|
||||
|
||||
pub async fn index(
|
||||
State(state): State<AppState>,
|
||||
) -> Result<impl axum::response::IntoResponse, AppStateError> {
|
||||
let users = UserOperator::new(state).list().await.context(UserSnafu)?;
|
||||
let users = UserOperator::new(state.clone())
|
||||
.list()
|
||||
.await
|
||||
.context(UserSnafu)?;
|
||||
|
||||
Ok(UsersIndexTemplate { users })
|
||||
let books = BookOperator::new(state.clone())
|
||||
.list()
|
||||
.await
|
||||
.context(BookSnafu)?;
|
||||
|
||||
let mut result: Vec<(user::Model, usize, usize)> = vec![];
|
||||
|
||||
let mut owner_books: HashMap<i32, usize> = HashMap::new();
|
||||
let mut borrowed_books: HashMap<i32, usize> = HashMap::new();
|
||||
|
||||
for book in &books {
|
||||
*owner_books.entry(book.owner_id).or_default() += 1;
|
||||
if let Some(current_holder_id) = book.current_holder_id {
|
||||
*borrowed_books.entry(current_holder_id).or_default() += 1;
|
||||
}
|
||||
}
|
||||
|
||||
for user in users {
|
||||
let owner_books_size = owner_books.get(&user.id).unwrap_or(&0);
|
||||
let borrowed_books_size = borrowed_books.get(&user.id).unwrap_or(&0);
|
||||
|
||||
result.push((user, *owner_books_size, *borrowed_books_size));
|
||||
}
|
||||
|
||||
Ok(UsersIndexTemplate {
|
||||
user_with_books_number: result,
|
||||
})
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
|
|
|
|||
Loading…
Reference in a new issue