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>
57 lines
3.1 KiB
Markdown
57 lines
3.1 KiB
Markdown
# 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**:
|
||
- `timezone` must be a valid IANA zone ID (`ZoneId.getAvailableZoneIds()`).
|
||
- `expiryDate` must 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` |
|