Add public event detail page (007-view-event) #14

Merged
nitrix merged 7 commits from 007-view-event into master 2026-03-06 22:57:04 +01:00
Owner

Summary

  • Public event detail page at /events/:token — guests view event info via shared link
  • Backend: GET /api/events/{token} endpoint, timezone field added to Event model (cross-cutting to US-1)
  • Frontend: EventDetailView.vue with five states: loading (skeleton shimmer), loaded, expired, not-found, server error (retry)
  • Date/time formatted via Intl.DateTimeFormat with browser locale and IANA timezone label

Changes

Backend

  • OpenAPI: GET /events/{token} + GetEventResponse schema, timezone on create request/response
  • Liquibase: timezone VARCHAR(64) NOT NULL DEFAULT 'UTC' column
  • New GetEventUseCase inbound port, implemented in EventService
  • Controller computes expired flag (expiryDate vs server clock) and attendeeCount (hardcoded 0 until RSVP)
  • Integration tests refactored: DTOs + ObjectMapper instead of inline JSON, GET tests seed DB directly via JpaRepository

Frontend

  • EventDetailView.vue with openapi-fetch, skeleton shimmer (CSS-only), retry on error
  • Router: /events/:token route
  • Create form sends auto-detected timezone
  • Unit tests (Vitest) for all five view states
  • E2E tests (Playwright + MSW) for loaded, expired, not-found, server error

Test plan

  • Backend: 38 tests pass (./mvnw verify — includes checkstyle)
  • Frontend unit: 30 tests pass
  • Frontend E2E: 13 tests pass
## Summary - Public event detail page at `/events/:token` — guests view event info via shared link - Backend: `GET /api/events/{token}` endpoint, `timezone` field added to Event model (cross-cutting to US-1) - Frontend: `EventDetailView.vue` with five states: loading (skeleton shimmer), loaded, expired, not-found, server error (retry) - Date/time formatted via `Intl.DateTimeFormat` with browser locale and IANA timezone label ## Changes ### Backend - OpenAPI: `GET /events/{token}` + `GetEventResponse` schema, `timezone` on create request/response - Liquibase: `timezone VARCHAR(64) NOT NULL DEFAULT 'UTC'` column - New `GetEventUseCase` inbound port, implemented in `EventService` - Controller computes `expired` flag (expiryDate vs server clock) and `attendeeCount` (hardcoded 0 until RSVP) - Integration tests refactored: DTOs + ObjectMapper instead of inline JSON, GET tests seed DB directly via JpaRepository ### Frontend - `EventDetailView.vue` with openapi-fetch, skeleton shimmer (CSS-only), retry on error - Router: `/events/:token` route - Create form sends auto-detected timezone - Unit tests (Vitest) for all five view states - E2E tests (Playwright + MSW) for loaded, expired, not-found, server error ## Test plan - [x] Backend: 38 tests pass (`./mvnw verify` — includes checkstyle) - [x] Frontend unit: 30 tests pass - [x] Frontend E2E: 13 tests pass
nitrix added 5 commits 2026-03-06 22:43:39 +01:00
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>
OpenAPI: new GetEventResponse schema, timezone on Create request/response.
Liquibase: add timezone VARCHAR(64) NOT NULL DEFAULT 'UTC' column.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Domain: add timezone field to Event and CreateEventCommand.
Ports: new GetEventUseCase inbound port.
Service: implement getByEventToken, validate IANA timezone on create.
Controller: map to GetEventResponse, compute expired flag via Clock.
Persistence: timezone column in JPA entity and mapping.
Tests: integration tests use DTOs + ObjectMapper instead of inline JSON,
GET tests seed DB directly via JpaRepository for isolation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New view fetches event via openapi-fetch, formats date/time with
Intl.DateTimeFormat. Skeleton shimmer during loading (CSS-only).
Create form now sends auto-detected timezone.
Unit tests for all five view states, E2E tests with MSW mocks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add test-results/ to gitignore
Some checks failed
CI / backend-test (push) Successful in 1m1s
CI / frontend-test (push) Failing after 17s
CI / frontend-e2e (push) Successful in 52s
CI / build-and-publish (push) Has been skipped
cd71110514
Playwright test artifacts should not be tracked.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
nitrix added 2 commits 2026-03-06 22:54:50 +01:00
- Add missing timezone field to CreateEventResponse mock
- Fix createTestRouter signature to accept optional token parameter
- Add non-null assertion for dateField element access

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use vue-tsc --build in frontend hook to match CI
All checks were successful
CI / backend-test (push) Successful in 57s
CI / frontend-test (push) Successful in 21s
CI / frontend-e2e (push) Successful in 52s
CI / build-and-publish (push) Has been skipped
fd9175925e
The hook used --noEmit which is less strict than CI's --build,
causing type errors to slip through.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
nitrix scheduled this pull request to auto merge when all checks succeed 2026-03-06 22:55:02 +01:00
nitrix merged commit 5f50ea991b into master 2026-03-06 22:57:04 +01:00
nitrix deleted branch 007-view-event 2026-03-06 22:57:04 +01:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: nitrix/fete#14