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>
121 lines
2.7 KiB
Java
121 lines
2.7 KiB
Java
package de.fete.domain.model;
|
|
|
|
import java.time.LocalDate;
|
|
import java.time.OffsetDateTime;
|
|
import java.time.ZoneId;
|
|
|
|
/** Domain entity representing an event. */
|
|
public class Event {
|
|
|
|
private Long id;
|
|
private EventToken eventToken;
|
|
private OrganizerToken organizerToken;
|
|
private String title;
|
|
private String description;
|
|
private OffsetDateTime dateTime;
|
|
private ZoneId timezone;
|
|
private String location;
|
|
private LocalDate expiryDate;
|
|
private OffsetDateTime createdAt;
|
|
|
|
/** Returns the internal database ID. */
|
|
public Long getId() {
|
|
return id;
|
|
}
|
|
|
|
/** Sets the internal database ID. */
|
|
public void setId(Long id) {
|
|
this.id = id;
|
|
}
|
|
|
|
/** Returns the public event token. */
|
|
public EventToken getEventToken() {
|
|
return eventToken;
|
|
}
|
|
|
|
/** Sets the public event token. */
|
|
public void setEventToken(EventToken eventToken) {
|
|
this.eventToken = eventToken;
|
|
}
|
|
|
|
/** Returns the secret organizer token. */
|
|
public OrganizerToken getOrganizerToken() {
|
|
return organizerToken;
|
|
}
|
|
|
|
/** Sets the secret organizer token. */
|
|
public void setOrganizerToken(OrganizerToken organizerToken) {
|
|
this.organizerToken = organizerToken;
|
|
}
|
|
|
|
/** Returns the event title. */
|
|
public String getTitle() {
|
|
return title;
|
|
}
|
|
|
|
/** Sets the event title. */
|
|
public void setTitle(String title) {
|
|
this.title = title;
|
|
}
|
|
|
|
/** Returns the event description. */
|
|
public String getDescription() {
|
|
return description;
|
|
}
|
|
|
|
/** Sets the event description. */
|
|
public void setDescription(String description) {
|
|
this.description = description;
|
|
}
|
|
|
|
/** Returns the event date and time with UTC offset. */
|
|
public OffsetDateTime getDateTime() {
|
|
return dateTime;
|
|
}
|
|
|
|
/** Sets the event date and time. */
|
|
public void setDateTime(OffsetDateTime dateTime) {
|
|
this.dateTime = dateTime;
|
|
}
|
|
|
|
/** Returns the IANA timezone. */
|
|
public ZoneId getTimezone() {
|
|
return timezone;
|
|
}
|
|
|
|
/** Sets the IANA timezone. */
|
|
public void setTimezone(ZoneId timezone) {
|
|
this.timezone = timezone;
|
|
}
|
|
|
|
/** Returns the event location. */
|
|
public String getLocation() {
|
|
return location;
|
|
}
|
|
|
|
/** Sets the event location. */
|
|
public void setLocation(String location) {
|
|
this.location = location;
|
|
}
|
|
|
|
/** Returns the expiry date after which event data is deleted. */
|
|
public LocalDate getExpiryDate() {
|
|
return expiryDate;
|
|
}
|
|
|
|
/** Sets the expiry date. */
|
|
public void setExpiryDate(LocalDate expiryDate) {
|
|
this.expiryDate = expiryDate;
|
|
}
|
|
|
|
/** Returns the creation timestamp. */
|
|
public OffsetDateTime getCreatedAt() {
|
|
return createdAt;
|
|
}
|
|
|
|
/** Sets the creation timestamp. */
|
|
public void setCreatedAt(OffsetDateTime createdAt) {
|
|
this.createdAt = createdAt;
|
|
}
|
|
}
|