domain benutzer weiterentwickelt

This commit is contained in:
2026-06-17 21:46:21 +02:00
parent 28ff3bd2bf
commit 2a1c9447f6
17 changed files with 579 additions and 355 deletions

View File

@@ -1,23 +1,30 @@
use std::time::Duration;
// use std::time::Duration;
//
// use anyhow::Error;
// use sqlx::{self, postgres::PgPoolOptions, Executor, Pool, Postgres};
//
// use crate::config;
//
// pub type DB = Pool<Postgres>;
// pub trait Queryer<'c>: Executor<'c, Database = sqlx::Postgres> {}
//
// impl Queryer<'_> for &DB {}
//
// pub async fn connect(database: &config::Database) -> Result<DB, Error> {
// PgPoolOptions::new()
// .max_connections(database.pool_size)
// .max_lifetime(Duration::from_secs(database.max_lifetime))
// .connect(&database.url)
// .await
// .map_err(|err| {
// tracing::error!("{}", err);
// err.into()
// })
// }
use anyhow::Error;
use sqlx::{self, postgres::PgPoolOptions, Executor, Pool, Postgres};
use crate::config;
use sqlx::{self, Executor, Pool, Postgres};
pub type DB = Pool<Postgres>;
pub trait Queryer<'c>: Executor<'c, Database = sqlx::Postgres> {}
impl Queryer<'_> for &DB {}
pub async fn connect(database: &config::Database) -> Result<DB, Error> {
PgPoolOptions::new()
.max_connections(database.pool_size)
.max_lifetime(Duration::from_secs(database.max_lifetime))
.connect(&database.url)
.await
.map_err(|err| {
tracing::error!("{}", err);
err.into()
})
}

View File

@@ -7,8 +7,8 @@ use async_graphql::dataloader::DataLoader;
pub struct LoaderContext {
pub gruppen: DataLoader<GruppenLoader>,
// pub benutzer_rollen: DataLoader<BenutzerRollenLoader>,
pub rollen: DataLoader<RollenLoader>,
// pub benutzer_rollen: DataLoader<BenutzerRollenLoader>,
// pub benutzer_gruppen_kumulativ: DataLoader<BenutzerGruppenKumulativLoader>,
}

View File

