Add migration and books

This commit is contained in:
gabatxo1312 2026-01-28 00:38:24 +01:00
commit 4cd32831c1
No known key found for this signature in database
19 changed files with 819 additions and 245 deletions

View file

@ -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)]