62 lines
1.8 KiB
Rust
62 lines
1.8 KiB
Rust
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<PgPool>,
|
|
claims: web::ReqData<Claims>,
|
|
) -> Result<HttpResponse, AppError> {
|
|
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<String>,
|
|
pub avatar_url: Option<String>,
|
|
}
|
|
|
|
#[put("/api/user/profile")]
|
|
pub async fn save_user_profile(
|
|
pool: web::Data<PgPool>,
|
|
claims: web::ReqData<Claims>,
|
|
body: web::Json<SaveUserProfileRequest>,
|
|
) -> Result<HttpResponse, AppError> {
|
|
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
|
|
})))
|
|
}
|