From b5182b7f19dae077899acc63dce7a8d7f41fc052 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 6 Jun 2026 11:59:20 +0200 Subject: [PATCH] refactor Ulid und Dataloader --- migrations/20240530183519_init.down.sql | 4 +- migrations/20240530183519_init.up.sql | 4 +- migrations/20240530193528_hersteller.up.sql | 2 +- migrations/20240621222501_gruppen.up.sql | 3 +- migrations/20240621222504_rollen.up.sql | 3 +- .../20240621223132_rollen_gruppen.up.sql | 4 +- migrations/20241128220001_benutzer.up.sql | 3 +- .../20241128220014_benutzer_gruppen.up.sql | 4 +- .../20241128220018_benutzer_rollen.up.sql | 4 +- migrations/20260528200947_struktur.down.sql | 1 + migrations/20260528200947_struktur.up.sql | 8 ++ src/domain.rs | 2 +- src/domain/benutzer/model/benutzer.rs | 6 +- .../benutzer/model/benutzer_create_input.rs | 7 +- .../model/benutzer_gruppen_ansicht.rs | 4 +- src/domain/gruppe/dataloader/gruppen.rs | 6 +- src/domain/gruppe/entity.rs | 6 +- src/domain/gruppe/entity/gruppe.rs | 32 ++++++-- src/domain/gruppe/model/gruppe.rs | 4 +- .../gruppe/model/gruppe_loeschen_input.rs | 6 +- .../gruppe/model/gruppe_update_input.rs | 6 +- .../gruppe/repository/gruppe_dataloader.rs | 73 ++++++++++--------- .../gruppe/repository/gruppe_erstellen.rs | 11 +-- .../gruppe/repository/gruppe_loeschen.rs | 2 +- src/domain/gruppe/repository/gruppe_update.rs | 4 +- .../gruppe/service/gruppe_dataloader.rs | 6 +- src/domain/gruppe/service/gruppe_erstellen.rs | 24 +++--- src/domain/gruppe/service/gruppe_loeschen.rs | 8 +- src/domain/gruppe/service/gruppe_update.rs | 8 +- src/domain/rolle/dataloader/rollen.rs | 44 ++--------- src/domain/rolle/entity.rs | 6 +- src/domain/rolle/entity/rolle.rs | 32 ++++++-- src/domain/rolle/model/rolle.rs | 6 +- .../rolle/model/rolle_loeschen_input.rs | 6 +- src/domain/rolle/model/rolle_update_input.rs | 6 +- src/domain/rolle/queries/rolle.rs | 9 +-- src/domain/rolle/repository.rs | 4 +- src/domain/rolle/repository/rolle_alle.rs | 17 +++++ .../rolle/repository/rolle_dataloader.rs | 55 ++++++++++++++ .../rolle/repository/rolle_erstellen.rs | 11 +-- src/domain/rolle/repository/rolle_loeschen.rs | 2 +- src/domain/rolle/repository/rolle_update.rs | 2 +- .../rolle/repository/rollen_dataloader.rs | 49 ------------- src/domain/rolle/service.rs | 2 + src/domain/rolle/service/rolle_alle.rs | 12 +++ src/domain/rolle/service/rolle_dataloader.rs | 15 ++++ src/domain/rolle/service/rolle_erstellen.rs | 19 +++-- src/domain/rolle/service/rolle_loeschen.rs | 7 +- src/domain/rolle/service/rolle_update.rs | 5 +- src/domain/typ/entity.rs | 1 - src/models/hersteller.rs | 19 +++-- src/mutations/mod.rs | 4 +- src/queries/mod.rs | 9 ++- src/scalar.rs | 68 ++++------------- 54 files changed, 364 insertions(+), 301 deletions(-) create mode 100644 migrations/20260528200947_struktur.down.sql create mode 100644 migrations/20260528200947_struktur.up.sql create mode 100644 src/domain/rolle/repository/rolle_alle.rs create mode 100644 src/domain/rolle/repository/rolle_dataloader.rs delete mode 100644 src/domain/rolle/repository/rollen_dataloader.rs create mode 100644 src/domain/rolle/service/rolle_alle.rs create mode 100644 src/domain/rolle/service/rolle_dataloader.rs diff --git a/migrations/20240530183519_init.down.sql b/migrations/20240530183519_init.down.sql index b3180c1..927abf1 100644 --- a/migrations/20240530183519_init.down.sql +++ b/migrations/20240530183519_init.down.sql @@ -1 +1,3 @@ -DROP DOMAIN ULID CASCADE; +DROP DOMAIN ulid CASCADE; +DROP EXTENSION IF EXISTS ltree; +DROP EXTENSION IF EXISTS "uuid-ossp"; diff --git a/migrations/20240530183519_init.up.sql b/migrations/20240530183519_init.up.sql index 7376d6c..c8820b9 100644 --- a/migrations/20240530183519_init.up.sql +++ b/migrations/20240530183519_init.up.sql @@ -1 +1,3 @@ -CREATE DOMAIN ULID AS CHAR(26); +CREATE DOMAIN ulid AS CHAR(26); +CREATE EXTENSION IF NOT EXISTS ltree; +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; diff --git a/migrations/20240530193528_hersteller.up.sql b/migrations/20240530193528_hersteller.up.sql index 3f31597..bc1e778 100644 --- a/migrations/20240530193528_hersteller.up.sql +++ b/migrations/20240530193528_hersteller.up.sql @@ -1,6 +1,6 @@ CREATE TABLE IF NOT EXISTS hersteller ( hersteller_id UUID PRIMARY KEY, - id CHAR(26) UNIQUE NOT NULL, + id ULID UNIQUE NOT NULL, herstellername VARCHAR NOT NULL, erstellt_am TIMESTAMP WITH TIME ZONE NOT NULL, geaendert_am TIMESTAMP WITH TIME ZONE NOT NULL diff --git a/migrations/20240621222501_gruppen.up.sql b/migrations/20240621222501_gruppen.up.sql index 196dac2..5f79c4a 100644 --- a/migrations/20240621222501_gruppen.up.sql +++ b/migrations/20240621222501_gruppen.up.sql @@ -1,5 +1,6 @@ CREATE TABLE IF NOT EXISTS gruppen ( - id UUID PRIMARY KEY, + gruppe_id UUID PRIMARY KEY, + id ULID UNIQUE NOT NULL, gruppenname VARCHAR NOT NULL, erstellt_am TIMESTAMP WITH TIME ZONE NOT NULL, geaendert_am TIMESTAMP WITH TIME ZONE NOT NULL diff --git a/migrations/20240621222504_rollen.up.sql b/migrations/20240621222504_rollen.up.sql index 2612074..e7ecb1d 100644 --- a/migrations/20240621222504_rollen.up.sql +++ b/migrations/20240621222504_rollen.up.sql @@ -1,5 +1,6 @@ CREATE TABLE IF NOT EXISTS rollen ( - id UUID PRIMARY KEY, + rolle_id UUID PRIMARY KEY, + id ULID UNIQUE NOT NULL, rollenname VARCHAR NOT NULL, erstellt_am TIMESTAMP WITH TIME ZONE NOT NULL, geaendert_am TIMESTAMP WITH TIME ZONE NOT NULL diff --git a/migrations/20240621223132_rollen_gruppen.up.sql b/migrations/20240621223132_rollen_gruppen.up.sql index 1444497..2f6b4ef 100644 --- a/migrations/20240621223132_rollen_gruppen.up.sql +++ b/migrations/20240621223132_rollen_gruppen.up.sql @@ -5,12 +5,12 @@ CREATE TABLE IF NOT EXISTS rollen_gruppen ( CONSTRAINT pk_rollen_gruppen PRIMARY KEY (rolle_id, gruppe_id), CONSTRAINT fk_rollen_gruppen_gruppe FOREIGN KEY (gruppe_id) - REFERENCES gruppen (id) MATCH SIMPLE + REFERENCES gruppen (gruppe_id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT fk_rollen_gruppen_rolle FOREIGN KEY (rolle_id) - REFERENCES rollen (id) MATCH SIMPLE + REFERENCES rollen (rolle_id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE ) diff --git a/migrations/20241128220001_benutzer.up.sql b/migrations/20241128220001_benutzer.up.sql index 3dc9f1a..4b5be59 100644 --- a/migrations/20241128220001_benutzer.up.sql +++ b/migrations/20241128220001_benutzer.up.sql @@ -1,5 +1,6 @@ CREATE TABLE IF NOT EXISTS benutzer ( - id UUID PRIMARY KEY, + benutzer_id UUID PRIMARY KEY, + id ULID UNIQUE NOT NULL, kennung VARCHAR NOT NULL, nachname VARCHAR NOT NULL, vorname VARCHAR NOT NULL, diff --git a/migrations/20241128220014_benutzer_gruppen.up.sql b/migrations/20241128220014_benutzer_gruppen.up.sql index 64dd843..c6aeca2 100644 --- a/migrations/20241128220014_benutzer_gruppen.up.sql +++ b/migrations/20241128220014_benutzer_gruppen.up.sql @@ -5,12 +5,12 @@ CREATE TABLE IF NOT EXISTS benutzer_gruppen ( CONSTRAINT pk_benutzer_gruppen PRIMARY KEY (benutzer_id, gruppe_id), CONSTRAINT fk_benutzer_gruppen_benutzer FOREIGN KEY (benutzer_id) - REFERENCES benutzer (id) MATCH SIMPLE + REFERENCES benutzer (benutzer_id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT fk_benutzer_gruppen_gruppe FOREIGN KEY (gruppe_id) - REFERENCES gruppen (id) MATCH SIMPLE + REFERENCES gruppen (gruppe_id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE ) diff --git a/migrations/20241128220018_benutzer_rollen.up.sql b/migrations/20241128220018_benutzer_rollen.up.sql index 7e7cdc0..3b98a48 100644 --- a/migrations/20241128220018_benutzer_rollen.up.sql +++ b/migrations/20241128220018_benutzer_rollen.up.sql @@ -5,12 +5,12 @@ CREATE TABLE IF NOT EXISTS benutzer_rollen ( CONSTRAINT pk_benutzer_rollen PRIMARY KEY (benutzer_id, rolle_id), CONSTRAINT fk_benutzer_rollen_benutzer FOREIGN KEY (benutzer_id) - REFERENCES benutzer (id) MATCH SIMPLE + REFERENCES benutzer (benutzer_id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT fk_benutzer_rollen_rolle FOREIGN KEY (rolle_id) - REFERENCES rollen (id) MATCH SIMPLE + REFERENCES rollen (rolle_id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE ) diff --git a/migrations/20260528200947_struktur.down.sql b/migrations/20260528200947_struktur.down.sql new file mode 100644 index 0000000..9b1b2b6 --- /dev/null +++ b/migrations/20260528200947_struktur.down.sql @@ -0,0 +1 @@ +DROP TABLE struktur; diff --git a/migrations/20260528200947_struktur.up.sql b/migrations/20260528200947_struktur.up.sql new file mode 100644 index 0000000..c128f1d --- /dev/null +++ b/migrations/20260528200947_struktur.up.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS strukturen ( + id UUID PRIMARY KEY, + parent_id UUID REFERENCES strukturen (id), + dienststelle VARCHAR NOT NULL, + dienststelle_abk VARCHAR NOT NULL, + slug TEXT NOT NULL, + pfad LTREE +); diff --git a/src/domain.rs b/src/domain.rs index 51f5645..5474880 100644 --- a/src/domain.rs +++ b/src/domain.rs @@ -1,4 +1,4 @@ -pub mod benutzer; +// pub mod benutzer; pub mod gruppe; pub mod liegenschaft; pub mod rolle; diff --git a/src/domain/benutzer/model/benutzer.rs b/src/domain/benutzer/model/benutzer.rs index 16fa8dc..de67d55 100644 --- a/src/domain/benutzer/model/benutzer.rs +++ b/src/domain/benutzer/model/benutzer.rs @@ -3,14 +3,14 @@ use async_graphql::{ComplexObject, Context, FieldResult, SimpleObject}; use crate::{ dataloader::LoaderContext, domain::{gruppe::model::Gruppe, rolle::model::Rolle}, - scalar::Id, + scalar::Ulid, }; #[derive(sqlx::FromRow, SimpleObject)] #[graphql(complex)] pub struct Benutzer { - /// Die UUID eines Benutzers - pub id: Id, + /// Die ULid eines Benutzers + pub id: Ulid, /// Die Kennung des Benutzers pub kennung: String, diff --git a/src/domain/benutzer/model/benutzer_create_input.rs b/src/domain/benutzer/model/benutzer_create_input.rs index 3cf69d7..44c9f01 100644 --- a/src/domain/benutzer/model/benutzer_create_input.rs +++ b/src/domain/benutzer/model/benutzer_create_input.rs @@ -1,12 +1,13 @@ -use crate::scalar::Id; use async_graphql::InputObject; +use crate::scalar::Ulid; + #[derive(InputObject)] pub struct BenutzerCreateInput { // #[graphql(validator(min_length = 6, max_length = 8))] pub kennung: String, pub vorname: String, pub nachname: String, - pub rollen: Option>, - pub gruppen: Option>, + pub rollen: Option>, + pub gruppen: Option>, } diff --git a/src/domain/benutzer/model/benutzer_gruppen_ansicht.rs b/src/domain/benutzer/model/benutzer_gruppen_ansicht.rs index 273cc29..0ed7eaf 100644 --- a/src/domain/benutzer/model/benutzer_gruppen_ansicht.rs +++ b/src/domain/benutzer/model/benutzer_gruppen_ansicht.rs @@ -1,7 +1,7 @@ use async_graphql::{ComplexObject, Enum, SimpleObject}; use sqlx::Type; -use crate::scalar::{Id, Time}; +use crate::scalar::{Time, Ulid}; /// Aus welcher Quelle die Gruppe stammt. #[derive(Enum, Clone, Debug, Eq, Copy, PartialEq, Type)] @@ -21,7 +21,7 @@ pub enum Herkunft { #[graphql(complex)] pub struct GruppeAnsicht { /// Die UUID einer Gruppe - pub id: Id, + pub id: Ulid, /// Der Gruppenname pub gruppenname: String, diff --git a/src/domain/gruppe/dataloader/gruppen.rs b/src/domain/gruppe/dataloader/gruppen.rs index ee6600f..1498b3d 100644 --- a/src/domain/gruppe/dataloader/gruppen.rs +++ b/src/domain/gruppe/dataloader/gruppen.rs @@ -5,17 +5,17 @@ use std::sync::Arc; use crate::domain::gruppe::model::Gruppe; use crate::domain::gruppe::service::Service; -use crate::scalar::Id; +use crate::scalar::Ulid; pub struct GruppenLoader { pub pool: sqlx::PgPool, } -impl Loader for GruppenLoader { +impl Loader for GruppenLoader { type Value = Vec; type Error = Arc; - async fn load(&self, keys: &[Id]) -> Result, Self::Error> { + async fn load(&self, keys: &[Ulid]) -> Result, Self::Error> { let rows = Service::new(self.pool.clone()) .gruppe_dataloader(keys) .await?; diff --git a/src/domain/gruppe/entity.rs b/src/domain/gruppe/entity.rs index f351ba0..1dc20fd 100644 --- a/src/domain/gruppe/entity.rs +++ b/src/domain/gruppe/entity.rs @@ -1,2 +1,6 @@ pub mod gruppe; -pub use gruppe::Gruppe; + +pub use gruppe::GruppeDataloader; +pub use gruppe::GruppeErstellen; +pub use gruppe::GruppeLoeschen; +pub use gruppe::GruppeUpdate; diff --git a/src/domain/gruppe/entity/gruppe.rs b/src/domain/gruppe/entity/gruppe.rs index a6b4678..4e1761b 100644 --- a/src/domain/gruppe/entity/gruppe.rs +++ b/src/domain/gruppe/entity/gruppe.rs @@ -1,8 +1,30 @@ -use crate::scalar::{Id, Time}; +use sqlx::FromRow; -pub struct Gruppe { - pub id: Id, +use crate::scalar::{Id, Time, Ulid}; + +pub struct GruppeErstellen { + pub gruppe_id: Id, + pub id: Ulid, pub gruppenname: String, - pub erstellt_am: Option