//! Notification preference management. use axum::{ extract::State, response::{Html, IntoResponse, Response}, Form, }; use serde::Deserialize; use crate::{ auth::AuthUser, db, error::Result, templates::SaveStatusTemplate, AppState, }; /// Form input for notification preferences (checkbox values: "on" or absent). #[derive(Debug, Deserialize)] pub struct UpdatePreferencesForm { pub notify_sale: Option, pub notify_follower: Option, pub notify_release: Option, pub login_notification_enabled: Option, pub notify_issues: Option, pub notify_status: Option, pub tips_enabled: Option, pub notify_tip: Option, } /// Update the authenticated user's notification preferences. #[tracing::instrument(skip_all, name = "users::update_preferences")] pub(in crate::routes::api) async fn update_preferences( State(state): State, AuthUser(user): AuthUser, Form(form): Form, ) -> Result { let notify_sale = form.notify_sale.as_deref() == Some("on"); let notify_follower = form.notify_follower.as_deref() == Some("on"); let notify_release = form.notify_release.as_deref() == Some("on"); let login_notification_enabled = form.login_notification_enabled.as_deref() == Some("on"); let notify_issues = form.notify_issues.as_deref() == Some("on"); let notify_status = form.notify_status.as_deref() == Some("on"); let tips_enabled = form.tips_enabled.as_deref() == Some("on"); let notify_tip = form.notify_tip.as_deref() == Some("on"); db::users::update_notification_preferences(&state.db, user.id, notify_sale, notify_follower, notify_release, login_notification_enabled, notify_issues, notify_status).await?; db::users::update_tip_preferences(&state.db, user.id, tips_enabled, notify_tip).await?; Ok(Html(SaveStatusTemplate { success: true, message: "Preferences saved".to_string(), }.render_string()).into_response()) }