# Quickstart: Cancel Event

**Feature Branch**: `016-cancel-event`

## What This Feature Does

Adds the ability for an organizer to permanently cancel an event. Cancelled events display a red banner to visitors and block new RSVPs.

## Implementation Scope

### Backend
1. **Liquibase migration** (003): Add `cancelled` (boolean) and `cancellation_reason` (varchar 2000) columns to `events` table.
2. **Domain model**: Extend `Event.java` with `cancelled` and `cancellationReason` fields + `cancel()` method.
3. **JPA entity**: Extend `EventJpaEntity.java` with matching columns and mapper updates.
4. **OpenAPI spec**: Add `PATCH /events/{eventToken}` endpoint + extend `GetEventResponse` with cancellation fields.
5. **Use case**: New `CancelEventUseCase` interface + implementation in `EventService`.
6. **Controller**: Implement `cancelEvent` in `EventController`.
7. **RSVP guard**: Add cancelled check to RSVP creation (return 409).

### Frontend
1. **Cancel bottom sheet**: Add cancel button (organizer-only) + bottom sheet with textarea and confirm button in `EventDetailView.vue`.
2. **Cancellation banner**: Red banner at top of event detail when `cancelled === true`.
3. **RSVP hiding**: Hide `RsvpBar` when event is cancelled.
4. **API client**: Use generated types from updated OpenAPI spec.

### Testing
1. **Backend unit tests**: Cancel use case, RSVP rejection on cancelled events.
2. **Backend integration tests**: Full cancel flow via API.
3. **Frontend unit tests**: Cancel bottom sheet, banner display, RSVP hiding.
4. **E2E tests**: Organizer cancels event, attendee sees cancelled event.

## Key Files to Modify

| File | Change |
|------|--------|
| `backend/src/main/resources/openapi/api.yaml` | New endpoint + schema extensions |
| `backend/src/main/resources/db/changelog/` | New changeset 003 |
| `backend/src/main/java/de/fete/domain/model/Event.java` | Add cancelled fields + cancel() |
| `backend/src/main/java/de/fete/adapter/out/persistence/EventJpaEntity.java` | Add columns |
| `backend/src/main/java/de/fete/application/service/EventService.java` | Implement cancel |
| `backend/src/main/java/de/fete/adapter/in/web/EventController.java` | Implement endpoint |
| `frontend/src/views/EventDetailView.vue` | Cancel button, bottom sheet, banner |

## Prerequisites

- Existing RSVP bottom sheet pattern (already implemented)
- Organizer token stored in localStorage (already implemented)
- `BottomSheet.vue` component (already exists)
