eternalfest_services/
user.rs1use 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 {}