Delegate exchange persistence to ExchangeRepository

- Add create() and update() methods to ExchangeRepository
- Update ExchangeService to use repository methods instead of direct db operations
- All persistence operations now go through repositories consistently
- Fix indentation errors in ExchangeService
This commit is contained in:
counterweight 2025-12-25 18:54:29 +01:00
parent c4594a3f73
commit 33aa8ad13b
Signed by: counterweight
GPG key ID: 883EDBAA726BD96C
2 changed files with 33 additions and 18 deletions

View file

@ -161,3 +161,32 @@ class ExchangeRepository:
)
)
return {row[0] for row in result.all()}
async def create(self, exchange: Exchange) -> Exchange:
"""
Create a new exchange record.
Args:
exchange: Exchange instance to persist
Returns:
Created Exchange record (committed and refreshed)
"""
self.db.add(exchange)
await self.db.commit()
await self.db.refresh(exchange)
return exchange
async def update(self, exchange: Exchange) -> Exchange:
"""
Update an existing exchange record.
Args:
exchange: Exchange instance to update
Returns:
Updated Exchange record (committed and refreshed)
"""
await self.db.commit()
await self.db.refresh(exchange)
return exchange

View file

@ -267,11 +267,8 @@ class ExchangeService:
status=ExchangeStatus.BOOKED,
)
self.db.add(exchange)
try:
await self.db.commit()
await self.db.refresh(exchange)
return await self.exchange_repo.create(exchange)
except IntegrityError as e:
await self.db.rollback()
# This should rarely happen now since we check explicitly above,
@ -280,8 +277,6 @@ class ExchangeService:
"Database constraint violation. Please try again."
) from e
return exchange
async def get_exchange_by_public_id(
self, public_id: uuid.UUID, user: User | None = None
) -> Exchange:
@ -331,10 +326,7 @@ class ExchangeService:
)
exchange.cancelled_at = datetime.now(UTC)
await self.db.commit()
await self.db.refresh(exchange)
return exchange
return await self.exchange_repo.update(exchange)
async def complete_exchange(self, exchange: Exchange) -> Exchange:
"""
@ -354,10 +346,7 @@ class ExchangeService:
exchange.status = ExchangeStatus.COMPLETED
exchange.completed_at = datetime.now(UTC)
await self.db.commit()
await self.db.refresh(exchange)
return exchange
return await self.exchange_repo.update(exchange)
async def mark_no_show(self, exchange: Exchange) -> Exchange:
"""
@ -379,10 +368,7 @@ class ExchangeService:
exchange.status = ExchangeStatus.NO_SHOW
exchange.completed_at = datetime.now(UTC)
await self.db.commit()
await self.db.refresh(exchange)
return exchange
return await self.exchange_repo.update(exchange)
def _expand_availability_to_slots(
self, avail: Availability, slot_date: date, booked_starts: set[datetime]