diff --git a/src/db.rs b/src/db.rs index 811f0bc..a5c09f7 100644 --- a/src/db.rs +++ b/src/db.rs @@ -11,17 +11,18 @@ use crate::error::AppError; pub async fn insert_weather_data(pool: &PgPool, weather_data: &WeatherData, user_id: i32) -> Result { // 单次查询获取用户会员状态和数据条数(原 N+1:get_user_by_id + count_user_weather_data → 合并为 1 次) #[derive(FromRow)] - struct UserQuota { - is_member: bool, - paid_expires_at: Option>, - data_count: i64, - } +struct UserQuota { + is_member: bool, + #[sqlx(rename = "membership_expires_at")] + membership_expires_at: Option>, + data_count: i64, +} let quota = sqlx::query_as::<_, UserQuota>( r#" SELECT u.is_member, - u.paid_expires_at, + u.membership_expires_at, (SELECT COUNT(*) FROM weather_data w WHERE w.user_id = $1)::BIGINT AS data_count FROM users u WHERE u.id = $1 @@ -33,7 +34,7 @@ pub async fn insert_weather_data(pool: &PgPool, weather_data: &WeatherData, user .map_err(|e| AppError::Database(format!("查询用户配额失败: {}", e)))? .ok_or_else(|| AppError::NotFound("用户不存在".to_string()))?; - let is_active_member = quota.is_member && quota.paid_expires_at.is_none_or(|expires| expires > Utc::now()); + let is_active_member = quota.is_member && quota.membership_expires_at.is_none_or(|expires| expires > Utc::now()); // 维护模式:非会员使用更高的临时限额,防止资源滥用 let is_maintenance = std::env::var("PAYMENT_MAINTENANCE_MODE").ok() == Some("true".to_string());