Revert so commit now happens before notice, but add a catch-all to websocket notifications

This commit is contained in:
Donkie
2024-08-16 15:13:09 +02:00
parent 8edf6d2e20
commit 32c737fa98
3 changed files with 55 additions and 41 deletions

View File

@@ -76,8 +76,8 @@ async def create(
extra=[models.FilamentField(key=k, value=v) for k, v in (extra or {}).items()],
)
db.add(filament)
await filament_changed(filament, EventType.ADDED)
await db.commit()
await filament_changed(filament, EventType.ADDED)
return filament
@@ -172,8 +172,8 @@ async def update(
filament.multi_color_direction = v.value if v is not None else None
else:
setattr(filament, k, v)
await filament_changed(filament, EventType.UPDATED)
await db.commit()
await filament_changed(filament, EventType.UPDATED)
return filament
@@ -182,8 +182,8 @@ async def delete(db: AsyncSession, filament_id: int) -> None:
filament = await get_by_id(db, filament_id)
await db.delete(filament)
try:
await filament_changed(filament, EventType.DELETED)
await db.commit() # Flush immediately so any errors are propagated in this request.
await filament_changed(filament, EventType.DELETED)
except IntegrityError as exc:
await db.rollback()
raise ItemDeleteError("Failed to delete filament.") from exc
@@ -255,12 +255,16 @@ async def find_by_color(
async def filament_changed(filament: models.Filament, typ: EventType) -> None:
"""Notify websocket clients that a filament has changed."""
await websocket_manager.send(
("filament", str(filament.id)),
FilamentEvent(
type=typ,
resource="filament",
date=datetime.utcnow(),
payload=Filament.from_db(filament),
),
)
try:
await websocket_manager.send(
("filament", str(filament.id)),
FilamentEvent(
type=typ,
resource="filament",
date=datetime.utcnow(),
payload=Filament.from_db(filament),
),
)
except Exception:
# Important to have a catch-all here since we don't want to stop the call if this fails.
logger.exception("Failed to send websocket message")