eternalfest_services/
user.rs

1use eternalfest_core::auth::AuthContext;
2use eternalfest_core::types::AnyError;
3use eternalfest_core::user::{
4  GetUserOptions, GetUsersOptions, ShortUser, UpdateUserOptions, User, UserId, UserListing, UserStore,
5};
6use std::collections::HashMap;
7use std::sync::Arc;
8
9pub struct UserService<TyUserStore>
10where
11  TyUserStore: UserStore,
12{
13  user_store: TyUserStore,
14}
15
16pub type DynUserService = UserService<Arc<dyn UserStore>>;
17
18impl<TyUserStore> UserService<TyUserStore>
19where
20  TyUserStore: UserStore,
21{
22  pub fn new(user_store: TyUserStore) -> Self {
23    Self { user_store }
24  }
25
26  pub async fn upsert_from_etwin(&self, _acx: &AuthContext, user: &ShortUser) -> Result<User, AnyError> {
27    self.user_store.upsert_from_etwin(user).await
28  }
29
30  pub async fn get_user(&self, _acx: &AuthContext, options: &GetUserOptions) -> Result<User, AnyError> {
31    self.user_store.get_user(options).await
32  }
33
34  pub async fn get_user_ref(&self, _acx: &AuthContext, options: &GetUserOptions) -> Result<ShortUser, AnyError> {
35    self.user_store.get_short_user(options).await
36  }
37
38  pub async fn get_user_refs(
39    &self,
40    _acx: &AuthContext,
41    options: &GetUsersOptions,
42  ) -> Result<HashMap<UserId, ShortUser>, AnyError> {
43    self.user_store.get_short_users(options).await
44  }
45
46  pub async fn get_users(&self, _acx: &AuthContext) -> Result<UserListing, AnyError> {
47    self.user_store.get_users().await
48  }
49
50  pub async fn update_user(&self, acx: &AuthContext, options: &UpdateUserOptions) -> Result<User, AnyError> {
51    let authorized = match acx {
52      AuthContext::System(_) => true,
53      AuthContext::Guest(_) => false,
54      AuthContext::User(ref user) => user.is_administrator,
55    };
56    if !authorized {
57      return Err("Unauthorized".into());
58    }
59    self.user_store.update_user(options).await
60  }
61}
62
63#[cfg(feature = "neon")]
64impl<TyUserStore> neon::prelude::Finalize for UserService<TyUserStore> where TyUserStore: UserStore {}