o2o-castad-backend/app/user/services/credit.py

19 lines
543 B
Python

from sqlalchemy import update
from sqlalchemy.ext.asyncio import AsyncSession
from app.user.models import User
async def consume_credit(user_uuid, session: AsyncSession) -> bool:
"""atomic UPDATE로 1크레딧 차감.
WHERE credits > 0 조건으로 음수 차감 방지 + PostgreSQL 행 락.
차감 성공 여부 반환.
"""
result = await session.execute(
update(User)
.where(User.user_uuid == user_uuid, User.credits > 0)
.values(credits=User.credits - 1)
)
return result.rowcount > 0