user_preferences_service.rs
118 lignes · 3602 octets
use crate::error::AppError; use crate::models::user_preferences; use chrono::Utc; use sea_orm::{ActiveModelTrait, ColumnTrait, DatabaseConnection, EntityTrait, QueryFilter, Set}; use uuid::Uuid; /// Service for managing user preferences /// /// This service provides business logic for user display preferences /// (theme, language). pub struct UserPreferencesService; impl UserPreferencesService { /// Get preferences for a user /// /// # Arguments /// /// * `db` - Database connection /// * `user_id` - UUID of the user /// /// # Returns /// /// User preferences if found, None otherwise pub async fn get_preferences( db: &DatabaseConnection, user_id: Uuid, ) -> Result<Option<user_preferences::Model>, AppError> { let preferences = user_preferences::Entity::find() .filter(user_preferences::Column::UserId.eq(user_id)) .one(db) .await?; Ok(preferences) } /// Create preferences for a user /// /// # Arguments /// /// * `db` - Database connection /// * `user_id` - UUID of the user /// * `theme` - Theme preference ("light", "dark", or "auto") /// * `language` - Language preference ("fr", "en", "de", or "es") /// /// # Returns /// /// The created preferences model pub async fn create_preferences( db: &DatabaseConnection, user_id: Uuid, theme: String, language: String, ) -> Result<user_preferences::Model, AppError> { let now = Utc::now(); let preferences = user_preferences::ActiveModel { id: Set(Uuid::new_v4()), user_id: Set(user_id), theme: Set(theme), language: Set(language), created_at: Set(now), updated_at: Set(now), }; let result = preferences.insert(db).await?; Ok(result) } /// Update preferences for a user /// /// # Arguments /// /// * `db` - Database connection /// * `user_id` - UUID of the user /// * `theme` - Theme preference ("light", "dark", or "auto") /// * `language` - Language preference ("fr", "en", "de", or "es") /// /// # Returns /// /// The updated preferences model pub async fn update_preferences( db: &DatabaseConnection, user_id: Uuid, theme: String, language: String, ) -> Result<user_preferences::Model, AppError> { let preferences = user_preferences::Entity::find() .filter(user_preferences::Column::UserId.eq(user_id)) .one(db) .await? .ok_or_else(|| AppError::NotFound("User preferences not found".to_string()))?; let mut active_preferences: user_preferences::ActiveModel = preferences.into(); active_preferences.theme = Set(theme); active_preferences.language = Set(language); active_preferences.updated_at = Set(Utc::now()); let result = active_preferences.update(db).await?; Ok(result) } /// Create default preferences for a user /// /// # Arguments /// /// * `db` - Database connection /// * `user_id` - UUID of the user /// /// # Returns /// /// The created preferences model with default values (theme: "light", language: "fr") pub async fn create_default_preferences( db: &DatabaseConnection, user_id: Uuid, ) -> Result<user_preferences::Model, AppError> { Self::create_preferences(db, user_id, "light".to_string(), "fr".to_string()).await } }
GitRust