diff --git a/src/hubgw/repositories/cooldowns_repo.py b/src/hubgw/repositories/cooldowns_repo.py index b0ed5f9..d66b33e 100644 --- a/src/hubgw/repositories/cooldowns_repo.py +++ b/src/hubgw/repositories/cooldowns_repo.py @@ -4,6 +4,7 @@ from typing import List, Optional from uuid import UUID from sqlalchemy import delete, func, select +from sqlalchemy.dialects.postgresql import insert from sqlalchemy.ext.asyncio import AsyncSession from hubgw.models.cooldown import Cooldown @@ -17,16 +18,30 @@ class CooldownsRepository: self.session = session async def create(self, request: CooldownCreate) -> Cooldown: - """Create new cooldown.""" - cooldown = Cooldown( - player_uuid=request.player_uuid, - cooldown_type=request.cooldown_type, - expires_at=request.expires_at, - cooldown_seconds=request.cooldown_seconds, - cooldown_metadata=request.metadata, + """Create or update cooldown (UPSERT).""" + stmt = ( + insert(Cooldown) + .values( + player_uuid=request.player_uuid, + cooldown_type=request.cooldown_type, + expires_at=request.expires_at, + cooldown_seconds=request.cooldown_seconds, + cooldown_metadata=request.metadata, + ) + .on_conflict_do_update( + index_elements=["player_uuid", "cooldown_type"], + set_={ + "expires_at": request.expires_at, + "cooldown_seconds": request.cooldown_seconds, + "metadata": request.metadata, + "updated_at": func.now(), + }, + ) + .returning(Cooldown) ) - self.session.add(cooldown) + result = await self.session.execute(stmt) await self.session.commit() + cooldown = result.scalar_one() await self.session.refresh(cooldown) return cooldown