forked from asklyphe-public/asklyphe
		
	
		
			
	
	
		
			79 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
		
		
			
		
	
	
			79 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * authservice db/usersettings.rs
							 | 
						||
| 
								 | 
							
								 * - pgsql usersettings 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 log::error;
							 | 
						||
| 
								 | 
							
								use sea_orm::{ActiveModelTrait, DatabaseConnection, EntityTrait, IntoActiveModel};
							 | 
						||
| 
								 | 
							
								use sea_orm::ActiveValue::Set;
							 | 
						||
| 
								 | 
							
								use entity::user_settings;
							 | 
						||
| 
								 | 
							
								use crate::db::user::{check_if_user_exists, FetchUserError};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#[derive(Debug, Clone)]
							 | 
						||
| 
								 | 
							
								pub struct UserSettings {
							 | 
						||
| 
								 | 
							
								    pub theme: String,
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#[derive(Debug)]
							 | 
						||
| 
								 | 
							
								pub enum FetchUserSettingsError {
							 | 
						||
| 
								 | 
							
								    UserNotFound,
							 | 
						||
| 
								 | 
							
								    DatabaseError,
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pub async fn get_or_create_default_user_settings(db: &DatabaseConnection, user_id: String) -> Result<UserSettings, FetchUserSettingsError> {
							 | 
						||
| 
								 | 
							
								    if let Some(us) = user_settings::Entity::find_by_id(&user_id).one(db).await.map_err(|e| {
							 | 
						||
| 
								 | 
							
								        error!("DATABASE ERROR WHILE FETCH USER SETTINGS: {e}");
							 | 
						||
| 
								 | 
							
								        FetchUserSettingsError::DatabaseError
							 | 
						||
| 
								 | 
							
								    })? {
							 | 
						||
| 
								 | 
							
								        return Ok(UserSettings {
							 | 
						||
| 
								 | 
							
								            theme: us.theme
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    check_if_user_exists(db, user_id.clone()).await.map_err(|e| {
							 | 
						||
| 
								 | 
							
								        match e {
							 | 
						||
| 
								 | 
							
								            FetchUserError::UserNotFound => {FetchUserSettingsError::UserNotFound}
							 | 
						||
| 
								 | 
							
								            FetchUserError::DatabaseError => {FetchUserSettingsError::DatabaseError}
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    })?;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    let us_record = user_settings::ActiveModel {
							 | 
						||
| 
								 | 
							
								        user: Set(user_id),
							 | 
						||
| 
								 | 
							
								        theme: Set("default".to_string()),
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    user_settings::Entity::insert(us_record).exec(db).await.map_err(|e| {
							 | 
						||
| 
								 | 
							
								        error!("DATABASE ERROR WHILE INSERT USER_SETTINGS: {e}");
							 | 
						||
| 
								 | 
							
								        FetchUserSettingsError::DatabaseError
							 | 
						||
| 
								 | 
							
								    })?;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Ok(UserSettings {
							 | 
						||
| 
								 | 
							
								        theme: "default".to_string(),
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pub async fn set_theme(db: &DatabaseConnection, user_id: String, theme: String) -> Result<(), FetchUserSettingsError> {
							 | 
						||
| 
								 | 
							
								    get_or_create_default_user_settings(db, user_id.clone()).await?;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    let mut us_record = user_settings::Entity::find_by_id(&user_id).one(db).await.map_err(|e| {
							 | 
						||
| 
								 | 
							
								        error!("DATABASE ERROR WHILE INSERT USER_SETTINGS: {e}");
							 | 
						||
| 
								 | 
							
								        FetchUserSettingsError::DatabaseError
							 | 
						||
| 
								 | 
							
								    })?.ok_or(FetchUserSettingsError::UserNotFound)?.into_active_model();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    us_record.theme = Set(theme);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    us_record.update(db).await.map_err(|e| {
							 | 
						||
| 
								 | 
							
								        error!("DATABASE ERROR WHILE INSERT USER_SETTINGS: {e}");
							 | 
						||
| 
								 | 
							
								        FetchUserSettingsError::DatabaseError
							 | 
						||
| 
								 | 
							
								    })?;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Ok(())
							 | 
						||
| 
								 | 
							
								}
							 |