Aligns the path parameter naming with the value object convention
used throughout the codebase (eventToken, rsvpToken, organizerToken).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allows guests to cancel their RSVP via a DELETE endpoint using their
guestToken. Frontend shows cancel button in RsvpBar and clears local
storage on success. Includes unit tests, integration tests, and E2E spec.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a Spring @Scheduled job (daily at 03:00) that deletes all events
whose expiry_date is before CURRENT_DATE using a native SQL DELETE.
RSVPs are cascade-deleted via the existing FK constraint.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The expiry date is no longer user-facing: it is removed from the API
(request and response) and the frontend. The backend now automatically
calculates it as the event date plus 7 days. The expired banner and
RSVP-bar filtering by expired status are also removed from the UI,
since expiry is purely an internal data-retention mechanism.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace PathResourceResolver SPA fallback with SpaController that
injects OG/Twitter meta-tags into cached index.html template.
Event pages get event-specific tags (title, date, location),
all other pages get generic fete branding. Includes og-image.png
brand asset and forward-headers-strategy for proxy support.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wrap the "I'm attending" button with animated glow-border and
glass-inner styling. Update test selectors for new structure.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use .glass class on form fields and buttons on gradient backgrounds.
Buttons get gradient glow border via background-clip trick. Solid
white fallback preserved for BottomSheet context.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Centralize all hardcoded rgba color values into CSS custom properties
and extract glass/glow styles into reusable utility classes (.glass,
.glass-inner, .glow-border, .glow-border--animated) in main.css.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace solid orange FAB with glassmorphism inner and a conic
gradient border (pink-purple-indigo) with subtle glow halo.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace hard-edged color overlay with CSS mask-image fade-out and
increase hero height to 420px for a seamless blend into the aurora
mesh background.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use layered radial gradients on a dark base (#1B1730) with
backdrop blur for an organic, aurora-like background effect
that better complements the glassmorphism event cards.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace solid white event cards with glass-effect cards featuring
backdrop blur, semi-transparent gradient backgrounds, and light
borders that blend with the Electric Dusk gradient background.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New GET /events/{token}/attendees endpoint returns attendee names when
a valid organizer token is provided (403 otherwise). The frontend
conditionally renders the list below the attendee count for organizers,
silently degrading for visitors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Group events into five temporal sections with section headers, date subheaders,
and context-aware time display (clock time for upcoming, relative for past).
Includes new useEventGrouping composable, SectionHeader and DateSubheader
components, full unit and E2E test coverage.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace card-based event detail view with full-screen gradient layout.
Add hero image with gradient overlay, icon-based meta rows, and
"About" section. Content renders directly on the gradient background
with white text for an app-native feel.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Enable users to see all their saved events on the home screen, sorted
by date with upcoming events first. Key capabilities:
- EventCard with title, relative time display, and organizer/attendee
role badge
- Sortable EventList with past-event visual distinction (faded style)
- Empty state when no events are stored
- Swipe-to-delete gesture with confirmation dialog
- Floating action button for quick event creation
- Rename router param :token → :eventToken across all views
- useRelativeTime composable (Intl.RelativeTimeFormat)
- useEventStorage: add validation, removeEvent(), reactive versioning
- Full E2E and unit test coverage for all new components
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move feature summaries for 18 unimplemented specs into
.specify/memory/ideen.md before deleting the full spec files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Gitea runner cannot reach gitea.com (IPv6 timeout), so switch to
the akkuman/gitea-release-action mirror hosted on GitHub.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Generate changelog from commits between tags and create a Gitea release
using the official gitea-release-action after publishing container images.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds ExpiryDateBeforeEventException (400) when expiryDate <= eventDate,
asserts DB row count unchanged after every rejection in integration tests,
and replaces all hardcoded dates in EventServiceTest with TODAY-relative
expressions derived from the fixed Clock.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds expiry check to RsvpService using an injected Clock for testability,
handles EventExpiredException in GlobalExceptionHandler as 409 Conflict,
and adds unit + integration tests using relative dates from a fixed clock.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduces BottomSheet and RsvpBar components, integrates the RSVP
submission flow into EventDetailView, extends useEventStorage with
saveRsvp/getRsvp, and adds unit tests plus an E2E spec for the RSVP
workflow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prevents future regressions where controllers bypass the application layer
and access repositories directly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The EventController was directly accessing RsvpRepository (an outbound port)
to count attendees, bypassing the application layer. Introduce a dedicated
inbound port and implement it in RsvpService. Remove the now-unused Clock
dependency from RsvpService.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduce typed token value objects (EventToken, OrganizerToken,
RsvpToken) and refactor all existing Event code to use them.
Add POST /events/{token}/rsvps endpoint that persists an RSVP and
returns an rsvpToken. Populate attendeeCount in GET /events/{token}
from a real count query instead of hardcoded 0.
Includes: OpenAPI spec, Liquibase migration (rsvps table with
ON DELETE CASCADE), domain model, hexagonal ports/adapters,
service layer, and full test coverage (unit + integration).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>