8 Commits

Author SHA1 Message Date
bf0f4ffb7f Merge pull request 'Rename path parameter {token} to {eventToken}' (#37) from 015-rename-token-to-eventToken into master
All checks were successful
CI / backend-test (push) Successful in 59s
CI / frontend-test (push) Successful in 27s
CI / frontend-e2e (push) Successful in 1m23s
CI / build-and-publish (push) Successful in 1m12s
2026-03-12 18:11:09 +01:00
58043d1507 Rename path parameter {token} to {eventToken} in OpenAPI spec
All checks were successful
CI / backend-test (push) Successful in 57s
CI / frontend-test (push) Successful in 23s
CI / frontend-e2e (push) Successful in 1m18s
CI / build-and-publish (push) Has been skipped
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>
2026-03-12 18:07:44 +01:00
6d7a55fdb3 Merge pull request 'Update dependency vite to v8' (#31) from renovate/vite-8.x into master
All checks were successful
CI / backend-test (push) Successful in 59s
CI / frontend-test (push) Successful in 27s
CI / frontend-e2e (push) Successful in 1m21s
CI / build-and-publish (push) Has been skipped
Merge pull request 'Update dependency vite to v8' (#31)
2026-03-12 17:55:13 +01:00
a8aacf4ee9 Merge pull request 'Update dependency vitest to v4.1.0' (#33) from renovate/vitest-monorepo into master
Some checks failed
CI / frontend-test (push) Has been cancelled
CI / frontend-e2e (push) Has been cancelled
CI / build-and-publish (push) Has been cancelled
CI / backend-test (push) Has been cancelled
Merge pull request 'Update dependency vitest to v4.1.0' (#33)
2026-03-12 17:55:02 +01:00
0a404ecde3 Merge pull request 'Update dependency @vitejs/plugin-vue to v6.0.5' (#32) from renovate/vitejs-plugin-vue-6.x-lockfile into master
Some checks failed
CI / frontend-test (push) Has been cancelled
CI / frontend-e2e (push) Has been cancelled
CI / build-and-publish (push) Has been cancelled
CI / backend-test (push) Has been cancelled
Merge pull request 'Update dependency @vitejs/plugin-vue to v6.0.5' (#32)
2026-03-12 17:54:54 +01:00
Renovate Bot
7fb296b47f Update dependency vitest to v4.1.0
All checks were successful
CI / backend-test (push) Successful in 1m0s
CI / frontend-test (push) Successful in 23s
CI / frontend-e2e (push) Successful in 1m10s
CI / build-and-publish (push) Has been skipped
2026-03-12 15:02:35 +00:00
Renovate Bot
8ab7d345c8 Update dependency @vitejs/plugin-vue to v6.0.5
All checks were successful
CI / backend-test (push) Successful in 56s
CI / frontend-test (push) Successful in 23s
CI / frontend-e2e (push) Successful in 1m10s
CI / build-and-publish (push) Has been skipped
2026-03-12 15:02:20 +00:00
Renovate Bot
cf2139f229 Update dependency vite to v8
All checks were successful
CI / backend-test (push) Successful in 57s
CI / frontend-test (push) Successful in 27s
CI / frontend-e2e (push) Successful in 1m14s
CI / build-and-publish (push) Has been skipped
2026-03-12 14:02:26 +00:00
8 changed files with 868 additions and 126 deletions

View File

@@ -83,10 +83,10 @@ public class EventController implements EventsApi {
} }
@Override @Override
public ResponseEntity<GetEventResponse> getEvent(UUID token) { public ResponseEntity<GetEventResponse> getEvent(UUID eventToken) {
var eventToken = new de.fete.domain.model.EventToken(token); var evtToken = new EventToken(eventToken);
Event event = getEventUseCase.getByEventToken(eventToken) Event event = getEventUseCase.getByEventToken(evtToken)
.orElseThrow(() -> new EventNotFoundException(token)); .orElseThrow(() -> new EventNotFoundException(eventToken));
var response = new GetEventResponse(); var response = new GetEventResponse();
response.setEventToken(event.getEventToken().value()); response.setEventToken(event.getEventToken().value());
@@ -96,19 +96,19 @@ public class EventController implements EventsApi {
response.setTimezone(event.getTimezone().getId()); response.setTimezone(event.getTimezone().getId());
response.setLocation(event.getLocation()); response.setLocation(event.getLocation());
response.setAttendeeCount( response.setAttendeeCount(
(int) countAttendeesByEventUseCase.countByEvent(eventToken)); (int) countAttendeesByEventUseCase.countByEvent(evtToken));
return ResponseEntity.ok(response); return ResponseEntity.ok(response);
} }
@Override @Override
public ResponseEntity<GetAttendeesResponse> getAttendees( public ResponseEntity<GetAttendeesResponse> getAttendees(
UUID token, UUID organizerToken) { UUID eventToken, UUID organizerToken) {
var eventToken = new EventToken(token); var evtToken = new EventToken(eventToken);
var orgToken = new OrganizerToken(organizerToken); var orgToken = new OrganizerToken(organizerToken);
List<String> names = getAttendeesUseCase List<String> names = getAttendeesUseCase
.getAttendeeNames(eventToken, orgToken); .getAttendeeNames(evtToken, orgToken);
var attendees = names.stream() var attendees = names.stream()
.map(name -> new Attendee().name(name)) .map(name -> new Attendee().name(name))
@@ -122,9 +122,9 @@ public class EventController implements EventsApi {
@Override @Override
public ResponseEntity<CreateRsvpResponse> createRsvp( public ResponseEntity<CreateRsvpResponse> createRsvp(
UUID token, CreateRsvpRequest createRsvpRequest) { UUID eventToken, CreateRsvpRequest createRsvpRequest) {
var eventToken = new EventToken(token); var evtToken = new EventToken(eventToken);
Rsvp rsvp = createRsvpUseCase.createRsvp(eventToken, createRsvpRequest.getName()); Rsvp rsvp = createRsvpUseCase.createRsvp(evtToken, createRsvpRequest.getName());
var response = new CreateRsvpResponse(); var response = new CreateRsvpResponse();
response.setRsvpToken(rsvp.getRsvpToken().value()); response.setRsvpToken(rsvp.getRsvpToken().value());
@@ -134,8 +134,8 @@ public class EventController implements EventsApi {
} }
@Override @Override
public ResponseEntity<Void> cancelRsvp(UUID token, UUID rsvpToken) { public ResponseEntity<Void> cancelRsvp(UUID eventToken, UUID rsvpToken) {
cancelRsvpUseCase.cancelRsvp(new EventToken(token), new RsvpToken(rsvpToken)); cancelRsvpUseCase.cancelRsvp(new EventToken(eventToken), new RsvpToken(rsvpToken));
return ResponseEntity.noContent().build(); return ResponseEntity.noContent().build();
} }

View File

@@ -68,17 +68,17 @@ public class SpaController {
/** Serves SPA HTML with event-specific meta-tags. */ /** Serves SPA HTML with event-specific meta-tags. */
@GetMapping( @GetMapping(
value = "/events/{token}", value = "/events/{eventToken}",
produces = MediaType.TEXT_HTML_VALUE produces = MediaType.TEXT_HTML_VALUE
) )
@ResponseBody @ResponseBody
public String serveEventPage(@PathVariable String token, public String serveEventPage(@PathVariable String eventToken,
HttpServletRequest request) { HttpServletRequest request) {
if (htmlTemplate == null) { if (htmlTemplate == null) {
return ""; return "";
} }
String baseUrl = getBaseUrl(request); String baseUrl = getBaseUrl(request);
Map<String, String> meta = resolveEventMeta(token, baseUrl); Map<String, String> meta = resolveEventMeta(eventToken, baseUrl);
return htmlTemplate.replace(PLACEHOLDER, renderTags(meta)); return htmlTemplate.replace(PLACEHOLDER, renderTags(meta));
} }

View File

@@ -37,7 +37,7 @@ paths:
schema: schema:
$ref: "#/components/schemas/ValidationProblemDetail" $ref: "#/components/schemas/ValidationProblemDetail"
/events/{token}/rsvps/{rsvpToken}: /events/{eventToken}/rsvps/{rsvpToken}:
delete: delete:
operationId: cancelRsvp operationId: cancelRsvp
summary: Cancel RSVP summary: Cancel RSVP
@@ -47,7 +47,7 @@ paths:
tags: tags:
- events - events
parameters: parameters:
- name: token - name: eventToken
in: path in: path
required: true required: true
schema: schema:
@@ -69,14 +69,14 @@ paths:
"500": "500":
description: Internal server error description: Internal server error
/events/{token}/rsvps: /events/{eventToken}/rsvps:
post: post:
operationId: createRsvp operationId: createRsvp
summary: Submit an RSVP for an event summary: Submit an RSVP for an event
tags: tags:
- events - events
parameters: parameters:
- name: token - name: eventToken
in: path in: path
required: true required: true
schema: schema:
@@ -115,14 +115,14 @@ paths:
schema: schema:
$ref: "#/components/schemas/ProblemDetail" $ref: "#/components/schemas/ProblemDetail"
/events/{token}/attendees: /events/{eventToken}/attendees:
get: get:
operationId: getAttendees operationId: getAttendees
summary: Get attendee list for an event (organizer only) summary: Get attendee list for an event (organizer only)
tags: tags:
- events - events
parameters: parameters:
- name: token - name: eventToken
in: path in: path
required: true required: true
schema: schema:
@@ -156,14 +156,14 @@ paths:
schema: schema:
$ref: "#/components/schemas/ProblemDetail" $ref: "#/components/schemas/ProblemDetail"
/events/{token}: /events/{eventToken}:
get: get:
operationId: getEvent operationId: getEvent
summary: Get public event details by token summary: Get public event details by token
tags: tags:
- events - events
parameters: parameters:
- name: token - name: eventToken
in: path in: path
required: true required: true
schema: schema:

File diff suppressed because it is too large Load Diff

View File

@@ -48,7 +48,7 @@
"oxlint": "~1.55.0", "oxlint": "~1.55.0",
"prettier": "3.8.1", "prettier": "3.8.1",
"typescript": "~5.9.3", "typescript": "~5.9.3",
"vite": "^7.3.1", "vite": "^8.0.0",
"vite-plugin-vue-devtools": "^8.0.6", "vite-plugin-vue-devtools": "^8.0.6",
"vitest": "^4.0.18", "vitest": "^4.0.18",
"vue-tsc": "^3.2.5" "vue-tsc": "^3.2.5"

View File

@@ -76,10 +76,10 @@ async function confirmDelete() {
if (rsvp) { if (rsvp) {
try { try {
const { response } = await api.DELETE('/events/{token}/rsvps/{rsvpToken}', { const { response } = await api.DELETE('/events/{eventToken}/rsvps/{rsvpToken}', {
params: { params: {
path: { path: {
token: eventToken, eventToken: eventToken,
rsvpToken: rsvp.rsvpToken, rsvpToken: rsvp.rsvpToken,
}, },
}, },

View File

@@ -169,8 +169,8 @@ async function fetchEvent() {
event.value = null event.value = null
try { try {
const { data, error, response } = await api.GET('/events/{token}', { const { data, error, response } = await api.GET('/events/{eventToken}', {
params: { path: { token: route.params.eventToken as string } }, params: { path: { eventToken: route.params.eventToken as string } },
}) })
if (error) { if (error) {
@@ -217,8 +217,8 @@ async function submitRsvp() {
submitting.value = true submitting.value = true
try { try {
const { data, error } = await api.POST('/events/{token}/rsvps', { const { data, error } = await api.POST('/events/{eventToken}/rsvps', {
params: { path: { token: route.params.eventToken as string } }, params: { path: { eventToken: route.params.eventToken as string } },
body: { name: nameInput.value }, body: { name: nameInput.value },
}) })
@@ -256,10 +256,10 @@ async function handleCancelRsvp() {
if (!stored) return if (!stored) return
try { try {
const { response } = await api.DELETE('/events/{token}/rsvps/{rsvpToken}', { const { response } = await api.DELETE('/events/{eventToken}/rsvps/{rsvpToken}', {
params: { params: {
path: { path: {
token: route.params.eventToken as string, eventToken: route.params.eventToken as string,
rsvpToken: stored.rsvpToken, rsvpToken: stored.rsvpToken,
}, },
}, },
@@ -281,9 +281,9 @@ async function handleCancelRsvp() {
async function fetchAttendees(eventToken: string, organizerToken: string) { async function fetchAttendees(eventToken: string, organizerToken: string) {
try { try {
const { data, error } = await api.GET('/events/{token}/attendees', { const { data, error } = await api.GET('/events/{eventToken}/attendees', {
params: { params: {
path: { token: eventToken }, path: { eventToken: eventToken },
query: { organizerToken }, query: { organizerToken },
}, },
}) })

View File

@@ -280,8 +280,8 @@ describe('EventDetailView', () => {
await flushPromises() await flushPromises()
// Verify API call // Verify API call
expect(vi.mocked(api.POST)).toHaveBeenCalledWith('/events/{token}/rsvps', { expect(vi.mocked(api.POST)).toHaveBeenCalledWith('/events/{eventToken}/rsvps', {
params: { path: { token: 'test-token' } }, params: { path: { eventToken: 'test-token' } },
body: { name: 'Max' }, body: { name: 'Max' },
}) })