domain benutzer weiterentwickelt
This commit is contained in:
@@ -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()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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>,
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
9
src/domain/benutzer/model/benutzer_loeschen_input.rs
Normal file
9
src/domain/benutzer/model/benutzer_loeschen_input.rs
Normal 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,
|
||||
}
|
||||
18
src/domain/benutzer/model/benutzer_update_input.rs
Normal file
18
src/domain/benutzer/model/benutzer_update_input.rs
Normal 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>,
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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?;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
mod benutzer_alle;
|
||||
mod benutzer_erstellen;
|
||||
mod benutzer_loeschen;
|
||||
mod benutzer_update;
|
||||
|
||||
use super::repository::Repository;
|
||||
use crate::database::DB;
|
||||
|
||||
22
src/domain/benutzer/service/benutzer_loeschen.rs
Normal file
22
src/domain/benutzer/service/benutzer_loeschen.rs
Normal 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)
|
||||
}
|
||||
}
|
||||
26
src/domain/benutzer/service/benutzer_update.rs
Normal file
26
src/domain/benutzer/service/benutzer_update.rs
Normal 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)
|
||||
}
|
||||
}
|
||||
@@ -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?)
|
||||
// // }
|
||||
// }
|
||||
Reference in New Issue
Block a user