49 lines
2.4 KiB
Markdown
49 lines
2.4 KiB
Markdown
# 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)
|