From d3a2b86fe3c1d350e707dd07cc3864efeb8f884b Mon Sep 17 00:00:00 2001 From: MichalLuzyna Date: Fri, 11 Apr 2025 00:16:20 +0200 Subject: [PATCH 1/4] Adding Appointment end date to enable searching for conflicts --- .../dataaccess/entity/AppointmentEntity.java | 3 ++ src/main/resources/application.properties | 4 +- .../db/migration/1.0/V0001__Create_schema.sql | 5 ++- .../migration/1.0/V0002__Create_mockdata.sql | 40 +++++++++---------- 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java index 28e888f..8bb65d7 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java @@ -38,6 +38,9 @@ public class AppointmentEntity extends BaseEntity { @Column(name = "DATE_TIME") private Instant dateTime; + @Column(name = "END_DATE_TIME") + private Instant endsAt; + @Enumerated(EnumType.STRING) private AppointmentStatus status; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b4e3d67..135094d 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,7 +2,7 @@ spring.application.name=appointment-booking-app spring.h2.console.enabled=true -spring.datasource.url=jdbc:h2:mem:appointmentbooking +spring.datasource.url=jdbc:h2:mem:appointmentbooking; spring.datasource.username=sa spring.datasource.password=password @@ -13,3 +13,5 @@ management.endpoints.web.exposure.include=* spring.flyway.locations=classpath:db/migration spring.flyway.enabled=true spring.flyway.clean-on-validation-error=true + +spring.jpa.hibernate.ddl-auto=none \ No newline at end of file diff --git a/src/main/resources/db/migration/1.0/V0001__Create_schema.sql b/src/main/resources/db/migration/1.0/V0001__Create_schema.sql index cea91c1..b3ed7d7 100644 --- a/src/main/resources/db/migration/1.0/V0001__Create_schema.sql +++ b/src/main/resources/db/migration/1.0/V0001__Create_schema.sql @@ -49,6 +49,7 @@ CREATE TABLE APPOINTMENT ( ID NUMBER(19,0) NOT NULL, VERSION INTEGER NOT NULL, DATE_TIME TIMESTAMP NOT NULL, + END_DATE_TIME TIMESTAMP NOT NULL, STATUS VARCHAR(128) NOT NULL DEFAULT 'SCHEDULED', CLIENT_ID NUMBER(19,0) NOT NULL, TREATMENT_ID NUMBER(19,0) NOT NULL, @@ -69,6 +70,6 @@ CREATE SEQUENCE APPOINTMENT_SEQ START WITH 1 INCREMENT BY 100 NOCYCLE; -- CREATING INDEX CREATE INDEX IDX_CLIENT_USER ON CLIENT(USER_ID); CREATE INDEX IDX_SPECIAL_USER ON SPECIALIST(USER_ID); -CREATE INDEX IDX_TREATM_SPECIAL ON TREATMENT(SPECIALIST_ID); +CREATE INDEX IDX_TREATM_SPECIAL ON TREATMENT(SPECIALIST_ID, ID); CREATE INDEX IDX_APPOINT_CLIENT ON APPOINTMENT(CLIENT_ID); -CREATE INDEX IDX_APPOINT_TREATM ON APPOINTMENT(TREATMENT_ID); \ No newline at end of file +CREATE INDEX IDX_APPOINT_TREATM ON APPOINTMENT(TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS); \ No newline at end of file diff --git a/src/main/resources/db/migration/1.0/V0002__Create_mockdata.sql b/src/main/resources/db/migration/1.0/V0002__Create_mockdata.sql index 24c169f..ffe8296 100644 --- a/src/main/resources/db/migration/1.0/V0002__Create_mockdata.sql +++ b/src/main/resources/db/migration/1.0/V0002__Create_mockdata.sql @@ -37,23 +37,23 @@ INSERT INTO TREATMENT(ID, VERSION, NAME, DESCRIPTION, DURATION_MINUTES, SPECIALI INSERT INTO TREATMENT(ID, VERSION, NAME, DESCRIPTION, DURATION_MINUTES, SPECIALIST_ID, CREATED, LAST_UPDATED) VALUES (-12, 0, 'Rekonstrukcja więzadła ACL', 'Rekonstrukcją więzadła krzyżowego przedniego (ACL) z zastąpieniem uszkodzonego więzadła nowym więzadłem ze ścięgien pacjenta.', 180, -4, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -- APPOINTMENTS -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-1, 0, -1, -1, '2024-03-01 09:00:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-2, 0, -2, -3, '2024-03-02 10:30:00', 'COMPLETED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-3, 0, -3, -5, '2024-03-03 14:00:00', 'CANCELLED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-4, 0, -4, -10, '2024-03-04 08:15:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-5, 0, -1, -2, '2024-03-05 11:45:00', 'COMPLETED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-6, 0, -2, -4, '2024-03-06 16:30:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-7, 0, -3, -6, '2024-03-07 09:30:00', 'CANCELLED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-8, 0, -4, -11, '2024-03-08 13:45:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-9, 0, -1, -7, '2024-03-09 10:00:00', 'COMPLETED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-10, 0, -2, -8, '2024-03-10 12:30:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-11, 0, -3, -9, '2024-03-11 15:00:00', 'CANCELLED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-12, 0, -4, -12, '2024-03-12 17:15:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-13, 0, -1, -1, '2024-03-13 08:30:00', 'COMPLETED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-14, 0, -2, -3, '2024-03-14 11:00:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-15, 0, -3, -5, '2024-03-15 13:00:00', 'CANCELLED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-16, 0, -4, -10, '2024-03-16 09:15:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-17, 0, -1, -2, '2024-03-17 14:45:00', 'COMPLETED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-18, 0, -2, -4, '2024-03-18 16:00:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-19, 0, -3, -6, '2024-03-19 10:45:00', 'CANCELLED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-20, 0, -4, -11, '2024-03-20 12:15:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); \ No newline at end of file +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-1, 0, -1, -1, '2024-03-01 09:00:00', '2024-03-01 09:15:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-2, 0, -2, -3, '2024-03-02 10:30:00', '2024-03-02 10:45:00', 'COMPLETED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-3, 0, -3, -5, '2024-03-03 14:00:00', '2024-03-03 14:15:00', 'CANCELLED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-4, 0, -4, -10, '2024-03-04 08:15:00', '2024-03-04 08:30:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-5, 0, -1, -2, '2024-03-05 11:45:00', '2024-03-05 12:00:00', 'COMPLETED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-6, 0, -2, -4, '2024-03-06 16:30:00', '2024-03-06 16:45:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-7, 0, -3, -6, '2024-03-07 09:30:00', '2024-03-07 09:45:00', 'CANCELLED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-8, 0, -4, -11, '2024-03-08 13:45:00', '2024-03-08 14:00:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-9, 0, -1, -7, '2024-03-09 10:00:00', '2024-03-09 10:15:00', 'COMPLETED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-10, 0, -2, -8, '2024-03-10 12:30:00', '2024-03-10 12:45:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-11, 0, -3, -9, '2024-03-11 15:00:00', '2024-03-11 15:15:00', 'CANCELLED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-12, 0, -4, -12,'2024-03-12 17:15:00', '2024-03-12 17:30:00','SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-13, 0, -1, -1, '2024-03-13 08:30:00', '2024-03-13 08:45:00', 'COMPLETED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-14, 0, -2, -3, '2024-03-14 11:00:00', '2024-03-14 11:15:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-15, 0, -3, -5, '2024-03-15 13:00:00', '2024-03-15 13:15:00', 'CANCELLED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-16, 0, -4, -10,'2024-03-16 09:15:00', '2024-03-16 09:30:00','SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-17, 0, -1, -2, '2024-03-17 14:45:00', '2024-03-17 15:00:00', 'COMPLETED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-18, 0, -2, -4, '2024-03-18 16:00:00', '2024-03-18 16:15:00', 'SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-19, 0, -3, -6, '2024-03-19 10:45:00', '2024-03-19 11:00:00', 'CANCELLED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); +INSERT INTO APPOINTMENT(ID, VERSION, CLIENT_ID, TREATMENT_ID, DATE_TIME, END_DATE_TIME, STATUS, CREATED, LAST_UPDATED) VALUES (-20, 0, -4, -11,'2024-03-20 12:15:00', '2024-03-20 12:30:00','SCHEDULED', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); \ No newline at end of file From e12fc684541ed890f8900d7fc0793177234fba12 Mon Sep 17 00:00:00 2001 From: MichalLuzyna Date: Fri, 11 Apr 2025 13:45:55 +0200 Subject: [PATCH 2/4] Fixing review comments --- .../dataaccess/entity/AppointmentEntity.java | 21 +++++++++++++++++++ src/main/resources/application.properties | 6 ++++-- src/main/resources/banner/jbf_banner.txt | 8 +++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/banner/jbf_banner.txt diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java index 8bb65d7..ae6a2bb 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java @@ -1,6 +1,7 @@ package com.capgemini.training.appointmentbooking.dataaccess.entity; import java.time.Instant; +import java.util.Objects; import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; @@ -44,4 +45,24 @@ public class AppointmentEntity extends BaseEntity { @Enumerated(EnumType.STRING) private AppointmentStatus status; + @Override + public void prePersist() { + super.prePersist(); + validateDates(); + } + + @Override + public void preUpdate() { + super.preUpdate(); + validateDates(); + } + + private void validateDates() { + Objects.requireNonNull(this.dateTime); + Objects.requireNonNull(this.endsAt); + if(!this.endsAt.isAfter(this.dateTime)) + { + throw new IllegalStateException(String.format("Starting date: %s must be before end date: %s", this.dateTime, this.endsAt)); + } + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 135094d..141d23b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,7 +2,7 @@ spring.application.name=appointment-booking-app spring.h2.console.enabled=true -spring.datasource.url=jdbc:h2:mem:appointmentbooking; +spring.datasource.url=jdbc:h2:mem:appointmentbooking spring.datasource.username=sa spring.datasource.password=password @@ -14,4 +14,6 @@ spring.flyway.locations=classpath:db/migration spring.flyway.enabled=true spring.flyway.clean-on-validation-error=true -spring.jpa.hibernate.ddl-auto=none \ No newline at end of file +spring.jpa.hibernate.ddl-auto=none + +spring.banner.location=classpath:/banner/jbf_banner.txt diff --git a/src/main/resources/banner/jbf_banner.txt b/src/main/resources/banner/jbf_banner.txt new file mode 100644 index 0000000..a39f9ef --- /dev/null +++ b/src/main/resources/banner/jbf_banner.txt @@ -0,0 +1,8 @@ + ,--. ,-----. ,--. ,--. ,------. ,--. ,--. ,--. + | | ,--,--.,--. ,--.,--,--. | |) /_ ,--,--.,---.| |,-. ,---. ,--,--, ,-| | | .---',--.,--.,--,--, ,-| | ,--,--.,-' '-.`--' ,---. ,--,--, +,--. | |' ,-. | \ `' /' ,-. | | .-. \' ,-. | .--'| /| .-. :| \' .-. | | `--, | || || \' .-. |' ,-. |'-. .-',--.| .-. || \ +| '-' /\ '-' | \ / \ '-' | | '--' /\ '-' \ `--.| \ \\ --.| || |\ `-' | | |` ' '' '| || |\ `-' |\ '-' | | | | |' '-' '| || | + `-----' `--`--' `--' `--`--' `------' `--`--'`---'`--'`--'`----'`--''--' `---' `--' `----' `--''--' `---' `--`--' `--' `--' `---' `--''--' + +${application.title} ${application.version} +Powered by Spring Boot ${spring-boot.version} \ No newline at end of file From 7c94e8a3c38364aa915c141ebc1a8d266f824741 Mon Sep 17 00:00:00 2001 From: MichalLuzyna Date: Fri, 11 Apr 2025 13:50:22 +0200 Subject: [PATCH 3/4] spotless --- .../AppointmentBookingAppApplication.java | 26 ++-- .../common/datatype/AppointmentStatus.java | 10 +- .../common/datatype/Specialization.java | 54 +++---- .../converter/SpecializationConverter.java | 50 +++---- .../dataaccess/entity/AppointmentEntity.java | 136 +++++++++--------- .../dataaccess/entity/BaseEntity.java | 76 +++++----- .../dataaccess/entity/ClientEntity.java | 72 +++++----- .../dataaccess/entity/SpecialistEntity.java | 84 +++++------ .../dataaccess/entity/TreatmentEntity.java | 72 +++++----- .../dataaccess/entity/UserEntity.java | 70 ++++----- .../AppointmentBookingAppApplicationIT.java | 26 ++-- .../dataaccess/entity/EntitySmokeIT.java | 74 +++++----- 12 files changed, 375 insertions(+), 375 deletions(-) diff --git a/src/main/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplication.java b/src/main/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplication.java index 1639ccf..e1516cc 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplication.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplication.java @@ -1,13 +1,13 @@ -package com.capgemini.training.appointmentbooking; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class AppointmentBookingAppApplication { - - public static void main(String[] args) { - SpringApplication.run(AppointmentBookingAppApplication.class, args); - } - -} +package com.capgemini.training.appointmentbooking; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AppointmentBookingAppApplication { + + public static void main(String[] args) { + SpringApplication.run(AppointmentBookingAppApplication.class, args); + } + +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/AppointmentStatus.java b/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/AppointmentStatus.java index e6bca11..65aa5c2 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/AppointmentStatus.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/AppointmentStatus.java @@ -1,5 +1,5 @@ -package com.capgemini.training.appointmentbooking.common.datatype; - -public enum AppointmentStatus { - SCHEDULED, CANCELLED, COMPLETED -} +package com.capgemini.training.appointmentbooking.common.datatype; + +public enum AppointmentStatus { + SCHEDULED, CANCELLED, COMPLETED +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/Specialization.java b/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/Specialization.java index b83b85e..0d8f0ab 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/Specialization.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/Specialization.java @@ -1,27 +1,27 @@ -package com.capgemini.training.appointmentbooking.common.datatype; - -import lombok.Getter; - -@Getter -public enum Specialization { - - DENTIST("Dentist"), CARDIOLOGIST("Cardiologist"), PEDIATRICIAN("Pediatrician"), UROLOGIST("Urologist"), NEUROLOGIST( - "Neurologist"), ORTHOPAEDIST("Orthopaedist"); - - private final String name; - - Specialization(String name) { - this.name = name; - } - - public static Specialization getByName(String name) { - - for (Specialization s : Specialization.values()) { - if (s.getName().equals(name)) { - return s; - } - } - return null; - } - -} +package com.capgemini.training.appointmentbooking.common.datatype; + +import lombok.Getter; + +@Getter +public enum Specialization { + + DENTIST("Dentist"), CARDIOLOGIST("Cardiologist"), PEDIATRICIAN("Pediatrician"), UROLOGIST("Urologist"), NEUROLOGIST( + "Neurologist"), ORTHOPAEDIST("Orthopaedist"); + + private final String name; + + Specialization(String name) { + this.name = name; + } + + public static Specialization getByName(String name) { + + for (Specialization s : Specialization.values()) { + if (s.getName().equals(name)) { + return s; + } + } + return null; + } + +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/converter/SpecializationConverter.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/converter/SpecializationConverter.java index 7a24dc0..4d68d76 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/converter/SpecializationConverter.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/converter/SpecializationConverter.java @@ -1,25 +1,25 @@ -package com.capgemini.training.appointmentbooking.dataaccess.converter; -import com.capgemini.training.appointmentbooking.common.datatype.Specialization; - -import jakarta.persistence.AttributeConverter; -import jakarta.persistence.Converter; - -@Converter -public class SpecializationConverter implements AttributeConverter { - - @Override - public String convertToDatabaseColumn(Specialization specialization) { - - return specialization != null ? specialization.getName() : null; - - } - - @Override - public Specialization convertToEntityAttribute(String dbData) { - if (dbData == null) { - return null; - } - return Specialization.getByName(dbData); - } - -} +package com.capgemini.training.appointmentbooking.dataaccess.converter; +import com.capgemini.training.appointmentbooking.common.datatype.Specialization; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; + +@Converter +public class SpecializationConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(Specialization specialization) { + + return specialization != null ? specialization.getName() : null; + + } + + @Override + public Specialization convertToEntityAttribute(String dbData) { + if (dbData == null) { + return null; + } + return Specialization.getByName(dbData); + } + +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java index ae6a2bb..dbe5a88 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java @@ -1,68 +1,68 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import java.time.Instant; -import java.util.Objects; - -import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -@Entity -@Table(name = "APPOINTMENT") -@Getter -@Setter -public class AppointmentEntity extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "APPOINTMENT_SEQ_GEN") - @SequenceGenerator(sequenceName = "APPOINTMENT_SEQ", name = "APPOINTMENT_SEQ_GEN", allocationSize = 100) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - private ClientEntity client; - - @ManyToOne(fetch = FetchType.LAZY) - private TreatmentEntity treatment; - - @Column(name = "DATE_TIME") - private Instant dateTime; - - @Column(name = "END_DATE_TIME") - private Instant endsAt; - - @Enumerated(EnumType.STRING) - private AppointmentStatus status; - - @Override - public void prePersist() { - super.prePersist(); - validateDates(); - } - - @Override - public void preUpdate() { - super.preUpdate(); - validateDates(); - } - - private void validateDates() { - Objects.requireNonNull(this.dateTime); - Objects.requireNonNull(this.endsAt); - if(!this.endsAt.isAfter(this.dateTime)) - { - throw new IllegalStateException(String.format("Starting date: %s must be before end date: %s", this.dateTime, this.endsAt)); - } - } -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import java.time.Instant; +import java.util.Objects; + +import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "APPOINTMENT") +@Getter +@Setter +public class AppointmentEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "APPOINTMENT_SEQ_GEN") + @SequenceGenerator(sequenceName = "APPOINTMENT_SEQ", name = "APPOINTMENT_SEQ_GEN", allocationSize = 100) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + private ClientEntity client; + + @ManyToOne(fetch = FetchType.LAZY) + private TreatmentEntity treatment; + + @Column(name = "DATE_TIME") + private Instant dateTime; + + @Column(name = "END_DATE_TIME") + private Instant endsAt; + + @Enumerated(EnumType.STRING) + private AppointmentStatus status; + + @Override + public void prePersist() { + super.prePersist(); + validateDates(); + } + + @Override + public void preUpdate() { + super.preUpdate(); + validateDates(); + } + + private void validateDates() { + Objects.requireNonNull(this.dateTime); + Objects.requireNonNull(this.endsAt); + if (!this.endsAt.isAfter(this.dateTime)) { + throw new IllegalStateException( + String.format("Starting date: %s must be before end date: %s", this.dateTime, this.endsAt)); + } + } +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/BaseEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/BaseEntity.java index 0f2a645..d7b4587 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/BaseEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/BaseEntity.java @@ -1,38 +1,38 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import java.time.Instant; - -import jakarta.persistence.Column; -import jakarta.persistence.MappedSuperclass; -import jakarta.persistence.PrePersist; -import jakarta.persistence.PreUpdate; -import jakarta.persistence.Version; -import lombok.Getter; -import lombok.Setter; - -@MappedSuperclass -@Getter -public class BaseEntity { - - @Version - @Setter - private int version; - - @Column(updatable = false) - private Instant created; - - @Column(name = "LAST_UPDATED") - private Instant lastUpdated; - - @PrePersist - public void prePersist() { - Instant now = Instant.now(); - this.created = now; - this.lastUpdated = now; - } - - @PreUpdate - public void preUpdate() { - this.lastUpdated = Instant.now(); - } -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import java.time.Instant; + +import jakarta.persistence.Column; +import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.PrePersist; +import jakarta.persistence.PreUpdate; +import jakarta.persistence.Version; +import lombok.Getter; +import lombok.Setter; + +@MappedSuperclass +@Getter +public class BaseEntity { + + @Version + @Setter + private int version; + + @Column(updatable = false) + private Instant created; + + @Column(name = "LAST_UPDATED") + private Instant lastUpdated; + + @PrePersist + public void prePersist() { + Instant now = Instant.now(); + this.created = now; + this.lastUpdated = now; + } + + @PreUpdate + public void preUpdate() { + this.lastUpdated = Instant.now(); + } +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/ClientEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/ClientEntity.java index d20c99e..a592b26 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/ClientEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/ClientEntity.java @@ -1,36 +1,36 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import java.util.List; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.OneToMany; -import jakarta.persistence.OneToOne; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -@Entity -@Table(name = "CLIENT") -@Getter -@Setter -public class ClientEntity extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CLIENT_SEQ_GEN") - @SequenceGenerator(sequenceName = "CLIENT_SEQ", name = "CLIENT_SEQ_GEN", allocationSize = 100) - private Long id; - - @OneToOne(optional = false, fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST}) - private UserEntity user; - - @OneToMany(mappedBy = "client", fetch = FetchType.LAZY, orphanRemoval = true, cascade = {CascadeType.PERSIST, - CascadeType.REMOVE}) - private List appointments; - -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import java.util.List; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "CLIENT") +@Getter +@Setter +public class ClientEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CLIENT_SEQ_GEN") + @SequenceGenerator(sequenceName = "CLIENT_SEQ", name = "CLIENT_SEQ_GEN", allocationSize = 100) + private Long id; + + @OneToOne(optional = false, fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST}) + private UserEntity user; + + @OneToMany(mappedBy = "client", fetch = FetchType.LAZY, orphanRemoval = true, cascade = {CascadeType.PERSIST, + CascadeType.REMOVE}) + private List appointments; + +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/SpecialistEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/SpecialistEntity.java index 63f8ead..d5d3878 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/SpecialistEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/SpecialistEntity.java @@ -1,42 +1,42 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import java.util.List; - -import com.capgemini.training.appointmentbooking.common.datatype.Specialization; -import com.capgemini.training.appointmentbooking.dataaccess.converter.SpecializationConverter; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Convert; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.OneToMany; -import jakarta.persistence.OneToOne; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -@Entity -@Table(name = "SPECIALIST") -@Getter -@Setter -public class SpecialistEntity extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SPECIALIST_SEQ_GEN") - @SequenceGenerator(sequenceName = "SPECIALIST_SEQ", name = "SPECIALIST_SEQ_GEN", allocationSize = 100) - private Long id; - - @OneToOne(optional = false, fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST}) - private UserEntity user; - - @Convert(converter = SpecializationConverter.class) - private Specialization specialization; - - @OneToMany(mappedBy = "specialist", fetch = FetchType.LAZY, orphanRemoval = true, cascade = {CascadeType.PERSIST, - CascadeType.REMOVE}) - private List treatments; -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import java.util.List; + +import com.capgemini.training.appointmentbooking.common.datatype.Specialization; +import com.capgemini.training.appointmentbooking.dataaccess.converter.SpecializationConverter; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "SPECIALIST") +@Getter +@Setter +public class SpecialistEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SPECIALIST_SEQ_GEN") + @SequenceGenerator(sequenceName = "SPECIALIST_SEQ", name = "SPECIALIST_SEQ_GEN", allocationSize = 100) + private Long id; + + @OneToOne(optional = false, fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST}) + private UserEntity user; + + @Convert(converter = SpecializationConverter.class) + private Specialization specialization; + + @OneToMany(mappedBy = "specialist", fetch = FetchType.LAZY, orphanRemoval = true, cascade = {CascadeType.PERSIST, + CascadeType.REMOVE}) + private List treatments; +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/TreatmentEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/TreatmentEntity.java index 25239cd..4deff0e 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/TreatmentEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/TreatmentEntity.java @@ -1,36 +1,36 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -@Entity -@Table(name = "TREATMENT") -@Getter -@Setter -public class TreatmentEntity extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TREATMENT_SEQ_GEN") - @SequenceGenerator(sequenceName = "TREATMENT_SEQ", name = "TREATMENT_SEQ_GEN", allocationSize = 100) - private Long id; - - private String name; - - private String description; - - @Column(name = "DURATION_MINUTES") - private int durationMinutes; - - @ManyToOne(fetch = FetchType.LAZY) - private SpecialistEntity specialist; - -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "TREATMENT") +@Getter +@Setter +public class TreatmentEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TREATMENT_SEQ_GEN") + @SequenceGenerator(sequenceName = "TREATMENT_SEQ", name = "TREATMENT_SEQ_GEN", allocationSize = 100) + private Long id; + + private String name; + + private String description; + + @Column(name = "DURATION_MINUTES") + private int durationMinutes; + + @ManyToOne(fetch = FetchType.LAZY) + private SpecialistEntity specialist; + +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/UserEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/UserEntity.java index 7bd50bc..def78fa 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/UserEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/UserEntity.java @@ -1,35 +1,35 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -@Entity -@Table(name = "USER_TABLE") -@Getter -@Setter -public class UserEntity extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_SEQ_GEN") - @SequenceGenerator(sequenceName = "USER_SEQ", name = "USER_SEQ_GEN", allocationSize = 100) - private Long id; - - private String email; - - @Column(name = "PASSWORD_HASH") - private String passwordHash; - - @Column(name = "FIRST_NAME") - private String firstname; - - @Column(name = "LAST_NAME") - private String lastname; - -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "USER_TABLE") +@Getter +@Setter +public class UserEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_SEQ_GEN") + @SequenceGenerator(sequenceName = "USER_SEQ", name = "USER_SEQ_GEN", allocationSize = 100) + private Long id; + + private String email; + + @Column(name = "PASSWORD_HASH") + private String passwordHash; + + @Column(name = "FIRST_NAME") + private String firstname; + + @Column(name = "LAST_NAME") + private String lastname; + +} diff --git a/src/test/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplicationIT.java b/src/test/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplicationIT.java index ffa63a4..36cfd39 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplicationIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplicationIT.java @@ -1,13 +1,13 @@ -package com.capgemini.training.appointmentbooking; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class AppointmentBookingAppApplicationIT { - - @Test - void contextLoads() { - } - -} +package com.capgemini.training.appointmentbooking; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class AppointmentBookingAppApplicationIT { + + @Test + void contextLoads() { + } + +} diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeIT.java index 3b7a4a9..bdced7a 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeIT.java @@ -1,37 +1,37 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; - -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; - -@DataJpaTest -public class EntitySmokeIT { - - @PersistenceContext - private EntityManager em; - - @Test - void loadAllClasses() { - - // given - Map, Integer> classMap = Map.of( // - UserEntity.class, 8, // - ClientEntity.class, 4, // - SpecialistEntity.class, 4, // - TreatmentEntity.class, 12, // - AppointmentEntity.class, 20); - - // when //then - classMap.forEach((entityType, - expectedCount) -> assertThat( - (List) em.createQuery("from " + entityType.getSimpleName()).getResultList()) - .hasSize(expectedCount)); - } -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; + +@DataJpaTest +public class EntitySmokeIT { + + @PersistenceContext + private EntityManager em; + + @Test + void loadAllClasses() { + + // given + Map, Integer> classMap = Map.of( // + UserEntity.class, 8, // + ClientEntity.class, 4, // + SpecialistEntity.class, 4, // + TreatmentEntity.class, 12, // + AppointmentEntity.class, 20); + + // when //then + classMap.forEach((entityType, + expectedCount) -> assertThat( + (List) em.createQuery("from " + entityType.getSimpleName()).getResultList()) + .hasSize(expectedCount)); + } +} From 02fc98d77d8e01d5702b432eab40f5505cc2b34f Mon Sep 17 00:00:00 2001 From: MichalLuzyna Date: Fri, 11 Apr 2025 14:13:43 +0200 Subject: [PATCH 4/4] Line endings --- .gitattributes | 7 + .../AppointmentBookingAppApplication.java | 26 ++-- .../common/datatype/AppointmentStatus.java | 10 +- .../common/datatype/Specialization.java | 54 +++---- .../converter/SpecializationConverter.java | 50 +++---- .../dataaccess/entity/AppointmentEntity.java | 136 +++++++++--------- .../dataaccess/entity/BaseEntity.java | 76 +++++----- .../dataaccess/entity/ClientEntity.java | 72 +++++----- .../dataaccess/entity/SpecialistEntity.java | 84 +++++------ .../dataaccess/entity/TreatmentEntity.java | 72 +++++----- .../dataaccess/entity/UserEntity.java | 70 ++++----- .../AppointmentBookingAppApplicationIT.java | 26 ++-- .../dataaccess/entity/EntitySmokeIT.java | 74 +++++----- 13 files changed, 382 insertions(+), 375 deletions(-) diff --git a/.gitattributes b/.gitattributes index 3b41682..44153cd 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,9 @@ /mvnw text eol=lf *.cmd text eol=crlf +* text eol=lf +*.bat eol=crlf +*.htm text diff=html +*.html text diff=html +*.xhtml text diff=html +*.java text diff=java +*.css text diff=css \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplication.java b/src/main/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplication.java index e1516cc..1639ccf 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplication.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplication.java @@ -1,13 +1,13 @@ -package com.capgemini.training.appointmentbooking; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class AppointmentBookingAppApplication { - - public static void main(String[] args) { - SpringApplication.run(AppointmentBookingAppApplication.class, args); - } - -} +package com.capgemini.training.appointmentbooking; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AppointmentBookingAppApplication { + + public static void main(String[] args) { + SpringApplication.run(AppointmentBookingAppApplication.class, args); + } + +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/AppointmentStatus.java b/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/AppointmentStatus.java index 65aa5c2..e6bca11 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/AppointmentStatus.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/AppointmentStatus.java @@ -1,5 +1,5 @@ -package com.capgemini.training.appointmentbooking.common.datatype; - -public enum AppointmentStatus { - SCHEDULED, CANCELLED, COMPLETED -} +package com.capgemini.training.appointmentbooking.common.datatype; + +public enum AppointmentStatus { + SCHEDULED, CANCELLED, COMPLETED +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/Specialization.java b/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/Specialization.java index 0d8f0ab..b83b85e 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/Specialization.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/Specialization.java @@ -1,27 +1,27 @@ -package com.capgemini.training.appointmentbooking.common.datatype; - -import lombok.Getter; - -@Getter -public enum Specialization { - - DENTIST("Dentist"), CARDIOLOGIST("Cardiologist"), PEDIATRICIAN("Pediatrician"), UROLOGIST("Urologist"), NEUROLOGIST( - "Neurologist"), ORTHOPAEDIST("Orthopaedist"); - - private final String name; - - Specialization(String name) { - this.name = name; - } - - public static Specialization getByName(String name) { - - for (Specialization s : Specialization.values()) { - if (s.getName().equals(name)) { - return s; - } - } - return null; - } - -} +package com.capgemini.training.appointmentbooking.common.datatype; + +import lombok.Getter; + +@Getter +public enum Specialization { + + DENTIST("Dentist"), CARDIOLOGIST("Cardiologist"), PEDIATRICIAN("Pediatrician"), UROLOGIST("Urologist"), NEUROLOGIST( + "Neurologist"), ORTHOPAEDIST("Orthopaedist"); + + private final String name; + + Specialization(String name) { + this.name = name; + } + + public static Specialization getByName(String name) { + + for (Specialization s : Specialization.values()) { + if (s.getName().equals(name)) { + return s; + } + } + return null; + } + +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/converter/SpecializationConverter.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/converter/SpecializationConverter.java index 4d68d76..7a24dc0 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/converter/SpecializationConverter.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/converter/SpecializationConverter.java @@ -1,25 +1,25 @@ -package com.capgemini.training.appointmentbooking.dataaccess.converter; -import com.capgemini.training.appointmentbooking.common.datatype.Specialization; - -import jakarta.persistence.AttributeConverter; -import jakarta.persistence.Converter; - -@Converter -public class SpecializationConverter implements AttributeConverter { - - @Override - public String convertToDatabaseColumn(Specialization specialization) { - - return specialization != null ? specialization.getName() : null; - - } - - @Override - public Specialization convertToEntityAttribute(String dbData) { - if (dbData == null) { - return null; - } - return Specialization.getByName(dbData); - } - -} +package com.capgemini.training.appointmentbooking.dataaccess.converter; +import com.capgemini.training.appointmentbooking.common.datatype.Specialization; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; + +@Converter +public class SpecializationConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(Specialization specialization) { + + return specialization != null ? specialization.getName() : null; + + } + + @Override + public Specialization convertToEntityAttribute(String dbData) { + if (dbData == null) { + return null; + } + return Specialization.getByName(dbData); + } + +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java index dbe5a88..12eeb0c 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/AppointmentEntity.java @@ -1,68 +1,68 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import java.time.Instant; -import java.util.Objects; - -import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -@Entity -@Table(name = "APPOINTMENT") -@Getter -@Setter -public class AppointmentEntity extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "APPOINTMENT_SEQ_GEN") - @SequenceGenerator(sequenceName = "APPOINTMENT_SEQ", name = "APPOINTMENT_SEQ_GEN", allocationSize = 100) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - private ClientEntity client; - - @ManyToOne(fetch = FetchType.LAZY) - private TreatmentEntity treatment; - - @Column(name = "DATE_TIME") - private Instant dateTime; - - @Column(name = "END_DATE_TIME") - private Instant endsAt; - - @Enumerated(EnumType.STRING) - private AppointmentStatus status; - - @Override - public void prePersist() { - super.prePersist(); - validateDates(); - } - - @Override - public void preUpdate() { - super.preUpdate(); - validateDates(); - } - - private void validateDates() { - Objects.requireNonNull(this.dateTime); - Objects.requireNonNull(this.endsAt); - if (!this.endsAt.isAfter(this.dateTime)) { - throw new IllegalStateException( - String.format("Starting date: %s must be before end date: %s", this.dateTime, this.endsAt)); - } - } -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import java.time.Instant; +import java.util.Objects; + +import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "APPOINTMENT") +@Getter +@Setter +public class AppointmentEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "APPOINTMENT_SEQ_GEN") + @SequenceGenerator(sequenceName = "APPOINTMENT_SEQ", name = "APPOINTMENT_SEQ_GEN", allocationSize = 100) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + private ClientEntity client; + + @ManyToOne(fetch = FetchType.LAZY) + private TreatmentEntity treatment; + + @Column(name = "DATE_TIME") + private Instant dateTime; + + @Column(name = "END_DATE_TIME") + private Instant endsAt; + + @Enumerated(EnumType.STRING) + private AppointmentStatus status; + + @Override + public void prePersist() { + super.prePersist(); + validateDates(); + } + + @Override + public void preUpdate() { + super.preUpdate(); + validateDates(); + } + + private void validateDates() { + Objects.requireNonNull(this.dateTime); + Objects.requireNonNull(this.endsAt); + if (!this.endsAt.isAfter(this.dateTime)) { + throw new IllegalStateException( + String.format("Starting date: %s must be before end date: %s", this.dateTime, this.endsAt)); + } + } +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/BaseEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/BaseEntity.java index d7b4587..0f2a645 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/BaseEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/BaseEntity.java @@ -1,38 +1,38 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import java.time.Instant; - -import jakarta.persistence.Column; -import jakarta.persistence.MappedSuperclass; -import jakarta.persistence.PrePersist; -import jakarta.persistence.PreUpdate; -import jakarta.persistence.Version; -import lombok.Getter; -import lombok.Setter; - -@MappedSuperclass -@Getter -public class BaseEntity { - - @Version - @Setter - private int version; - - @Column(updatable = false) - private Instant created; - - @Column(name = "LAST_UPDATED") - private Instant lastUpdated; - - @PrePersist - public void prePersist() { - Instant now = Instant.now(); - this.created = now; - this.lastUpdated = now; - } - - @PreUpdate - public void preUpdate() { - this.lastUpdated = Instant.now(); - } -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import java.time.Instant; + +import jakarta.persistence.Column; +import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.PrePersist; +import jakarta.persistence.PreUpdate; +import jakarta.persistence.Version; +import lombok.Getter; +import lombok.Setter; + +@MappedSuperclass +@Getter +public class BaseEntity { + + @Version + @Setter + private int version; + + @Column(updatable = false) + private Instant created; + + @Column(name = "LAST_UPDATED") + private Instant lastUpdated; + + @PrePersist + public void prePersist() { + Instant now = Instant.now(); + this.created = now; + this.lastUpdated = now; + } + + @PreUpdate + public void preUpdate() { + this.lastUpdated = Instant.now(); + } +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/ClientEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/ClientEntity.java index a592b26..d20c99e 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/ClientEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/ClientEntity.java @@ -1,36 +1,36 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import java.util.List; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.OneToMany; -import jakarta.persistence.OneToOne; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -@Entity -@Table(name = "CLIENT") -@Getter -@Setter -public class ClientEntity extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CLIENT_SEQ_GEN") - @SequenceGenerator(sequenceName = "CLIENT_SEQ", name = "CLIENT_SEQ_GEN", allocationSize = 100) - private Long id; - - @OneToOne(optional = false, fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST}) - private UserEntity user; - - @OneToMany(mappedBy = "client", fetch = FetchType.LAZY, orphanRemoval = true, cascade = {CascadeType.PERSIST, - CascadeType.REMOVE}) - private List appointments; - -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import java.util.List; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "CLIENT") +@Getter +@Setter +public class ClientEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CLIENT_SEQ_GEN") + @SequenceGenerator(sequenceName = "CLIENT_SEQ", name = "CLIENT_SEQ_GEN", allocationSize = 100) + private Long id; + + @OneToOne(optional = false, fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST}) + private UserEntity user; + + @OneToMany(mappedBy = "client", fetch = FetchType.LAZY, orphanRemoval = true, cascade = {CascadeType.PERSIST, + CascadeType.REMOVE}) + private List appointments; + +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/SpecialistEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/SpecialistEntity.java index d5d3878..63f8ead 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/SpecialistEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/SpecialistEntity.java @@ -1,42 +1,42 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import java.util.List; - -import com.capgemini.training.appointmentbooking.common.datatype.Specialization; -import com.capgemini.training.appointmentbooking.dataaccess.converter.SpecializationConverter; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Convert; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.OneToMany; -import jakarta.persistence.OneToOne; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -@Entity -@Table(name = "SPECIALIST") -@Getter -@Setter -public class SpecialistEntity extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SPECIALIST_SEQ_GEN") - @SequenceGenerator(sequenceName = "SPECIALIST_SEQ", name = "SPECIALIST_SEQ_GEN", allocationSize = 100) - private Long id; - - @OneToOne(optional = false, fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST}) - private UserEntity user; - - @Convert(converter = SpecializationConverter.class) - private Specialization specialization; - - @OneToMany(mappedBy = "specialist", fetch = FetchType.LAZY, orphanRemoval = true, cascade = {CascadeType.PERSIST, - CascadeType.REMOVE}) - private List treatments; -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import java.util.List; + +import com.capgemini.training.appointmentbooking.common.datatype.Specialization; +import com.capgemini.training.appointmentbooking.dataaccess.converter.SpecializationConverter; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "SPECIALIST") +@Getter +@Setter +public class SpecialistEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SPECIALIST_SEQ_GEN") + @SequenceGenerator(sequenceName = "SPECIALIST_SEQ", name = "SPECIALIST_SEQ_GEN", allocationSize = 100) + private Long id; + + @OneToOne(optional = false, fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST}) + private UserEntity user; + + @Convert(converter = SpecializationConverter.class) + private Specialization specialization; + + @OneToMany(mappedBy = "specialist", fetch = FetchType.LAZY, orphanRemoval = true, cascade = {CascadeType.PERSIST, + CascadeType.REMOVE}) + private List treatments; +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/TreatmentEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/TreatmentEntity.java index 4deff0e..25239cd 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/TreatmentEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/TreatmentEntity.java @@ -1,36 +1,36 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -@Entity -@Table(name = "TREATMENT") -@Getter -@Setter -public class TreatmentEntity extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TREATMENT_SEQ_GEN") - @SequenceGenerator(sequenceName = "TREATMENT_SEQ", name = "TREATMENT_SEQ_GEN", allocationSize = 100) - private Long id; - - private String name; - - private String description; - - @Column(name = "DURATION_MINUTES") - private int durationMinutes; - - @ManyToOne(fetch = FetchType.LAZY) - private SpecialistEntity specialist; - -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "TREATMENT") +@Getter +@Setter +public class TreatmentEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TREATMENT_SEQ_GEN") + @SequenceGenerator(sequenceName = "TREATMENT_SEQ", name = "TREATMENT_SEQ_GEN", allocationSize = 100) + private Long id; + + private String name; + + private String description; + + @Column(name = "DURATION_MINUTES") + private int durationMinutes; + + @ManyToOne(fetch = FetchType.LAZY) + private SpecialistEntity specialist; + +} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/UserEntity.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/UserEntity.java index def78fa..7bd50bc 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/UserEntity.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/entity/UserEntity.java @@ -1,35 +1,35 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; - -@Entity -@Table(name = "USER_TABLE") -@Getter -@Setter -public class UserEntity extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_SEQ_GEN") - @SequenceGenerator(sequenceName = "USER_SEQ", name = "USER_SEQ_GEN", allocationSize = 100) - private Long id; - - private String email; - - @Column(name = "PASSWORD_HASH") - private String passwordHash; - - @Column(name = "FIRST_NAME") - private String firstname; - - @Column(name = "LAST_NAME") - private String lastname; - -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "USER_TABLE") +@Getter +@Setter +public class UserEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_SEQ_GEN") + @SequenceGenerator(sequenceName = "USER_SEQ", name = "USER_SEQ_GEN", allocationSize = 100) + private Long id; + + private String email; + + @Column(name = "PASSWORD_HASH") + private String passwordHash; + + @Column(name = "FIRST_NAME") + private String firstname; + + @Column(name = "LAST_NAME") + private String lastname; + +} diff --git a/src/test/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplicationIT.java b/src/test/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplicationIT.java index 36cfd39..ffa63a4 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplicationIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplicationIT.java @@ -1,13 +1,13 @@ -package com.capgemini.training.appointmentbooking; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class AppointmentBookingAppApplicationIT { - - @Test - void contextLoads() { - } - -} +package com.capgemini.training.appointmentbooking; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class AppointmentBookingAppApplicationIT { + + @Test + void contextLoads() { + } + +} diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeIT.java index bdced7a..3b7a4a9 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeIT.java @@ -1,37 +1,37 @@ -package com.capgemini.training.appointmentbooking.dataaccess.entity; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; - -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; - -@DataJpaTest -public class EntitySmokeIT { - - @PersistenceContext - private EntityManager em; - - @Test - void loadAllClasses() { - - // given - Map, Integer> classMap = Map.of( // - UserEntity.class, 8, // - ClientEntity.class, 4, // - SpecialistEntity.class, 4, // - TreatmentEntity.class, 12, // - AppointmentEntity.class, 20); - - // when //then - classMap.forEach((entityType, - expectedCount) -> assertThat( - (List) em.createQuery("from " + entityType.getSimpleName()).getResultList()) - .hasSize(expectedCount)); - } -} +package com.capgemini.training.appointmentbooking.dataaccess.entity; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; + +@DataJpaTest +public class EntitySmokeIT { + + @PersistenceContext + private EntityManager em; + + @Test + void loadAllClasses() { + + // given + Map, Integer> classMap = Map.of( // + UserEntity.class, 8, // + ClientEntity.class, 4, // + SpecialistEntity.class, 4, // + TreatmentEntity.class, 12, // + AppointmentEntity.class, 20); + + // when //then + classMap.forEach((entityType, + expectedCount) -> assertThat( + (List) em.createQuery("from " + entityType.getSimpleName()).getResultList()) + .hasSize(expectedCount)); + } +}