from datetime import UTC, datetime from sqlalchemy.orm import Session from packages.adapters.sqlalchemy_impl.models import PointsAccountModel from packages.domain.points_account import PointsAccount class SQLAlchemyPointsAccountRepository: def __init__(self, session: Session): self.session = session def create(self, account: PointsAccount) -> PointsAccount: model = PointsAccountModel( id=account.id, user_id=account.user_id, balance=account.balance, total_earned=account.total_earned, total_spent=account.total_spent, created_at=account.created_at, updated_at=account.updated_at, ) self.session.add(model) self.session.commit() return account def get_by_user_id(self, user_id: str) -> PointsAccount | None: model = self.session.query(PointsAccountModel).filter(PointsAccountModel.user_id == user_id).first() if model is None: return None return self._to_domain(model) def update_balance(self, account: PointsAccount) -> PointsAccount: model = self.session.query(PointsAccountModel).filter(PointsAccountModel.id == account.id).first() if model is None: return account model.balance = account.balance model.total_earned = account.total_earned model.total_spent = account.total_spent model.updated_at = datetime.now(UTC) self.session.add(model) self.session.commit() return account @staticmethod def _to_domain(model: PointsAccountModel) -> PointsAccount: return PointsAccount( id=model.id, user_id=model.user_id, balance=model.balance, total_earned=model.total_earned, total_spent=model.total_spent, created_at=model.created_at, updated_at=model.updated_at, )