Skip to content

Coordinator attendee roster + CSV export on the event page#504

Merged
KishParikh13 merged 1 commit into
v2from
feat/event-admin-roster
Jun 17, 2026
Merged

Coordinator attendee roster + CSV export on the event page#504
KishParikh13 merged 1 commit into
v2from
feat/event-admin-roster

Conversation

@KishParikh13

Copy link
Copy Markdown
Collaborator

What

Adds a "Manage attendees" panel to the event detail view, visible only to the event creator or an admin. It's the in-app replacement for the Google Form / spreadsheet coordinators use today — exactly what Siddharth described in his demo ("uses a Google Spreadsheet; asks name, email, phone").

It lives on the event page itself (per request), not in the separate admin portal: native full-screen, mobile-web route, and the desktop explore side panel.

What it shows

  • Full roster: registered members (name + email) and account-less guests, with a Member/Guest tag
  • Counts ("N members · M guests")
  • Export CSV — web: downloads a .csv file; native: OS share sheet

Changes

  • Backend GET /events/:id/roster — gated to creator-or-admin (mirrors the /updateEvent gate). Merges event_attendees (email + join date) with non-upgraded event_guest_rsvps, returns counts. New db.getEventRoster().
  • Frontend shared <EventAttendeeRoster> component (native + web) + api.getEventRoster(). Wired into events/[id].tsx, events/[id].web.tsx, and EventDetailPanel.web.tsx (new canManage prop, passed from explore).
  • Tests: roster returns members+guests to creator; 403 for a non-coordinator; admin can view any roster; 404 for unknown event.

Scope notes

  • Read-only roster for v1 (no remove-attendee / messaging yet). The event board remains the in-app "contact attendees" path; CSV gives emails for external blasts.
  • ⚠️ Separate finding: /getEventUsers is public (no auth) and userRowToApi returns email, phoneNumber, dateOfBirth — so attendee PII is currently exposed to anyone. Not touched here; flagged for its own fix.

Test plan

  • npm run typecheck (backend + frontend) clean
  • npm run test backend — 435 passing (incl. 4 new roster tests)
  • Manual: as event creator, open the event (desktop panel / mobile web / native) → see Manage attendees with members + a guest; Export CSV downloads/shares; as a non-coordinator, the panel is absent and the endpoint 403s

Adds a "Manage attendees" panel to the event detail view, visible only to
the event creator or an admin. It's the in-app replacement for the Google
Form / spreadsheet that coordinators use today: the full list of who
RSVP'd — registered members (with email) and account-less guests — plus a
one-tap CSV export.

Lives on the event page itself (native full screen, mobile-web route, and
the desktop explore side panel), not in the separate admin portal.

- backend: GET /events/:id/roster — gated to creator-or-admin; merges
  event_attendees (email + join date) with non-upgraded event_guest_rsvps;
  returns counts. New db.getEventRoster().
- frontend: shared <EventAttendeeRoster> (native + web) — list, counts,
  Export CSV (web: file download; native: OS share sheet). New
  api.getEventRoster().
- wired into events/[id].tsx, events/[id].web.tsx, and
  EventDetailPanel.web.tsx (new canManage prop, passed from explore).
- tests: roster returns members+guests to creator, 403 for non-coordinator,
  admin can view any, 404 for unknown event.

Note: /getEventUsers is public and exposes attendee email/phone/DOB via
userRowToApi — pre-existing PII leak, flagged for a separate fix.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying chinmaya-janata with  Cloudflare Pages  Cloudflare Pages

Latest commit: 65f419e
Status: ✅  Deploy successful!
Preview URL: https://4690b249.project-janatha.pages.dev
Branch Preview URL: https://feat-event-admin-roster.project-janatha.pages.dev

View logs

@KishParikh13 KishParikh13 merged commit f7e5cc8 into v2 Jun 17, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant