# Milestone 03 — Admin Invitation Management ## Reference Read `plans/wedding-bootstrap-plan.md` first. This milestone depends on Milestone 01 and Milestone 02 being complete. ## Goal Allow admins to create, list, and view invitations and invitation members from the protected admin portal. ## Scope Implement only: - Invitation query modules. - Invitation member query modules. - Admin invitation list page. - Admin create invitation page. - Admin invitation detail page. - Required shadcn/ui admin components. - Copy invite link affordance. - Language selection per invitation. ## Non-goals Do not implement: - Guest RSVP submission. - Guest-facing localized page. - MinIO uploads. - Song/toast/message guest forms. - CSV export unless trivial and explicitly requested later. - Final design polish. ## Required constraints - Admin UI must use shadcn/ui components only. - The admin create/edit form must require `language`. - Use the invitation/member model from the main plan. - Generate unguessable invitation tokens. - Use Kysely query modules; do not add an ORM. - Keep routes protected by admin auth. ## Implementation tasks - Add query helpers for: - create invitation with members - list invitations with derived counts/status - get invitation detail by id - update invitation metadata if included - add/update/remove members if included - Add validation schema for invitation creation. - Add supported language config if not already present. - Add `/admin/guests` page. - Add `/admin/guests/new` page. - Add `/admin/guests/[id]` page. - Use shadcn components for: - table - form - input - select - checkbox - button - card - badge - dropdown/action menu if needed - alert/toast if needed ## Admin fields Create invitation form must include: - display name - language - contact email - contact phone - max party size - allow member edits - notes - initial members ## Verification Run: ```bash npm run lint npm run build ``` Manual checks: - Admin can create an invitation with multiple members. - Language is required and saved. - Invitation token is generated. - Invite link can be copied or displayed. - Invitation appears in list. - Invitation detail page displays members and metadata. - Non-admin cannot access these pages. - Admin pages use shadcn/ui only. ## Acceptance criteria - Admin can manage the initial invitation/member data needed for guest RSVP. - Invitation language exists in the UI and database. - The implementation does not include guest RSVP or uploads yet.