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
    }
}