diff --git a/server/src/domain/types.rs b/server/src/domain/types.rs index 1f498e8..d885f7d 100644 --- a/server/src/domain/types.rs +++ b/server/src/domain/types.rs @@ -11,6 +11,7 @@ use sea_orm::{ use serde::{Deserialize, Serialize}; use strum::{EnumString, IntoStaticStr}; +use super::handler::AttributeSchema; pub use super::model::UserColumn; pub use lldap_auth::types::UserId; @@ -533,6 +534,38 @@ pub struct UserAndGroups { pub groups: Option>, } +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct AttributeValueAndSchema { + pub value: AttributeValue, + pub schema: AttributeSchema, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct UserAndSchema { + pub user: User, + pub schema: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct GroupAndSchema { + pub group: Group, + pub schema: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct GroupDetailsAndSchema { + pub group: GroupDetails, + pub schema: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct UserAndGroupsAndSchema { + pub user: User, + pub user_schema: Vec, + pub group: Option>, + pub group_schema: Vec, +} + #[cfg(test)] mod tests { use super::*; diff --git a/server/src/infra/graphql/query.rs b/server/src/infra/graphql/query.rs index de6bffc..6f1add7 100644 --- a/server/src/infra/graphql/query.rs +++ b/server/src/infra/graphql/query.rs @@ -25,9 +25,14 @@ type DomainRequestFilter = crate::domain::handler::UserRequestFilter; type DomainUser = crate::domain::types::User; type DomainGroup = crate::domain::types::Group; type DomainUserAndGroups = crate::domain::types::UserAndGroups; +type DomainUserAndSchema = crate::domain::types::UserAndSchema; +type DomainGroupAndSchema = crate::domain::types::GroupAndSchema; +type DomainGroupDetailsAndSchema = crate::domain::types::GroupDetailsAndSchema; +type DomainUserAndGroupsAndSchema = crate::domain::types::UserAndGroupsAndSchema; type DomainAttributeList = crate::domain::handler::AttributeList; type DomainAttributeSchema = crate::domain::handler::AttributeSchema; type DomainAttributeValue = crate::domain::types::AttributeValue; +type DomainAttributeValueAndSchema = crate::domain::types::AttributeValueAndSchema; #[derive(PartialEq, Eq, Debug, GraphQLInputObject)] /// A filter for requests, specifying a boolean expression based on field constraints. Only one of @@ -143,11 +148,15 @@ impl Query { &span, "Unauthorized access to user data", ))?; - Ok(handler + let user = handler .get_user_details(&user_id) .instrument(span) - .await - .map(Into::into)?) + .await?; + let schema = self.get_schema(context, span).await?; + return Ok(DomainUserAndSchema { + user, + schema: schema.get_schema().user_attributes.attributes, + }.into()) } async fn users( @@ -237,6 +246,7 @@ impl Query { /// Represents a single user. pub struct User { user: DomainUser, + schema: Vec, _phantom: std::marker::PhantomData>, } @@ -245,6 +255,7 @@ impl Default for User { fn default() -> Self { Self { user: DomainUser::default(), + schema: Vec::default(), _phantom: std::marker::PhantomData, } } @@ -332,19 +343,21 @@ impl User { } } -impl From for User { - fn from(user: DomainUser) -> Self { +impl From for User { + fn from(user: DomainUserAndSchema) -> Self { Self { - user, + user: user.user, + schema: user.schema, _phantom: std::marker::PhantomData, } } } -impl From for User { - fn from(user: DomainUserAndGroups) -> Self { +impl From for User { + fn from(user: DomainUserAndGroupsAndSchema) -> Self { Self { user: user.user, + schema: user.user_schema, _phantom: std::marker::PhantomData, } } @@ -358,6 +371,7 @@ pub struct Group { creation_date: chrono::NaiveDateTime, uuid: String, attributes: Vec, + schema: Vec, members: Option>, _phantom: std::marker::PhantomData>, } @@ -409,29 +423,31 @@ impl Group { } } -impl From for Group { - fn from(group_details: GroupDetails) -> Self { +impl From for Group { + fn from(group_details: DomainGroupDetailsAndSchema) -> Self { Self { - group_id: group_details.group_id.0, - display_name: group_details.display_name.to_string(), - creation_date: group_details.creation_date, - uuid: group_details.uuid.into_string(), - attributes: group_details.attributes, + group_id: group_details.group.group_id.0, + display_name: group_details.group.display_name.to_string(), + creation_date: group_details.group.creation_date, + uuid: group_details.group.uuid.into_string(), + attributes: group_details.group.attributes, members: None, + schema: group_details.schema, _phantom: std::marker::PhantomData, } } } -impl From for Group { - fn from(group: DomainGroup) -> Self { +impl From for Group { + fn from(group: DomainGroupAndSchema) -> Self { Self { - group_id: group.id.0, - display_name: group.display_name.to_string(), - creation_date: group.creation_date, - uuid: group.uuid.into_string(), - attributes: group.attributes, - members: Some(group.users.into_iter().map(UserId::into_string).collect()), + group_id: group.group.id.0, + display_name: group.group.display_name.to_string(), + creation_date: group.group.creation_date, + uuid: group.group.uuid.into_string(), + attributes: group.group.attributes, + members: Some(group.group.users.into_iter().map(UserId::into_string).collect()), + schema: group.schema, _phantom: std::marker::PhantomData, } } @@ -529,6 +545,7 @@ impl From for Schema { #[derive(PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct AttributeValue { attribute: DomainAttributeValue, + schema: DomainAttributeSchema, _phantom: std::marker::PhantomData>, _phantom_extractor: std::marker::PhantomData, } @@ -601,12 +618,13 @@ pub fn serialize_attribute( .ok_or_else(|| FieldError::from(anyhow::anyhow!("Unknown attribute: {}", &attribute.name))) } -impl From +impl From for AttributeValue { - fn from(value: DomainAttributeValue) -> Self { + fn from(value: DomainAttributeValueAndSchema) -> Self { Self { - attribute: value, + attribute: value.value, + schema: value.schema, _phantom: std::marker::PhantomData, _phantom_extractor: std::marker::PhantomData, }