use actix_web::{web, get, put, HttpResponse}; use sqlx::postgres::PgPool; use tracing::info; use serde::Deserialize; use crate::db; use crate::error::AppError; use crate::models::Claims; #[get("/api/user/profile")] pub async fn get_current_user_profile( pool: web::Data, claims: web::ReqData, ) -> Result { let user_id = claims.user_id; info!("获取当前用户信息, 用户ID: {}", user_id); let user = db::get_user_by_id(pool.get_ref(), user_id).await?; let is_maintenance = std::env::var("PAYMENT_MAINTENANCE_MODE").ok() == Some("true".to_string()); let is_active_member = if is_maintenance { true } else { user.is_member && user.membership_expires_at.is_none_or(|expires| expires > chrono::Utc::now()) }; Ok(HttpResponse::Ok().json(serde_json::json!({ "success": true, "data": { "id": user.id, "name": user.name, "nickname": user.nickname, "avatarUrl": user.avatar_url, "is_member": user.is_member, "is_active_member": is_active_member, "is_admin": user.is_admin, "membership_expires_at": user.membership_expires_at } }))) } #[derive(Debug, Deserialize)] pub struct SaveUserProfileRequest { pub nickname: Option, pub avatar_url: Option, } #[put("/api/user/profile")] pub async fn save_user_profile( pool: web::Data, claims: web::ReqData, body: web::Json, ) -> Result { let user_id = claims.user_id; info!("保存用户信息, 用户ID: {}", user_id); db::update_user_profile(pool.get_ref(), user_id, &body.nickname, &body.avatar_url).await?; Ok(HttpResponse::Ok().json(serde_json::json!({ "success": true }))) }