1 Commits

Author SHA1 Message Date
Austin Alvarado
a627e69e46 putting a pin in it 2024-01-19 01:37:54 +00:00
2 changed files with 77 additions and 26 deletions

View File

@@ -11,6 +11,7 @@ use sea_orm::{
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use strum::{EnumString, IntoStaticStr}; use strum::{EnumString, IntoStaticStr};
use super::handler::AttributeSchema;
pub use super::model::UserColumn; pub use super::model::UserColumn;
pub use lldap_auth::types::UserId; pub use lldap_auth::types::UserId;
@@ -533,6 +534,38 @@ pub struct UserAndGroups {
pub groups: Option<Vec<GroupDetails>>, pub groups: Option<Vec<GroupDetails>>,
} }
#[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<AttributeSchema>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GroupAndSchema {
pub group: Group,
pub schema: Vec<AttributeSchema>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GroupDetailsAndSchema {
pub group: GroupDetails,
pub schema: Vec<AttributeSchema>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct UserAndGroupsAndSchema {
pub user: User,
pub user_schema: Vec<AttributeSchema>,
pub group: Option<Vec<GroupDetails>>,
pub group_schema: Vec<AttributeSchema>,
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;

View File

@@ -25,9 +25,14 @@ type DomainRequestFilter = crate::domain::handler::UserRequestFilter;
type DomainUser = crate::domain::types::User; type DomainUser = crate::domain::types::User;
type DomainGroup = crate::domain::types::Group; type DomainGroup = crate::domain::types::Group;
type DomainUserAndGroups = crate::domain::types::UserAndGroups; 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 DomainAttributeList = crate::domain::handler::AttributeList;
type DomainAttributeSchema = crate::domain::handler::AttributeSchema; type DomainAttributeSchema = crate::domain::handler::AttributeSchema;
type DomainAttributeValue = crate::domain::types::AttributeValue; type DomainAttributeValue = crate::domain::types::AttributeValue;
type DomainAttributeValueAndSchema = crate::domain::types::AttributeValueAndSchema;
#[derive(PartialEq, Eq, Debug, GraphQLInputObject)] #[derive(PartialEq, Eq, Debug, GraphQLInputObject)]
/// A filter for requests, specifying a boolean expression based on field constraints. Only one of /// A filter for requests, specifying a boolean expression based on field constraints. Only one of
@@ -143,11 +148,15 @@ impl<Handler: BackendHandler> Query<Handler> {
&span, &span,
"Unauthorized access to user data", "Unauthorized access to user data",
))?; ))?;
Ok(handler let user = handler
.get_user_details(&user_id) .get_user_details(&user_id)
.instrument(span) .instrument(span)
.await .await?;
.map(Into::into)?) let schema = self.get_schema(context, span).await?;
return Ok(DomainUserAndSchema {
user,
schema: schema.get_schema().user_attributes.attributes,
}.into())
} }
async fn users( async fn users(
@@ -237,6 +246,7 @@ impl<Handler: BackendHandler> Query<Handler> {
/// Represents a single user. /// Represents a single user.
pub struct User<Handler: BackendHandler> { pub struct User<Handler: BackendHandler> {
user: DomainUser, user: DomainUser,
schema: Vec<DomainAttributeSchema>,
_phantom: std::marker::PhantomData<Box<Handler>>, _phantom: std::marker::PhantomData<Box<Handler>>,
} }
@@ -245,6 +255,7 @@ impl<Handler: BackendHandler> Default for User<Handler> {
fn default() -> Self { fn default() -> Self {
Self { Self {
user: DomainUser::default(), user: DomainUser::default(),
schema: Vec::default(),
_phantom: std::marker::PhantomData, _phantom: std::marker::PhantomData,
} }
} }
@@ -332,19 +343,21 @@ impl<Handler: BackendHandler> User<Handler> {
} }
} }
impl<Handler: BackendHandler> From<DomainUser> for User<Handler> { impl<Handler: BackendHandler> From<DomainUserAndSchema> for User<Handler> {
fn from(user: DomainUser) -> Self { fn from(user: DomainUserAndSchema) -> Self {
Self { Self {
user, user: user.user,
schema: user.schema,
_phantom: std::marker::PhantomData, _phantom: std::marker::PhantomData,
} }
} }
} }
impl<Handler: BackendHandler> From<DomainUserAndGroups> for User<Handler> { impl<Handler: BackendHandler> From<DomainUserAndGroupsAndSchema> for User<Handler> {
fn from(user: DomainUserAndGroups) -> Self { fn from(user: DomainUserAndGroupsAndSchema) -> Self {
Self { Self {
user: user.user, user: user.user,
schema: user.user_schema,
_phantom: std::marker::PhantomData, _phantom: std::marker::PhantomData,
} }
} }
@@ -358,6 +371,7 @@ pub struct Group<Handler: BackendHandler> {
creation_date: chrono::NaiveDateTime, creation_date: chrono::NaiveDateTime,
uuid: String, uuid: String,
attributes: Vec<DomainAttributeValue>, attributes: Vec<DomainAttributeValue>,
schema: Vec<DomainAttributeSchema>,
members: Option<Vec<String>>, members: Option<Vec<String>>,
_phantom: std::marker::PhantomData<Box<Handler>>, _phantom: std::marker::PhantomData<Box<Handler>>,
} }
@@ -409,29 +423,31 @@ impl<Handler: BackendHandler> Group<Handler> {
} }
} }
impl<Handler: BackendHandler> From<GroupDetails> for Group<Handler> { impl<Handler: BackendHandler> From<DomainGroupDetailsAndSchema> for Group<Handler> {
fn from(group_details: GroupDetails) -> Self { fn from(group_details: DomainGroupDetailsAndSchema) -> Self {
Self { Self {
group_id: group_details.group_id.0, group_id: group_details.group.group_id.0,
display_name: group_details.display_name.to_string(), display_name: group_details.group.display_name.to_string(),
creation_date: group_details.creation_date, creation_date: group_details.group.creation_date,
uuid: group_details.uuid.into_string(), uuid: group_details.group.uuid.into_string(),
attributes: group_details.attributes, attributes: group_details.group.attributes,
members: None, members: None,
schema: group_details.schema,
_phantom: std::marker::PhantomData, _phantom: std::marker::PhantomData,
} }
} }
} }
impl<Handler: BackendHandler> From<DomainGroup> for Group<Handler> { impl<Handler: BackendHandler> From<DomainGroupAndSchema> for Group<Handler> {
fn from(group: DomainGroup) -> Self { fn from(group: DomainGroupAndSchema) -> Self {
Self { Self {
group_id: group.id.0, group_id: group.group.id.0,
display_name: group.display_name.to_string(), display_name: group.group.display_name.to_string(),
creation_date: group.creation_date, creation_date: group.group.creation_date,
uuid: group.uuid.into_string(), uuid: group.group.uuid.into_string(),
attributes: group.attributes, attributes: group.group.attributes,
members: Some(group.users.into_iter().map(UserId::into_string).collect()), members: Some(group.group.users.into_iter().map(UserId::into_string).collect()),
schema: group.schema,
_phantom: std::marker::PhantomData, _phantom: std::marker::PhantomData,
} }
} }
@@ -529,6 +545,7 @@ impl<Handler: BackendHandler> From<PublicSchema> for Schema<Handler> {
#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)] #[derive(PartialEq, Eq, Debug, Serialize, Deserialize)]
pub struct AttributeValue<Handler: BackendHandler, Extractor> { pub struct AttributeValue<Handler: BackendHandler, Extractor> {
attribute: DomainAttributeValue, attribute: DomainAttributeValue,
schema: DomainAttributeSchema,
_phantom: std::marker::PhantomData<Box<Handler>>, _phantom: std::marker::PhantomData<Box<Handler>>,
_phantom_extractor: std::marker::PhantomData<Extractor>, _phantom_extractor: std::marker::PhantomData<Extractor>,
} }
@@ -601,12 +618,13 @@ pub fn serialize_attribute(
.ok_or_else(|| FieldError::from(anyhow::anyhow!("Unknown attribute: {}", &attribute.name))) .ok_or_else(|| FieldError::from(anyhow::anyhow!("Unknown attribute: {}", &attribute.name)))
} }
impl<Handler: BackendHandler, Extractor> From<DomainAttributeValue> impl<Handler: BackendHandler, Extractor> From<DomainAttributeValueAndSchema>
for AttributeValue<Handler, Extractor> for AttributeValue<Handler, Extractor>
{ {
fn from(value: DomainAttributeValue) -> Self { fn from(value: DomainAttributeValueAndSchema) -> Self {
Self { Self {
attribute: value, attribute: value.value,
schema: value.schema,
_phantom: std::marker::PhantomData, _phantom: std::marker::PhantomData,
_phantom_extractor: std::marker::PhantomData, _phantom_extractor: std::marker::PhantomData,
} }