42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
from datetime import datetime, timezone
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.core.exceptions import BadRequestError
|
|
from app.models.order import Order, OrderStatusEnum
|
|
from app.models.user import User
|
|
from app.services.order_service import OrderService
|
|
|
|
audit_logger = logging.getLogger("app.audit")
|
|
|
|
|
|
class PaymentService:
|
|
def __init__(self, db: Session) -> None:
|
|
self.db = db
|
|
self.order_service = OrderService(db)
|
|
|
|
def confirm_payment(self, order_id: int, user: User) -> Order:
|
|
order = self.order_service.get_order_for_user(order_id, user)
|
|
|
|
if order.status != OrderStatusEnum.pending:
|
|
raise BadRequestError("This order is not eligible for payment")
|
|
|
|
try:
|
|
order.status = OrderStatusEnum.paid
|
|
order.paid_at = datetime.now(timezone.utc)
|
|
self.db.commit()
|
|
except Exception:
|
|
self.db.rollback()
|
|
raise
|
|
|
|
audit_logger.info(
|
|
"payment_confirmed order_id=%s user_id=%s total_amount=%s",
|
|
order.id,
|
|
user.id,
|
|
str(order.total_amount),
|
|
)
|
|
return self.order_service.get_order_for_user(order.id, user)
|