feat(#392): publish quarantine + playlist mutation events
Slice 3a — extends the producer set onto the SSE bus. quarantine events (5 producer sites): - quarantine.flagged (user-side flag): broadcast so the flagger's other clients invalidate their Hidden tab and admins' clients invalidate their queue. - quarantine.unflagged (user-side unflag): scoped to the user. - quarantine.resolved / .file_deleted / .deleted_via_lidarr (admin actions): broadcast because a single admin action can affect every user who'd flagged that track. playlist events (6 producer sites): - playlist.created / .updated / .deleted: owner-scoped. - playlist.tracks_changed: emitted for AppendTracks / RemoveTrack / Reorder. Owner-scoped. Single kind for all three mutations because the client invalidation logic is identical (refetch the detail). Public-playlist subscribers (other users viewing someone else's public playlist) intentionally left out — needs a separate broadcast kind, not exercised yet at single-household scale. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -67,6 +67,9 @@ func (h *handlers) handleFlag(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
return
|
||||
}
|
||||
// Broadcast: the flagging user's other clients invalidate their
|
||||
// Hidden tab; admins' clients invalidate their quarantine queue.
|
||||
h.publishQuarantineEvent("quarantine.flagged", user.ID, trackID, true)
|
||||
writeJSON(w, http.StatusCreated, quarantineViewFrom(row))
|
||||
}
|
||||
|
||||
@@ -89,6 +92,8 @@ func (h *handlers) handleUnflag(w http.ResponseWriter, r *http.Request) {
|
||||
writeErr(w, apierror.InternalMsg("unflag failed", err))
|
||||
return
|
||||
}
|
||||
// Scoped to user: only their other clients need to invalidate.
|
||||
h.publishQuarantineEvent("quarantine.unflagged", user.ID, id, false)
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user