feat(payment): expire pending orders after one hour
This commit is contained in:
@@ -7,7 +7,7 @@ from datetime import datetime, timedelta
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from models import Avatar, TokenAccount, TokenUsage, User
|
||||
from models import Avatar, TokenAccount, TokenPaymentOrder, TokenUsage, User
|
||||
|
||||
DEFAULT_TOKEN_GRANT = 1_000_000
|
||||
|
||||
@@ -201,3 +201,22 @@ def release_stale_reservations(db: Session, older_than_minutes: int = 10) -> int
|
||||
"stale_reservation_recovered",
|
||||
)
|
||||
return len(stale)
|
||||
|
||||
|
||||
def close_expired_pending_orders(db: Session, older_than_minutes: int = 60) -> int:
|
||||
"""Close unpaid recharge orders after their one-hour payment window."""
|
||||
now = datetime.utcnow()
|
||||
cutoff = now - timedelta(minutes=older_than_minutes)
|
||||
closed_count = db.query(TokenPaymentOrder).filter(
|
||||
TokenPaymentOrder.status == "pending",
|
||||
TokenPaymentOrder.created_at <= cutoff,
|
||||
).update(
|
||||
{
|
||||
TokenPaymentOrder.status: "closed",
|
||||
TokenPaymentOrder.failure_reason: "支付超时(超过1小时)",
|
||||
TokenPaymentOrder.updated_at: now,
|
||||
},
|
||||
synchronize_session=False,
|
||||
)
|
||||
db.commit()
|
||||
return int(closed_count or 0)
|
||||
|
||||
Reference in New Issue
Block a user