fix: insert_weather_data 配额查询使用已重命名的 membership_expires_at 列
This commit is contained in:
11
src/db.rs
11
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<i32, AppError> {
|
pub async fn insert_weather_data(pool: &PgPool, weather_data: &WeatherData, user_id: i32) -> Result<i32, AppError> {
|
||||||
// 单次查询获取用户会员状态和数据条数(原 N+1:get_user_by_id + count_user_weather_data → 合并为 1 次)
|
// 单次查询获取用户会员状态和数据条数(原 N+1:get_user_by_id + count_user_weather_data → 合并为 1 次)
|
||||||
#[derive(FromRow)]
|
#[derive(FromRow)]
|
||||||
struct UserQuota {
|
struct UserQuota {
|
||||||
is_member: bool,
|
is_member: bool,
|
||||||
paid_expires_at: Option<chrono::DateTime<Utc>>,
|
#[sqlx(rename = "membership_expires_at")]
|
||||||
|
membership_expires_at: Option<chrono::DateTime<Utc>>,
|
||||||
data_count: i64,
|
data_count: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
let quota = sqlx::query_as::<_, UserQuota>(
|
let quota = sqlx::query_as::<_, UserQuota>(
|
||||||
r#"
|
r#"
|
||||||
SELECT
|
SELECT
|
||||||
u.is_member,
|
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
|
(SELECT COUNT(*) FROM weather_data w WHERE w.user_id = $1)::BIGINT AS data_count
|
||||||
FROM users u
|
FROM users u
|
||||||
WHERE u.id = $1
|
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)))?
|
.map_err(|e| AppError::Database(format!("查询用户配额失败: {}", e)))?
|
||||||
.ok_or_else(|| AppError::NotFound("用户不存在".to_string()))?;
|
.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());
|
let is_maintenance = std::env::var("PAYMENT_MAINTENANCE_MODE").ok() == Some("true".to_string());
|
||||||
|
|||||||
Reference in New Issue
Block a user