Skip to content

[BE-25] Events module — CRUD, capacity, RSVP #1361

Description

@yusuftomilola

Overview

Tech hubs run events constantly — meetups, workshops, demo days. An events system with RSVP is core community infrastructure (every competitor has it) and later a revenue stream ([BE-26] paid tickets).

Proposed Design

New module backend/src/events/:

  • Event entity: title, slug, description, coverImageUrl (Cloudinary — reuse backend/src/cloudinary/), startsAt, endsAt, venue (free text or a workspaceId link), capacity (nullable = unlimited), isPublic (visible to non-members), status (DRAFT, PUBLISHED, CANCELLED), createdById.
  • EventRsvp entity: eventId, userId, status (GOING, CANCELLED, WAITLISTED), unique (eventId, userId).

Endpoints

Method Path Access
GET /events · /events/:slug Public lists PUBLISHED+isPublic; members see all PUBLISHED
POST/PATCH/DELETE /events... ADMIN/STAFF (publish, edit, cancel)
POST /events/:id/rsvp · DELETE .../rsvp Member
GET /events/:id/attendees ADMIN/STAFF

Tasks

  • Capacity enforcement: RSVPs beyond capacity become WAITLISTED; a cancellation promotes the oldest waitlisted RSVP (notify them).
  • Event-cancelled notifications + email to all GOING attendees.
  • Reminder job (jobs module, [BE-03]): notify GOING attendees 24h before startsAt.
  • Migration included.

Acceptance Criteria

  • Full lifecycle works: draft → publish → members RSVP → capacity waitlists → reminder → event passes.
  • Cancelling an event notifies every attendee.
  • A member can RSVP once and toggle it; unique constraint enforced.

Dependencies

Blocks [BE-26], [FE-11], [FE-12].

Notes for Contributors

Mirror module conventions from bookings. Comment below to be assigned.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions