Cover One-link Solution
Overview & Context
The web-app currently supports a dedicated guest entry via /invite/{invite_code}
and passes an invite query parameter / stored invite code into the join flow.
With the unified room URL, every participant joins through /room/{room_id} and
the invite code is no longer part of the join. Legacy /invite/{invite_code}
links must keep working (backwards compatibility) but resolve to the unified
room flow.
Technical Design & Interfaces
- Keep the
/invite/:inviteCoderoute functional as a compatibility landing page: resolve the room (existingroom/fetchRoomByInviteId→/v1/invite/verifyinroomSlice.tsand forward into/room/{room_id}. - Remove invite-code plumbing from the standard join path:
useInviteCode/invitequery param -drop from the normal room-join flow.inviteCodein room store state and start payload - stop sendinginvite_codeto/start.- Invite-link/guest-link generation in dashboard/toolbar (e.g.
CreateDirectMeeting,MeetingDetailsDialogActions,MoreMenuguest invite) should produce/room/{room_id}links.
Definition of Done (DoD)
-
/invite/{invite_code}still resolves and forwards to/room/{room_id} - Normal join no longer reads/sends an invite code (query param + store)
- Invite/guest link generation produces unified
/room/{room_id}links - UI no longer distinguishes a separate guest link
- Tests updated
QA Test Scenarios
1. Backward compatibility — legacy invite links
| # | Steps | Expected outcome |
|---|---|---|
| 1.1 | Open a legacy https://<host>/invite/{valid_invite_code} link in the browser |
Page resolves the room via /v1/invite/verify and redirects to /room/{room_id}; user lands in lobby/self-test |
| 1.2 | Open /invite/{invalid_or_expired_code} |
Error view shown (error-invite-link), no crash, no redirect loop |
| 1.3 | Open a legacy invite link as a guest (not logged in) | Redirect works; guest can proceed to the room (subject to room's guest-access setting) |
2. Normal room join (unified link)
| # | Steps | Expected outcome |
|---|---|---|
| 2.1 | Open https://<host>/room/{room_id} |
Lobby/self-test appears; join succeeds |
| 2.2 | Inspect the WebSocket /start join payload (dev tools) |
Payload contains no invite_code field |
3. JoinMeetingDialog paste/type behavior
| # | Input pasted/typed | Expected outcome |
|---|---|---|
| 3.1 | Full /room/{uuid} URL |
Field fills with the UUID; submit navigates to /room/{uuid} |
| 3.2 | Full legacy /invite/{uuid} URL |
Field fills; submit navigates to /invite/{uuid} (legacy path preserved) |
4. Link generation across the app
| # | Location | Expected outcome |
|---|---|---|
| 4.1 | Dashboard → meeting card → copy link (MeetingActions) | Copies .../room/{room_id} |
| 4.2 | Dashboard → Create Direct (ad-hoc) meeting → room link field | Shows/copies .../room/{room_id} (single field, no separate guest link) |
| 4.3 | In-conference → Meeting details dialog → meeting link | Shows/copies .../room/{room_id} |
| 4.4 | Open the moderator "More" menu in-conference | No "Invite guest" menu item; no invite-guest dialog |
Edited by Albrecht Weiche