create gruppen, rollen, etc...

This commit is contained in:
Peter Schiwy
2024-12-06 14:06:27 +01:00
parent bfce29c8ee
commit 623d28f77b
63 changed files with 735 additions and 185 deletions

View File

@@ -1,51 +0,0 @@
use async_graphql::dataloader::*;
use async_graphql::*;
use itertools::Itertools;
use std::collections::HashMap;
use std::sync::Arc;
use crate::models::gruppe::Gruppe;
use crate::scalar::Id;
pub struct BenutzerGruppenLoader {
pub pool: sqlx::PgPool,
}
impl Loader<Id> for BenutzerGruppenLoader {
type Value = Vec<Gruppe>;
type Error = Arc<sqlx::Error>;
async fn load(&self, keys: &[Id]) -> Result<HashMap<Id, Self::Value>, Self::Error> {
let rows = sqlx::query!(
r#"
SELECT
bg.benutzer_id,
g.id,
g.gruppenname,
g.erstellt_am,
g.geaendert_am
FROM gruppen AS g
LEFT JOIN benutzer_gruppen AS bg ON g.id = bg.gruppe_id
WHERE bg.benutzer_id = ANY($1);
"#,
keys
)
.fetch_all(&self.pool)
.await?
.into_iter()
.map(|row| {
(
row.benutzer_id,
Gruppe {
id: row.id,
gruppenname: row.gruppenname,
erstellt_am: row.erstellt_am,
geaendert_am: row.geaendert_am,
},
)
})
.into_group_map();
Ok(rows)
}
}

View File

@@ -25,10 +25,10 @@ impl Loader<Id> for BenutzerGruppenKumulativLoader {
g.erstellt_am,
g.geaendert_am,
CASE WHEN br.benutzer_id IS NOT null THEN r.rollenname END AS rollenname,
CASE
WHEN bg.benutzer_id IS NOT NULL AND br.benutzer_id IS NOT NULL THEN 'beides'::gruppen_herkunft
CASE
WHEN bg.benutzer_id IS NOT NULL AND br.benutzer_id IS NOT NULL THEN 'beides'::gruppen_herkunft
WHEN bg.benutzer_id IS NOT NULL THEN 'direkt'::gruppen_herkunft
WHEN br.benutzer_id IS NOT NULL THEN 'indirekt'::gruppen_herkunft
WHEN br.benutzer_id IS NOT NULL THEN 'indirekt'::gruppen_herkunft
END AS "herkunft: Herkunft"
FROM gruppen AS g
LEFT JOIN
@@ -41,11 +41,11 @@ impl Loader<Id> for BenutzerGruppenKumulativLoader {
benutzer_rollen AS br
ON
rg.rolle_id = br.rolle_id
AND br.benutzer_id = ANY($1)
AND br.benutzer_id = ANY($1)
LEFT JOIN rollen AS r ON rg.rolle_id = r.id
WHERE
bg.benutzer_id = ANY($1)
OR br.benutzer_id = ANY($1);
bg.benutzer_id = ANY($1)
OR br.benutzer_id = ANY($1);
"#,
keys
)

View File

@@ -4,7 +4,7 @@ use itertools::Itertools;
use std::collections::HashMap;
use std::sync::Arc;
use crate::models::rolle::Rolle;
use crate::domain::rolle::model::Rolle;
use crate::scalar::Id;
pub struct BenutzerRollenLoader {
@@ -19,11 +19,11 @@ impl Loader<Id> for BenutzerRollenLoader {
let rows = sqlx::query!(
r#"
SELECT
br.benutzer_id,
r.id,
r.rollenname,
r.erstellt_am,
r.geaendert_am
br.benutzer_id,
r.id,
r.rollenname,
r.erstellt_am,
r.geaendert_am
FROM rollen AS r
LEFT JOIN benutzer_rollen AS br ON r.id = br.rolle_id
WHERE br.benutzer_id = ANY($1);

View File

@@ -1,37 +1,27 @@
mod benutzer_gruppen;
mod benutzer_gruppen_kumulativ;
mod benutzer_rollen;
mod rollen_gruppen;
pub use benutzer_gruppen::BenutzerGruppenLoader;
use crate::domain::{
gruppe::dataloader::gruppen::GruppenLoader, rolle::dataloader::rollen::RollenLoader,
};
pub use benutzer_gruppen_kumulativ::BenutzerGruppenKumulativLoader;
pub use benutzer_rollen::BenutzerRollenLoader;
pub use rollen_gruppen::RollenGruppenLoader;
use async_graphql::dataloader::DataLoader;
pub struct LoaderContext {
pub benutzer_gruppen: DataLoader<BenutzerGruppenLoader>,
pub benutzer_rollen: DataLoader<BenutzerRollenLoader>,
pub rollen_gruppen: DataLoader<RollenGruppenLoader>,
pub gruppen: DataLoader<GruppenLoader>,
// pub benutzer_rollen: DataLoader<BenutzerRollenLoader>,
pub rollen: DataLoader<RollenLoader>,
pub benutzer_gruppen_kumulativ: DataLoader<BenutzerGruppenKumulativLoader>,
}
impl LoaderContext {
pub fn new(pool: sqlx::PgPool) -> Self {
Self {
benutzer_gruppen: DataLoader::new(
BenutzerGruppenLoader { pool: pool.clone() },
tokio::spawn,
),
benutzer_rollen: DataLoader::new(
BenutzerRollenLoader { pool: pool.clone() },
tokio::spawn,
),
rollen_gruppen: DataLoader::new(
RollenGruppenLoader { pool: pool.clone() },
tokio::spawn,
),
gruppen: DataLoader::new(GruppenLoader { pool: pool.clone() }, tokio::spawn),
rollen: DataLoader::new(RollenLoader { pool: pool.clone() }, tokio::spawn),
benutzer_gruppen_kumulativ: DataLoader::new(
BenutzerGruppenKumulativLoader { pool: pool.clone() },
tokio::spawn,

View File

@@ -4,7 +4,7 @@ use itertools::Itertools;
use std::collections::HashMap;
use std::sync::Arc;
use crate::models::gruppe::Gruppe;
use crate::domain::gruppe::model::Gruppe;
use crate::scalar::Id;
pub struct RollenGruppenLoader {
@@ -19,11 +19,11 @@ impl Loader<Id> for RollenGruppenLoader {
let rows = sqlx::query!(
r#"
SELECT
rg.rolle_id,
g.id,
g.gruppenname,
g.erstellt_am,
g.geaendert_am
rg.rolle_id,
g.id,
g.gruppenname,
g.erstellt_am,
g.geaendert_am
FROM gruppen AS g
LEFT JOIN rollen_gruppen AS rg ON g.id = rg.gruppe_id
WHERE rg.rolle_id = ANY($1);