from typing import List, Optional from sqlalchemy.orm import Session from app.crud.base import CRUDBase from app.models.deposit import Deposit, DepositStatus from app.schemas.deposit import DepositCreate, DepositUpdate class CRUDDeposit(CRUDBase[Deposit, DepositCreate, DepositUpdate]): def get_by_user( self, db: Session, *, user_id: int, skip: int = 0, limit: int = 100 ) -> List[Deposit]: return ( db.query(Deposit) .filter(Deposit.user_id == user_id) .order_by(Deposit.created_at.desc()) .offset(skip) .limit(limit) .all() ) def get_by_status( self, db: Session, *, status: str, skip: int = 0, limit: int = 100 ) -> List[Deposit]: return ( db.query(Deposit) .filter(Deposit.status == status) .order_by(Deposit.created_at.desc()) .offset(skip) .limit(limit) .all() ) def get_all_pending( self, db: Session, *, skip: int = 0, limit: int = 100 ) -> List[Deposit]: return self.get_by_status(db, status=DepositStatus.PENDING, skip=skip, limit=limit) def approve( self, db: Session, *, db_obj: Deposit, admin_notes: Optional[str] = None ) -> Deposit: update_data = {"status": DepositStatus.APPROVED} if admin_notes: update_data["admin_notes"] = admin_notes return super().update(db, db_obj=db_obj, obj_in=update_data) def reject( self, db: Session, *, db_obj: Deposit, admin_notes: str ) -> Deposit: update_data = { "status": DepositStatus.REJECTED, "admin_notes": admin_notes } return super().update(db, db_obj=db_obj, obj_in=update_data) deposit = CRUDDeposit(Deposit) # Aliases for convenience get_deposit = deposit.get create_deposit = deposit.create get_deposits_by_user = deposit.get_by_user get_deposits_by_status = deposit.get_by_status get_all_pending_deposits = deposit.get_all_pending approve_deposit = deposit.approve reject_deposit = deposit.reject