portfu_admin 1.3.3

Library of Admin tools build on toip of Portfu
Documentation
use crate::stores::DataStore;
use crate::users::User;
use crate::UserStore;
use portfu::macros::get;
use portfu::pfcore::ServiceRegister;
use portfu::prelude::http::Extensions;
use portfu::prelude::log::warn;
use portfu::prelude::{ServiceData, ServiceGroup, ServiceRegistry};
use std::io::{Error, ErrorKind};
use std::marker::PhantomData;
use std::sync::Arc;

#[get("/pf_admin/users")]
pub async fn list_users<D: DataStore<i64, User, Error> + Send + Sync + 'static>(
    data: &mut ServiceData,
) -> Result<Vec<u8>, Error> {
    let user_store: Option<Arc<D>> = data.request.get().cloned();
    if let Some(user_store) = user_store {
        let to_serial = user_store.get_all().await?;
        serde_json::to_vec(&to_serial).map_err(|e| {
            Error::new(
                ErrorKind::InvalidData,
                format!("Failed to Convert to JSON: {e:?}"),
            )
        })
    } else {
        warn!("Failed to find UserStore");
        Ok(vec![])
    }
}

pub struct UserManager<D: UserStore> {
    service_group: ServiceGroup,
    _phantom_data: PhantomData<D>,
}
impl<D: UserStore> Default for UserManager<D> {
    fn default() -> Self {
        Self {
            service_group: ServiceGroup::default().service(list_users::<D>::default()),
            _phantom_data: Default::default(),
        }
    }
}
impl<D: UserStore> ServiceRegister for UserManager<D> {
    fn register(self, service_registry: &mut ServiceRegistry, shared_state: Extensions) {
        self.service_group.register(service_registry, shared_state);
    }
}
impl<D: UserStore> From<UserManager<D>> for ServiceGroup {
    fn from(value: UserManager<D>) -> Self {
        value.service_group
    }
}