@@ -1,12 +1,5 @@
use crate::scalar::{Id, Time, Ulid};
// pub struct Benutzer {
// pub id: Id,
// pub kennung: String,
// pub nachname: String,
// pub vorname: String,
// }
pub struct BenutzerErstellen {
pub benutzer_id: Id,
pub id: Ulid,

View File

@@ -1,8 +1,12 @@
pub mod benutzer;
pub mod benutzer_erstellen_input;
pub mod benutzer_gruppen_ansicht;
pub mod benutzer_loeschen_input;
pub mod benutzer_update_input;
pub use benutzer::Benutzer;
pub use benutzer_erstellen_input::BenutzerErstellenInput;
pub use benutzer_loeschen_input::BenutzerLoeschenInput;
pub use benutzer_update_input::BenutzerUpdateInput;
// pub use benutzer_gruppen_ansicht::GruppeAnsicht;
// pub use benutzer_gruppen_ansicht::Herkunft;

View File

@@ -0,0 +1,9 @@
use async_graphql::InputObject;
use crate::scalar::Ulid;
#[derive(InputObject)]
pub struct BenutzerLoeschenInput {
/// Die Ulid eines Benutzers
pub id: Ulid,
}

View File

@@ -0,0 +1,18 @@
use async_graphql::InputObject;
use crate::scalar::Ulid;
#[derive(InputObject)]
pub struct BenutzerUpdateInput {
/// Die ULID von einem Typ
pub id: Ulid,
/// Die Kennung des Benutzers
pub kennung: Option<String>,
/// Der Vorname des Benutzers
pub vorname: Option<String>,
/// Der Nachname des Benutzers
pub nachname: Option<String>,
}

View File

@@ -1,5 +1,5 @@
use crate::domain::benutzer::{
model::{Benutzer, BenutzerErstellenInput},
model::{Benutzer, BenutzerErstellenInput, BenutzerLoeschenInput, BenutzerUpdateInput},
service::Service,
};
@@ -32,18 +32,26 @@ impl BenutzerMutation {
// let benutzer = Service::new(pool).benutzer_erstellen_viele(&input).await?;
// Ok(benutzer)
// }
//
// async fn update_benutzer(&self, ctx: &Context<'_>, input: BenutzerUpdateInput) -> FieldResult<Benutzer> {
// let pool = ctx.data::<PgPool>()?;
//
// let benutzer = Service::new(pool.clone()).benutzer_update(input).await?;
// Ok(benutzer)
// }
//
// async fn loesche_benutzer(&self, ctx: &Context<'_>, input: BenutzerLoeschenInput) -> FieldResult<Benutzer> {
// let pool = ctx.data::<PgPool>()?.clone();
//
// let benutzer = Service::new(pool).benutzer_loeschen(input).await?;
// Ok(benutzer)
// }
async fn update_benutzer(
&self,
ctx: &Context<'_>,
input: BenutzerUpdateInput,
) -> FieldResult<Benutzer> {
let pool = ctx.data::<PgPool>()?;
let benutzer = Service::new(pool.clone()).benutzer_update(input).await?;
Ok(benutzer)
}
async fn loesche_benutzer(
&self,
ctx: &Context<'_>,
input: BenutzerLoeschenInput,
) -> FieldResult<Benutzer> {
let pool = ctx.data::<PgPool>()?.clone();
let benutzer = Service::new(pool).benutzer_loeschen(input).await?;
Ok(benutzer)
}
}

View File

@@ -14,13 +14,20 @@ impl Repository {
) -> Result<model::Benutzer, Error> {
const QUERY: &str = r#"
UPDATE benutzer
SET kennung = $2, geaendert_am = $3 WHERE id = $1
RETURNING id, typname, erstellt_am, geaendert_am;
SET
kennung = COALESCE($2, kennung),
nachname = COALESCE($3, nachname),
vorname = COALESCE($4, vorname),
geaendert_am = $5
WHERE id = $1
RETURNING id, kennung, nachname, vorname, erstellt_am, geaendert_am;
"#;
let benutzer = sqlx::query_as::<_, model::Benutzer>(QUERY)
.bind(benutzer.id)
.bind(&benutzer.kennung)
.bind(&benutzer.nachname)
.bind(&benutzer.vorname)
.bind(benutzer.geaendert_am)
.fetch_one(db)
.await?;

View File

@@ -1,5 +1,7 @@
mod benutzer_alle;
mod benutzer_erstellen;
mod benutzer_loeschen;
mod benutzer_update;
use super::repository::Repository;
use crate::database::DB;

View File

@@ -0,0 +1,22 @@
use anyhow::Error;
use super::Service;
use crate::domain::benutzer::{
entity,
model::{self, BenutzerLoeschenInput},
};
impl Service {
pub async fn benutzer_loeschen(
&self,
input: BenutzerLoeschenInput,
) -> Result<model::Benutzer, Error> {
let benutzer_loeschen = entity::BenutzerLoeschen { id: input.id };
let typ = self
.repo
.benutzer_loeschen(&self.db, &benutzer_loeschen)
.await?;
Ok(typ)
}
}

View File

@@ -0,0 +1,26 @@
use anyhow::Error;
use chrono::Utc;
use super::Service;
use crate::domain::benutzer::{
entity,
model::{self, BenutzerUpdateInput},
};
impl Service {
pub async fn benutzer_update(
&self,
input: BenutzerUpdateInput,
) -> Result<model::Benutzer, Error> {
let input = entity::BenutzerUpdate {
id: input.id,
kennung: input.kennung,
nachname: input.nachname,
vorname: input.vorname,
geaendert_am: Utc::now(),
};
let output = self.repo.benutzer_update(&self.db, &input).await?;
Ok(output)
}
}

View File

@@ -1,38 +0,0 @@
// use crate::domain::benutzer::{model::Benutzer, model::BenutzerCreateInput, service::Service};
// use async_graphql::{Context, FieldResult};
// use sqlx::postgres::PgPool;
//
// #[derive(Default)]
// pub struct BenutzerMutation;
//
// #[async_graphql::Object]
// impl BenutzerMutation {
// async fn create_benutzer(
// &self,
// ctx: &Context<'_>,
// input: BenutzerCreateInput,
// ) -> FieldResult<Benutzer> {
// let pool = ctx.data::<PgPool>()?;
//
// let r1 = cts.date::<PgPool>();
//
// let row = Service::new(pool.clone()).create_benutzer(input).await?;
//
// Ok(row)
// }
//
// // async fn update_hersteller(
// // &self,
// // ctx: &Context<'_>,
// // input: HerstellerUpdateInput,
// // ) -> FieldResult<Hersteller> {
// // let pool = ctx.data::<PgPool>()?;
// // let row = Hersteller::update(pool, &input).await?;
// // Ok(row)
// // }
//
// // async fn delete_hersteller(&self, ctx: &Context<'_>, id: Id) -> FieldResult<bool> {
// // let pool = ctx.data::<PgPool>()?;
// // Ok(Hersteller::delete(pool, &id).await?)
// // }
// }