Spec, research, data model, API contract, implementation plan, and task breakdown for the public event detail page. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3.1 KiB
3.1 KiB
Data Model: View Event Landing Page (007)
Date: 2026-03-06
Entities
Event (modified — adds timezone field)
| Field | Type | Required | Constraints | Notes |
|---|---|---|---|---|
| id | Long | yes | BIGSERIAL, PK | Internal only, never exposed |
| eventToken | UUID | yes | UNIQUE, NOT NULL | Public identifier in URLs |
| organizerToken | UUID | yes | UNIQUE, NOT NULL | Secret, never in public API |
| title | String | yes | 1–200 chars | |
| description | String | no | max 2000 chars | |
| dateTime | OffsetDateTime | yes | Organizer's original offset | |
| timezone | String | yes | IANA zone ID, max 64 | NEW — e.g. "Europe/Berlin" |
| location | String | no | max 500 chars | |
| expiryDate | LocalDate | yes | Must be future at create | Auto-deletion trigger |
| createdAt | OffsetDateTime | yes | Server-generated |
Validation rules:
timezonemust be a valid IANA zone ID (ZoneId.getAvailableZoneIds()).expiryDatemust be in the future at creation time (existing rule).
State transitions:
- Active → Expired: when
expiryDate < today(computed, not stored). - Active → Cancelled: future (US-18), adds
cancelledAt+cancellationMessage.
RSVP (future — not created in this feature)
Documented here for context only. Created when the RSVP feature (US-8+) is implemented.
| Field | Type | Required | Constraints |
|---|---|---|---|
| id | Long | yes | BIGSERIAL, PK |
| eventId | Long | yes | FK → events.id |
| guestName | String | yes | 1–100 chars |
| attending | Boolean | yes | true = attending |
| createdAt | OffsetDateTime | yes | Server-generated |
Relationships
Event 1 ←── * RSVP (future)
Type Mapping (full stack)
| Concept | Java | PostgreSQL | OpenAPI | TypeScript |
|---|---|---|---|---|
| Event time | OffsetDateTime |
timestamptz |
string date-time |
string |
| Timezone | String |
varchar(64) |
string |
string |
| Expiry date | LocalDate |
date |
string date |
string |
| Token | UUID |
uuid |
string uuid |
string |
| Count | int |
integer |
integer |
number |