Before this commit:
1. Rooms could be hard-deleted from the internal API (unused by the
frontend).
2. The external API had no way to delete a room.
3. The admin could hard-delete rooms.
What this commit does:
1. Add a `deleted_at` field to Room. `Room.objects` hides soft-deleted
rooms; `all_objects` stays the default manager so deleted rooms keep
reserving their slug and PIN code.
2. Soft delete rooms from the internal API (replacing hard delete) and
the external API (new DELETE, owner only, `rooms:delete` scope). The
LiveKit room is closed and its participants disconnected; if closing
fails, the soft delete is rolled back and an error is returned.
3. Answer 410 Gone on detail operations on a deleted room (after
permission checks). Its can still be read but not modified.
4. Close LiveKit rooms recreated after deletion by participants still
holding a valid token (room_started webhook).
5. Frontend: participants in the call land on the feedback page without
the rejoin button, lobby participants see a "meeting deleted" screen,
and opening the link shows an error instead of recreating the room.
Untouched by this commit:
- The admin still hard-deletes rooms, without closing the LiveKit room,
and lists soft-deleted rooms alongside active ones.
- Purging soft-deleted rooms (hard deletion) is not handled.
- Scheduled deletion is not handled.
Introduce a new viewset that lets the roomkit start a room even when
no WebRTC participant has joined yet.
This is a first entry point that will be extended over time with
more actions a roomkit needs to be able to trigger.
Known limitations:
* The responsibility around SIP rules is currently split between
the telephony feature and the roomkit one. This may need a
refactor later on to consolidate ownership in a single place.
* The default throttle might be too low for production usage and
will likely need to be revisited.
Add an analytics abstraction that allows configuring which analytics
solution the app uses. PostHog is implemented as one backend, but by
default no analytics backend is activated.
The goal is to track events in a sufficiently organized way and to
let any developer implement their own backend as long as it follows
the same protocol.