# Tasks: Auto-Delete Expired Events

**Input**: Design documents from `/specs/013-auto-delete-expired/`
**Prerequisites**: plan.md, spec.md, research.md, data-model.md

**Tests**: Included — constitution mandates TDD (Principle II).

**Organization**: Single user story (US1), so phases are compact.

## Format: `[ID] [P?] [Story] Description`

- **[P]**: Can run in parallel (different files, no dependencies)
- **[Story]**: Which user story this task belongs to (e.g., US1)
- Include exact file paths in descriptions

---

## Phase 1: Setup

**Purpose**: Enable Spring scheduling in the application.

- [x] T001 Add `@EnableScheduling` annotation to `backend/src/main/java/de/fete/FeteApplication.java`

---

## Phase 2: User Story 1 — Automatic Cleanup of Expired Events (Priority: P1)

**Goal**: A daily scheduled job deletes all events whose `expiryDate` is in the past, including cascaded RSVPs.

**Independent Test**: Create events with past expiry dates, trigger the cleanup job, verify events and RSVPs are gone.

### Tests for User Story 1

> **NOTE: Write these tests FIRST, ensure they FAIL before implementation**

- [x] T002 [P] [US1] Unit test for `ExpiredEventCleanupJob` in `backend/src/test/java/de/fete/application/service/ExpiredEventCleanupJobTest.java` — verify job calls `deleteExpired()` on repository and logs the count
- [x] T003 [P] [US1] Integration test for native DELETE query in `backend/src/test/java/de/fete/adapter/out/persistence/EventPersistenceAdapterIntegrationTest.java` — verify expired events + RSVPs are deleted, non-expired events survive

### Implementation for User Story 1

- [x] T004 [P] [US1] Add `int deleteExpired()` method to port interface `backend/src/main/java/de/fete/domain/port/out/EventRepository.java`
- [x] T005 [P] [US1] Add native `@Modifying @Query("DELETE FROM events WHERE expiry_date < CURRENT_DATE")` method to `backend/src/main/java/de/fete/adapter/out/persistence/EventJpaRepository.java`
- [x] T006 [US1] Implement `deleteExpired()` in `backend/src/main/java/de/fete/adapter/out/persistence/EventPersistenceAdapter.java` — delegates to JPA repository native query
- [x] T007 [US1] Create `ExpiredEventCleanupJob` with `@Scheduled(cron = "0 0 3 * * *")` in `backend/src/main/java/de/fete/application/service/ExpiredEventCleanupJob.java` — calls `deleteExpired()`, logs count at INFO level

**Checkpoint**: All tests pass. Expired events are automatically deleted daily at 03:00.

---

## Dependencies & Execution Order

### Phase Dependencies

- **Setup (Phase 1)**: No dependencies — can start immediately
- **User Story 1 (Phase 2)**: Depends on Setup completion

### Within User Story 1

- T002, T003 (tests) can run in parallel — write first, must fail (RED)
- T004, T005 (port + JPA query) can run in parallel — different files
- T006 depends on T004 + T005 (adapter implements port, delegates to JPA)
- T007 depends on T006 (job calls adapter via port)
- After T007: all tests should pass (GREEN)

### Parallel Opportunities

```
T002 ──┐
       ├── (tests written, failing)
T003 ──┘

T004 ──┐
       ├── T006 ── T007 ── (all tests green)
T005 ──┘
```

---

## Implementation Strategy

### MVP (this is the MVP — single story)

1. T001: Enable scheduling
2. T002 + T003: Write failing tests (RED)
3. T004 + T005: Port interface + native query (parallel)
4. T006: Adapter implementation
5. T007: Scheduled job
6. Verify all tests pass (GREEN)
7. Done — commit and ship

---

## Notes

- Total tasks: 7
- User Story 1 tasks: 6 (T002–T007)
- Setup tasks: 1 (T001)
- Parallel opportunities: T002||T003, T004||T005
- No frontend changes needed
- No API/OpenAPI changes needed
- No new migrations needed (existing schema + FK constraints sufficient)
