| 
									
										
										
										
											2025-03-12 12:32:15 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * authservice process/profile.rs
 | 
					
						
							|  |  |  |  * - "customization-related" request functions
 | 
					
						
							|  |  |  |  *
 | 
					
						
							|  |  |  |  * Copyright (C) 2025 Real Microsoft, LLC
 | 
					
						
							|  |  |  |  *
 | 
					
						
							|  |  |  |  * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3.
 | 
					
						
							|  |  |  |  *
 | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
 | 
					
						
							|  |  |  |  *
 | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
 | 
					
						
							|  |  |  | */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use asklyphe_common::nats::authservice::{AuthError, AuthResponse};
 | 
					
						
							|  |  |  | use asklyphe_common::nats::authservice::profile::{ThemeChangeRequest, ThemeChangeResponse, UserInfo, UserInfoRequest, UserInfoResponse};
 | 
					
						
							|  |  |  | use sea_orm::DatabaseConnection;
 | 
					
						
							| 
									
										
										
										
											2025-03-18 16:55:58 -07:00
										 |  |  | use asklyphe_common::nats::authservice::deranklist::{DerankEntry, UserFetchActiveDeranksRequest, UserFetchActiveDeranksResponse};
 | 
					
						
							|  |  |  | use crate::db::{deranklist, session, user, usersettings};
 | 
					
						
							| 
									
										
										
										
											2025-03-12 12:32:15 -07:00
										 |  |  | use crate::db::session::FetchSessionError;
 | 
					
						
							|  |  |  | use crate::db::user::FetchUserError;
 | 
					
						
							|  |  |  | use crate::db::usersettings::{FetchUserSettingsError, UserSettings};
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | pub async fn user_info(db: &DatabaseConnection, request: UserInfoRequest) -> UserInfoResponse {
 | 
					
						
							|  |  |  |     let uid = match session::get_userid_from_session(db, request.token, true).await {
 | 
					
						
							|  |  |  |         Ok(u) => u,
 | 
					
						
							|  |  |  |         Err(e) => {
 | 
					
						
							|  |  |  |             return match e {
 | 
					
						
							|  |  |  |                 FetchSessionError::SessionInvalid => {
 | 
					
						
							|  |  |  |                     UserInfoResponse::TokenExpired
 | 
					
						
							|  |  |  |                 }
 | 
					
						
							|  |  |  |                 FetchSessionError::SessionDoesntExist => {
 | 
					
						
							|  |  |  |                     UserInfoResponse::TokenInvalid
 | 
					
						
							|  |  |  |                 }
 | 
					
						
							|  |  |  |                 FetchSessionError::DatabaseError => {
 | 
					
						
							|  |  |  |                     UserInfoResponse::InternalServerError("database error while querying user id".to_string())
 | 
					
						
							|  |  |  |                 }
 | 
					
						
							|  |  |  |             };
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     };
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let user_info = match user::user_info(db, uid.clone()).await {
 | 
					
						
							|  |  |  |         Ok(u) => u,
 | 
					
						
							|  |  |  |         Err(e) => return match e {
 | 
					
						
							|  |  |  |             FetchUserError::UserNotFound => {
 | 
					
						
							|  |  |  |                 UserInfoResponse::TokenInvalid
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             FetchUserError::DatabaseError => {
 | 
					
						
							|  |  |  |                 UserInfoResponse::InternalServerError("database error while querying user id".to_string())
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     };
 | 
					
						
							|  |  |  |     
 | 
					
						
							|  |  |  |     let user_settings = match usersettings::get_or_create_default_user_settings(db, uid).await {
 | 
					
						
							|  |  |  |         Ok(u) => u,
 | 
					
						
							|  |  |  |         Err(e) => return match e {
 | 
					
						
							|  |  |  |             FetchUserSettingsError::UserNotFound => {
 | 
					
						
							|  |  |  |                 UserInfoResponse::InternalServerError("database error while querying user id".to_string())
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             FetchUserSettingsError::DatabaseError => {
 | 
					
						
							|  |  |  |                 UserInfoResponse::InternalServerError("database error while querying user id".to_string())
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     };
 | 
					
						
							|  |  |  |     
 | 
					
						
							|  |  |  |     UserInfoResponse::Success(UserInfo {
 | 
					
						
							|  |  |  |         username: user_info.username,
 | 
					
						
							|  |  |  |         email: user_info.email,
 | 
					
						
							|  |  |  |         new_email: user_info.new_email,
 | 
					
						
							|  |  |  |         theme: user_settings.theme,
 | 
					
						
							|  |  |  |         administrator: user_info.admin,
 | 
					
						
							|  |  |  |     })
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | pub async fn change_theme(db: &DatabaseConnection, request: ThemeChangeRequest) -> ThemeChangeResponse {
 | 
					
						
							|  |  |  |     let uid = match session::get_userid_from_session(db, request.token, true).await {
 | 
					
						
							|  |  |  |         Ok(u) => u,
 | 
					
						
							|  |  |  |         Err(e) => {
 | 
					
						
							|  |  |  |             return match e {
 | 
					
						
							|  |  |  |                 FetchSessionError::SessionInvalid => {
 | 
					
						
							|  |  |  |                     ThemeChangeResponse::Logout
 | 
					
						
							|  |  |  |                 }
 | 
					
						
							|  |  |  |                 FetchSessionError::SessionDoesntExist => {
 | 
					
						
							|  |  |  |                     ThemeChangeResponse::Logout
 | 
					
						
							|  |  |  |                 }
 | 
					
						
							|  |  |  |                 FetchSessionError::DatabaseError => {
 | 
					
						
							|  |  |  |                     ThemeChangeResponse::InternalServerError
 | 
					
						
							|  |  |  |                 }
 | 
					
						
							|  |  |  |             };
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     };
 | 
					
						
							|  |  |  |     match usersettings::set_theme(db, uid, request.theme).await {
 | 
					
						
							|  |  |  |         Ok(_) => {
 | 
					
						
							|  |  |  |             ThemeChangeResponse::Success
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         Err(e) => {
 | 
					
						
							|  |  |  |             match e {
 | 
					
						
							|  |  |  |                 FetchUserSettingsError::UserNotFound => {
 | 
					
						
							|  |  |  |                     ThemeChangeResponse::Logout
 | 
					
						
							|  |  |  |                 }
 | 
					
						
							|  |  |  |                 FetchUserSettingsError::DatabaseError => {
 | 
					
						
							|  |  |  |                     ThemeChangeResponse::InternalServerError
 | 
					
						
							|  |  |  |                 }
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							| 
									
										
										
										
											2025-03-18 16:55:58 -07:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // maybe in the future we should have derank list stuff in a different file?
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | pub async fn user_active_deranks(db: &DatabaseConnection, request: UserFetchActiveDeranksRequest) -> UserFetchActiveDeranksResponse {
 | 
					
						
							|  |  |  |     let uid = match session::get_userid_from_session(db, request.token, true).await {
 | 
					
						
							|  |  |  |         Ok(u) => u,
 | 
					
						
							|  |  |  |         Err(e) => {
 | 
					
						
							|  |  |  |             return match e {
 | 
					
						
							|  |  |  |                 FetchSessionError::SessionInvalid => {
 | 
					
						
							|  |  |  |                     UserFetchActiveDeranksResponse::Logout
 | 
					
						
							|  |  |  |                 }
 | 
					
						
							|  |  |  |                 FetchSessionError::SessionDoesntExist => {
 | 
					
						
							|  |  |  |                     UserFetchActiveDeranksResponse::Logout
 | 
					
						
							|  |  |  |                 }
 | 
					
						
							|  |  |  |                 FetchSessionError::DatabaseError => {
 | 
					
						
							|  |  |  |                     UserFetchActiveDeranksResponse::InternalServerError
 | 
					
						
							|  |  |  |                 }
 | 
					
						
							|  |  |  |             };
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     };
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     match deranklist::user_all_active_derank_entries(db, uid).await {
 | 
					
						
							|  |  |  |         Ok(v) => {
 | 
					
						
							|  |  |  |             UserFetchActiveDeranksResponse::Success(v)
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         Err(_) => {
 | 
					
						
							|  |  |  |             UserFetchActiveDeranksResponse::InternalServerError
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							| 
									
										
										
										
											2025-03-12 12:32:15 -07:00
										 |  |  | }
 |