# Data Model: Auto-Delete Expired Events

**Feature**: 013-auto-delete-expired | **Date**: 2026-03-09

## Existing Entities (no changes)

### Event

| Field | Type | Notes |
|-------|------|-------|
| id | BIGSERIAL | PK, internal |
| event_token | UUID | Public identifier |
| organizer_token | UUID | Organizer access |
| title | VARCHAR(200) | Required |
| description | VARCHAR(2000) | Optional |
| date_time | TIMESTAMPTZ | Event date/time |
| location | VARCHAR(500) | Optional |
| expiry_date | DATE | **Deletion trigger** — indexed (`idx_events_expiry_date`) |
| created_at | TIMESTAMPTZ | Auto-set |

### RSVP

| Field | Type | Notes |
|-------|------|-------|
| id | BIGSERIAL | PK, internal |
| rsvp_token | UUID | Public identifier |
| event_id | BIGINT | FK → events(id), **ON DELETE CASCADE** |
| name | VARCHAR(100) | Guest name |

## Deletion Behavior

- `DELETE FROM events WHERE expiry_date < CURRENT_DATE` removes expired events.
- RSVPs are automatically cascade-deleted by the FK constraint `fk_rsvps_event_id` with `ON DELETE CASCADE`.
- No new tables, columns, or migrations required.

## Indexes Used

- `idx_events_expiry_date` on `events(expiry_date)` — ensures the cleanup query is efficient.
