from __future__ import annotations from datetime import datetime, timezone from sqlalchemy.orm import Session from packages.adapters.sqlalchemy_impl.models import BillingRecordModel class SQLAlchemyBillingRepository: def __init__(self, session: Session): self.session = session def create(self, record: dict) -> BillingRecordModel: model = BillingRecordModel(**record) self.session.add(model) self.session.commit() return model def find_by_user(self, user_id: str, limit: int = 50) -> list[BillingRecordModel]: return ( self.session.query(BillingRecordModel) .filter(BillingRecordModel.user_id == user_id) .order_by(BillingRecordModel.created_at.desc()) .limit(limit) .all() ) def find_by_id(self, record_id: str) -> BillingRecordModel | None: return self.session.get(BillingRecordModel, record_id) def mark_paid(self, record_id: str, payment_method: str, payment_id: str) -> bool: model = self.session.get(BillingRecordModel, record_id) if model is None or model.status == "paid": return False model.status = "paid" model.payment_method = payment_method model.payment_id = payment_id model.paid_at = datetime.now(timezone.utc) self.session.commit() return True def update_subscription_on_payment(self, user_id: str, plan: str, expires_at: datetime) -> None: """在支付成功后更新用户订阅状态(事务内调用)""" from packages.adapters.sqlalchemy_impl.models import UserModel model = self.session.get(UserModel, user_id) if model: model.subscription_plan = plan model.subscription_status = "active" model.subscription_expires_at = expires_at self.session.commit()