From daabc65feea294cf7c41a19fd2dfa09123b7d1da Mon Sep 17 00:00:00 2001 From: DualFroz Date: Wed, 26 Aug 2026 12:11:22 +0200 Subject: [PATCH] feat: add operating hours and blackout date entities --- .../slotline/availability/BlackoutDate.java | 61 +++++++++++++++++ .../availability/BlackoutDateRepository.java | 23 +++++++ .../slotline/availability/OperatingHours.java | 65 +++++++++++++++++++ .../OperatingHoursRepository.java | 15 +++++ 4 files changed, 164 insertions(+) create mode 100644 src/main/java/com/slotline/availability/BlackoutDate.java create mode 100644 src/main/java/com/slotline/availability/BlackoutDateRepository.java create mode 100644 src/main/java/com/slotline/availability/OperatingHours.java create mode 100644 src/main/java/com/slotline/availability/OperatingHoursRepository.java diff --git a/src/main/java/com/slotline/availability/BlackoutDate.java b/src/main/java/com/slotline/availability/BlackoutDate.java new file mode 100644 index 0000000..420214f --- /dev/null +++ b/src/main/java/com/slotline/availability/BlackoutDate.java @@ -0,0 +1,61 @@ +package com.slotline.availability; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +import java.time.LocalDate; + +@Entity +@Table(name = "blackout_date") +public class BlackoutDate { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "resource_id", nullable = false) + private Long resourceId; + + @Column(name = "start_date", nullable = false) + private LocalDate startDate; + + @Column(name = "end_date", nullable = false) + private LocalDate endDate; + + @Column(length = 256) + private String reason; + + protected BlackoutDate() { + } + + public BlackoutDate(Long resourceId, LocalDate startDate, LocalDate endDate, String reason) { + this.resourceId = resourceId; + this.startDate = startDate; + this.endDate = endDate; + this.reason = reason; + } + + public Long getId() { + return id; + } + + public Long getResourceId() { + return resourceId; + } + + public LocalDate getStartDate() { + return startDate; + } + + public LocalDate getEndDate() { + return endDate; + } + + public String getReason() { + return reason; + } +} diff --git a/src/main/java/com/slotline/availability/BlackoutDateRepository.java b/src/main/java/com/slotline/availability/BlackoutDateRepository.java new file mode 100644 index 0000000..b5bf567 --- /dev/null +++ b/src/main/java/com/slotline/availability/BlackoutDateRepository.java @@ -0,0 +1,23 @@ +package com.slotline.availability; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.time.LocalDate; +import java.util.List; + +public interface BlackoutDateRepository extends JpaRepository { + + List findByResourceIdOrderByStartDateAsc(Long resourceId); + + @Query(""" + select b from BlackoutDate b + where b.resourceId = :resourceId + and b.startDate <= :until + and b.endDate >= :from + """) + List findOverlapping(@Param("resourceId") Long resourceId, + @Param("from") LocalDate from, + @Param("until") LocalDate until); +} diff --git a/src/main/java/com/slotline/availability/OperatingHours.java b/src/main/java/com/slotline/availability/OperatingHours.java new file mode 100644 index 0000000..076093d --- /dev/null +++ b/src/main/java/com/slotline/availability/OperatingHours.java @@ -0,0 +1,65 @@ +package com.slotline.availability; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +import java.time.DayOfWeek; +import java.time.LocalTime; + +@Entity +@Table(name = "operating_hours") +public class OperatingHours { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "resource_id", nullable = false) + private Long resourceId; + + @Enumerated(EnumType.STRING) + @Column(name = "day_of_week", nullable = false, length = 9) + private DayOfWeek dayOfWeek; + + @Column(name = "open_time", nullable = false) + private LocalTime openTime; + + @Column(name = "close_time", nullable = false) + private LocalTime closeTime; + + protected OperatingHours() { + } + + public OperatingHours(Long resourceId, DayOfWeek dayOfWeek, LocalTime openTime, LocalTime closeTime) { + this.resourceId = resourceId; + this.dayOfWeek = dayOfWeek; + this.openTime = openTime; + this.closeTime = closeTime; + } + + public Long getId() { + return id; + } + + public Long getResourceId() { + return resourceId; + } + + public DayOfWeek getDayOfWeek() { + return dayOfWeek; + } + + public LocalTime getOpenTime() { + return openTime; + } + + public LocalTime getCloseTime() { + return closeTime; + } +} diff --git a/src/main/java/com/slotline/availability/OperatingHoursRepository.java b/src/main/java/com/slotline/availability/OperatingHoursRepository.java new file mode 100644 index 0000000..11768a7 --- /dev/null +++ b/src/main/java/com/slotline/availability/OperatingHoursRepository.java @@ -0,0 +1,15 @@ +package com.slotline.availability; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.time.DayOfWeek; +import java.util.List; + +public interface OperatingHoursRepository extends JpaRepository { + + List findByResourceId(Long resourceId); + + List findByResourceIdAndDayOfWeek(Long resourceId, DayOfWeek dayOfWeek); + + void deleteByResourceId(Long resourceId); +}