from typing import cast from sqlalchemy import update as sa_update from sqlalchemy.engine import CursorResult from fooder.domain.user_product_usage import UserProductUsage from fooder.repository.base import RepositoryBase class UserProductUsageRepository(RepositoryBase[UserProductUsage]): async def get_by_user_and_product( self, user_id: int, product_id: int ) -> UserProductUsage: return await self._get( UserProductUsage.user_id == user_id, UserProductUsage.product_id == product_id, ) async def increment(self, user_id: int, product_id: int, count: int = 1) -> None: stmt = ( sa_update(UserProductUsage) .where( UserProductUsage.user_id == user_id, UserProductUsage.product_id == product_id, ) .values(count=UserProductUsage.count + count) ) result = cast(CursorResult, await self.session.execute(stmt)) if result.rowcount == 0: obj = UserProductUsage(user_id=user_id, product_id=product_id, count=count) await self.create(obj)