From f35b3437683f79a1fc5935e1fa8d3c67bee4d3de Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Sun, 22 Jun 2025 22:54:11 +0200 Subject: [PATCH] refactor: WIP splitting crates --- Cargo.lock | 10 ++++ Cargo.toml | 2 +- db/Cargo.toml | 12 ++++ db/src/lib.rs | 24 ++++++++ {web => db}/src/models/area.rs | 0 {web => db}/src/models/assignment.rs | 5 +- .../src/models/assignment_changeset.rs | 13 ++--- {web => db}/src/models/availability.rs | 5 +- .../models/availability_assignment_state.rs | 0 .../src/models/availability_changeset.rs | 0 {web => db}/src/models/clothing.rs | 0 {web => db}/src/models/event.rs | 0 {web => db}/src/models/event_changeset.rs | 0 {web => db}/src/models/export_event_row.rs | 0 {web => db}/src/models/function.rs | 0 {web => db}/src/models/location.rs | 0 db/src/models/mod.rs | 35 +++++++++++ {web => db}/src/models/password_reset.rs | 0 {web => db}/src/models/registration.rs | 0 {web => db}/src/models/role.rs | 0 {web => db}/src/models/user.rs | 0 {web => db}/src/models/user_changeset.rs | 0 {web => db}/src/models/user_funtion.rs | 0 {web => db}/src/models/vehicle.rs | 0 {web => db}/src/models/vehicle_assignment.rs | 0 web/Cargo.toml | 1 + web/src/models/mod.rs | 58 ------------------- 27 files changed, 94 insertions(+), 71 deletions(-) create mode 100644 db/Cargo.toml create mode 100644 db/src/lib.rs rename {web => db}/src/models/area.rs (100%) rename {web => db}/src/models/assignment.rs (97%) rename {web => db}/src/models/assignment_changeset.rs (89%) rename {web => db}/src/models/availability.rs (99%) rename {web => db}/src/models/availability_assignment_state.rs (100%) rename {web => db}/src/models/availability_changeset.rs (100%) rename {web => db}/src/models/clothing.rs (100%) rename {web => db}/src/models/event.rs (100%) rename {web => db}/src/models/event_changeset.rs (100%) rename {web => db}/src/models/export_event_row.rs (100%) rename {web => db}/src/models/function.rs (100%) rename {web => db}/src/models/location.rs (100%) create mode 100644 db/src/models/mod.rs rename {web => db}/src/models/password_reset.rs (100%) rename {web => db}/src/models/registration.rs (100%) rename {web => db}/src/models/role.rs (100%) rename {web => db}/src/models/user.rs (100%) rename {web => db}/src/models/user_changeset.rs (100%) rename {web => db}/src/models/user_funtion.rs (100%) rename {web => db}/src/models/vehicle.rs (100%) rename {web => db}/src/models/vehicle_assignment.rs (100%) delete mode 100644 web/src/models/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 5b2a72cf..0791d68f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -787,6 +787,15 @@ dependencies = [ "dotenvy", ] +[[package]] +name = "brass-db" +version = "0.1.0" +dependencies = [ + "chrono", + "garde", + "sqlx", +] + [[package]] name = "brass-macros" version = "0.1.0" @@ -809,6 +818,7 @@ dependencies = [ "argon2", "askama", "brass-config", + "brass-db", "brass-macros", "built", "change-detection", diff --git a/Cargo.toml b/Cargo.toml index 45e8ac86..9f9158b3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = [ "cli", "config", "macros", "web", ] +members = [ "cli", "config", "db", "macros", "web", ] resolver = "2" default-members = ["web"] diff --git a/db/Cargo.toml b/db/Cargo.toml new file mode 100644 index 00000000..8d43249f --- /dev/null +++ b/db/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "brass-db" +version = "0.1.0" +edition = "2024" +license = "AGPL-3.0" +authors = ["Max Hohlfeld "] +publish = false + +[dependencies] +sqlx = { version = "^0.8", features = ["runtime-async-std-rustls", "postgres", "chrono"] } +chrono = { version = "0.4.33", features = ["serde", "now"] } +garde = { version = "0.22.0", features = ["derive", "email"] } diff --git a/db/src/lib.rs b/db/src/lib.rs new file mode 100644 index 00000000..db04445c --- /dev/null +++ b/db/src/lib.rs @@ -0,0 +1,24 @@ +mod models; + +pub use models::area::Area; +pub use models::assignment::Assignment; +pub use models::assignment_changeset::{AssignmentChangeset, AssignmentContext}; +pub use models::availability::Availability; +pub use models::availability_assignment_state::AvailabilityAssignmentState; +pub use models::availability_changeset::{ + AvailabilityChangeset, AvailabilityContext, find_free_date_time_slots, +}; +pub use models::clothing::Clothing; +pub use models::event::Event; +pub use models::event_changeset::{EventChangeset, EventContext}; +pub use models::export_event_row::{ExportEventRow, SimpleAssignment}; +pub use models::function::Function; +pub use models::location::Location; +pub use models::password_reset::{NoneToken, PasswordReset, Token}; +pub use models::registration::Registration; +pub use models::role::Role; +pub use models::user::User; +pub use models::user_changeset::UserChangeset; +pub use models::user_funtion::UserFunction; +pub use models::vehicle::Vehicle; +pub use models::vehicle_assignment::VehicleAssignment; diff --git a/web/src/models/area.rs b/db/src/models/area.rs similarity index 100% rename from web/src/models/area.rs rename to db/src/models/area.rs diff --git a/web/src/models/assignment.rs b/db/src/models/assignment.rs similarity index 97% rename from web/src/models/assignment.rs rename to db/src/models/assignment.rs index 8168da08..dd2718de 100644 --- a/web/src/models/assignment.rs +++ b/db/src/models/assignment.rs @@ -1,7 +1,8 @@ use chrono::NaiveDateTime; -use sqlx::{query, PgPool}; +use sqlx::{PgPool, query}; -use super::{assignment_changeset::AssignmentChangeset, Function, Result}; +use super::Result; +use crate::{AssignmentChangeset, Function}; pub struct Assignment { pub event_id: i32, diff --git a/web/src/models/assignment_changeset.rs b/db/src/models/assignment_changeset.rs similarity index 89% rename from web/src/models/assignment_changeset.rs rename to db/src/models/assignment_changeset.rs index 5dfac144..cd5d4084 100644 --- a/web/src/models/assignment_changeset.rs +++ b/db/src/models/assignment_changeset.rs @@ -1,8 +1,9 @@ use chrono::NaiveDateTime; use garde::Validate; -use super::{ - start_date_time_lies_before_end_date_time, Assignment, Availability, Event, Function, UserFunction, +use crate::{ + Assignment, Availability, Event, Function, UserFunction, + models::start_date_time_lies_before_end_date_time, }; #[derive(Validate)] @@ -64,9 +65,7 @@ fn event_has_free_slot_for_function( let list: Vec<&Assignment> = context .assignments_for_event .iter() - .filter(|a| { - a.availability_id != context.availability.id && a.event_id != context.event.id - }) + .filter(|a| a.availability_id != context.availability.id && a.event_id != context.event.id) .collect(); let a = list @@ -93,9 +92,7 @@ fn availability_not_already_assigned( let list: Vec<&Assignment> = context .assignments_for_availability .iter() - .filter(|a| { - a.availability_id != context.availability.id && a.event_id != context.event.id - }) + .filter(|a| a.availability_id != context.availability.id && a.event_id != context.event.id) .collect(); let has_start_time_during_assignment = diff --git a/web/src/models/availability.rs b/db/src/models/availability.rs similarity index 99% rename from web/src/models/availability.rs rename to db/src/models/availability.rs index cd3cc14d..261ff29e 100644 --- a/web/src/models/availability.rs +++ b/db/src/models/availability.rs @@ -1,7 +1,8 @@ use chrono::{NaiveDate, NaiveDateTime}; -use sqlx::{query, PgPool}; +use sqlx::{PgPool, query}; -use super::{Area, AvailabilityChangeset, Result, Role, User, UserFunction}; +use super::Result; +use crate::{Area, AvailabilityChangeset, Role, User, UserFunction}; #[derive(Clone, Debug)] pub struct Availability { diff --git a/web/src/models/availability_assignment_state.rs b/db/src/models/availability_assignment_state.rs similarity index 100% rename from web/src/models/availability_assignment_state.rs rename to db/src/models/availability_assignment_state.rs diff --git a/web/src/models/availability_changeset.rs b/db/src/models/availability_changeset.rs similarity index 100% rename from web/src/models/availability_changeset.rs rename to db/src/models/availability_changeset.rs diff --git a/web/src/models/clothing.rs b/db/src/models/clothing.rs similarity index 100% rename from web/src/models/clothing.rs rename to db/src/models/clothing.rs diff --git a/web/src/models/event.rs b/db/src/models/event.rs similarity index 100% rename from web/src/models/event.rs rename to db/src/models/event.rs diff --git a/web/src/models/event_changeset.rs b/db/src/models/event_changeset.rs similarity index 100% rename from web/src/models/event_changeset.rs rename to db/src/models/event_changeset.rs diff --git a/web/src/models/export_event_row.rs b/db/src/models/export_event_row.rs similarity index 100% rename from web/src/models/export_event_row.rs rename to db/src/models/export_event_row.rs diff --git a/web/src/models/function.rs b/db/src/models/function.rs similarity index 100% rename from web/src/models/function.rs rename to db/src/models/function.rs diff --git a/web/src/models/location.rs b/db/src/models/location.rs similarity index 100% rename from web/src/models/location.rs rename to db/src/models/location.rs diff --git a/db/src/models/mod.rs b/db/src/models/mod.rs new file mode 100644 index 00000000..39e3bbce --- /dev/null +++ b/db/src/models/mod.rs @@ -0,0 +1,35 @@ +pub mod area; +pub mod assignment; +pub mod assignment_changeset; +pub mod availability; +pub mod availability_assignment_state; +pub mod availability_changeset; +pub mod clothing; +pub mod event; +pub mod event_changeset; +pub mod export_event_row; +pub mod function; +pub mod location; +pub mod password_reset; +pub mod registration; +pub mod role; +pub mod user; +pub mod user_changeset; +pub mod user_funtion; +pub mod vehicle; +pub mod vehicle_assignment; + +use chrono::NaiveDateTime; + +type Result = std::result::Result; + +fn start_date_time_lies_before_end_date_time( + value: &(NaiveDateTime, NaiveDateTime), + _context: &T, +) -> garde::Result { + if value.0 >= value.1 { + return Err(garde::Error::new("endtime can't lie before starttime")); + } + + Ok(()) +} diff --git a/web/src/models/password_reset.rs b/db/src/models/password_reset.rs similarity index 100% rename from web/src/models/password_reset.rs rename to db/src/models/password_reset.rs diff --git a/web/src/models/registration.rs b/db/src/models/registration.rs similarity index 100% rename from web/src/models/registration.rs rename to db/src/models/registration.rs diff --git a/web/src/models/role.rs b/db/src/models/role.rs similarity index 100% rename from web/src/models/role.rs rename to db/src/models/role.rs diff --git a/web/src/models/user.rs b/db/src/models/user.rs similarity index 100% rename from web/src/models/user.rs rename to db/src/models/user.rs diff --git a/web/src/models/user_changeset.rs b/db/src/models/user_changeset.rs similarity index 100% rename from web/src/models/user_changeset.rs rename to db/src/models/user_changeset.rs diff --git a/web/src/models/user_funtion.rs b/db/src/models/user_funtion.rs similarity index 100% rename from web/src/models/user_funtion.rs rename to db/src/models/user_funtion.rs diff --git a/web/src/models/vehicle.rs b/db/src/models/vehicle.rs similarity index 100% rename from web/src/models/vehicle.rs rename to db/src/models/vehicle.rs diff --git a/web/src/models/vehicle_assignment.rs b/db/src/models/vehicle_assignment.rs similarity index 100% rename from web/src/models/vehicle_assignment.rs rename to db/src/models/vehicle_assignment.rs diff --git a/web/Cargo.toml b/web/Cargo.toml index da48813d..bc722c41 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -28,6 +28,7 @@ zxcvbn = "3.1.0" thiserror = "2" brass-macros = { path = "../macros" } brass-config = { path = "../config" } +brass-db = { path = "../db" } actix-http = "3.9.0" askama = "0.13.0" garde = { version = "0.22.0", features = ["derive", "email"] } diff --git a/web/src/models/mod.rs b/web/src/models/mod.rs deleted file mode 100644 index 7d1ab438..00000000 --- a/web/src/models/mod.rs +++ /dev/null @@ -1,58 +0,0 @@ -mod area; -mod assignment; -mod assignment_changeset; -mod availability; -mod availability_assignment_state; -mod availability_changeset; -mod clothing; -mod event; -mod event_changeset; -mod export_event_row; -mod function; -mod location; -mod password_reset; -mod registration; -mod role; -mod user; -mod user_changeset; -mod user_funtion; -mod vehicle; -mod vehicle_assignment; - -pub use area::Area; -pub use assignment::Assignment; -pub use assignment_changeset::{AssignmentChangeset, AssignmentContext}; -pub use availability::Availability; -pub use availability_assignment_state::AvailabilityAssignmentState; -pub use availability_changeset::{ - find_free_date_time_slots, AvailabilityChangeset, AvailabilityContext, -}; -pub use clothing::Clothing; -pub use event::Event; -pub use event_changeset::{EventChangeset, EventContext}; -pub use export_event_row::{ExportEventRow, SimpleAssignment}; -pub use function::Function; -pub use location::Location; -pub use password_reset::{NoneToken, PasswordReset, Token}; -pub use registration::Registration; -pub use role::Role; -pub use user::User; -pub use user_changeset::UserChangeset; -pub use user_funtion::UserFunction; -pub use vehicle::Vehicle; -pub use vehicle_assignment::VehicleAssignment; - -use chrono::NaiveDateTime; - -type Result = std::result::Result; - -fn start_date_time_lies_before_end_date_time( - value: &(NaiveDateTime, NaiveDateTime), - _context: &T, -) -> garde::Result { - if value.0 >= value.1 { - return Err(garde::Error::new("endtime can't lie before starttime")); - } - - Ok(()) -}