from __future__ import annotations from datetime import datetime from decimal import Decimal from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from src.application.abstractions.repositories.i_payment_repository import IPaymentRepository from src.application.contracts import ILogger from src.application.domain.enums import PaymentStatus from src.infrastructure.database.models.payment import Payment class PaymentRepository(IPaymentRepository): def __init__(self,session: AsyncSession,logger: ILogger): self._session=session self._logger=logger async def create_completed(self,*,user_id:str,order_id:str,itpay_payment_id:str,itpay_paid_amount:str|None,transaction_id:str|None,paid_at:str|None,expired_date:str|None) -> Payment: stmt=select(Payment).where(Payment.order_id==order_id) existing=await self._session.scalar(stmt) if existing is not None: return existing paid_at_dt=datetime.fromisoformat(paid_at.replace('Z','+00:00')) if paid_at else None expired_dt=datetime.fromisoformat(expired_date.replace('Z','+00:00')) if expired_date else None paid_amount_dec=Decimal(str(itpay_paid_amount)) if itpay_paid_amount is not None else None model=Payment( user_id=user_id, order_id=order_id, status=PaymentStatus.PENDING, receipt_cloudekassir_link=None, itpay_payment_id=itpay_payment_id, itpay_paid_amount=paid_amount_dec, transaction_id=transaction_id, paid_at=paid_at_dt, expired_date=expired_dt, ) self._session.add(model) await self._session.flush() return model