Co sądzicie o tym agregacie (DDD) do rezerwowania i anulowania biletów? Jest ok, czy jakoś inaczej byście go zrobili?
@Entity
@Table(name = "screenings")
@Getter
@ToString(exclude = "tickets")
public class Screening {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private LocalDateTime date;
private Long filmId;
private Long hallId;
@OneToMany
private List<Ticket> tickets;
protected Screening() {}
public Screening(LocalDateTime date, Long filmId, Long hallId
) {
this.date = date;
this.filmId = filmId;
this.hallId = hallId;
this.tickets = new ArrayList<>();
}
public void bookTickets(List<Ticket> tickets, TicketBookingPolicy ticketBookingPolicy) {
ticketBookingPolicy.checkScreeningDate(this.date);
tickets.forEach(ticket -> {
if (this.tickets.contains(ticket)) {
throw new TicketAlreadyExistsException();
}
});
this.tickets.addAll(tickets);
}
public Ticket cancelTicket(Long ticketId, TicketCancellingPolicy ticketCancellingPolicy) {
ticketCancellingPolicy.checkScreeningDate(this.date);
var foundTicket = tickets
.stream()
.filter(ticket -> ticket.getId().equals(ticketId))
.findFirst()
.orElseThrow(TicketNotFoundException::new);
foundTicket.cancel();
return foundTicket;
}
}
Jeden z problemów jaki widzę na razie, to to że przy anulowaniu trzeba się przeiterować po całej kolekcji biletów, ale ta kolekcja nie będzie duża, w najgorszym wypadku ok 100 rekordów.