samling 0.13.1

App for managing apparel collections
Documentation
use axum::{
    extract::{FromRequestParts, Query},
    RequestPartsExt,
};
use http::request::Parts;
use itertools::Itertools;
use samling_clorinde::client::GenericClient;
use schemars::JsonSchema;
use serde::Deserialize;

use crate::{Error, Group, Id, Organization, Ref, RefTarget, Result, Role};

#[derive(Debug, Clone, Deserialize, JsonSchema, Default)]
#[serde(default)]
pub struct UserFilters {
    pub roles: Option<Vec<Role>>,
    pub groups: Option<Vec<Ref<Group>>>,
}

impl UserFilters {
    pub(crate) async fn group_ids(
        &self,
        client: &impl GenericClient,
        organization_id: Id<Organization>,
    ) -> Result<Option<Vec<Id<Group>>>> {
        if let Some(refs) = self.groups.clone() {
            Ok(Some(
                Group::lookup_ids(client, organization_id, &refs)
                    .await?
                    .into_iter()
                    .flatten()
                    .collect_vec(),
            ))
        } else {
            Ok(None)
        }
    }
}

impl<S> FromRequestParts<S> for UserFilters
where
    S: Send + Sync,
{
    type Rejection = Error;

    async fn from_request_parts(parts: &mut Parts, _state: &S) -> Result<Self> {
        let filters = parts.extract::<Query<UserFilters>>().await?.0;
        Ok(filters)
    }
}