Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
</scm>
<properties>
<java.version>21</java.version>
<org.mapstruct.version>1.5.5.Final</org.mapstruct.version>
</properties>
<dependencies>
<dependency>
Expand Down Expand Up @@ -55,6 +56,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
<dependency>
Expand All @@ -65,15 +67,30 @@
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>5.0.0</version>
<version>5.1.0</version>
<classifier>jakarta</classifier>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<classifier>jakarta</classifier>
<version>5.0.0</version>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package com.capgemini.training.appointmentbooking.common.datatype;

public enum AppointmentStatus {
SCHEDULED, CANCELLED, COMPLETED;
SCHEDULED, CANCELLED, COMPLETED
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.capgemini.training.appointmentbooking.common.exception;


public class ConflictedAppointmentException extends RuntimeException {

public ConflictedAppointmentException() {
super("The appointment conflicts with another scheduled appointment.");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.capgemini.training.appointmentbooking.common.to;

import jakarta.validation.constraints.NotNull;
import lombok.Builder;

import java.time.Instant;


@Builder
public record AppointmentBookingEto(@NotNull Long clientId, @NotNull Long treatmentId, @NotNull Long specialistId,
@NotNull Instant dateTime) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.capgemini.training.appointmentbooking.common.to;

import jakarta.validation.Valid;
import lombok.Builder;


@Builder
public record AppointmentCto(@Valid AppointmentEto appointmentEto, @Valid ClientEto clientEto,
@Valid TreatmentCto treatmentCto) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.capgemini.training.appointmentbooking.common.to;

import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;

import java.time.Instant;


@Builder
public record AppointmentEto(@NotNull Long id, @NotNull Instant dateTime, @NotNull AppointmentStatus status) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.capgemini.training.appointmentbooking.common.to;

import jakarta.validation.Valid;
import lombok.Builder;


@Builder
public record ClientCto(@Valid ClientEto clientEto, @Valid UserEto userEto) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.capgemini.training.appointmentbooking.common.to;

import jakarta.validation.constraints.NotNull;
import lombok.Builder;


@Builder
public record ClientEto(@NotNull Long id) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.capgemini.training.appointmentbooking.common.to;

import jakarta.validation.Valid;
import lombok.Builder;


@Builder
public record SpecialistCto(@Valid SpecialistEto specialistEto, @Valid UserEto userEto) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.capgemini.training.appointmentbooking.common.to;

import com.capgemini.training.appointmentbooking.common.datatype.Specialization;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;


@Builder
public record SpecialistEto(@NotNull Long id, @Valid Specialization specialization) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.capgemini.training.appointmentbooking.common.to;

import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Builder;


@Builder
public record TreatmentCreationTo(@NotNull @Size(min = 5, max = 20) String name,
@NotNull @Size(min = 5, max = 80) String description,
@Min(1) int durationMinutes,
@NotNull Long specialistId) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.capgemini.training.appointmentbooking.common.to;

import jakarta.validation.Valid;
import lombok.Builder;


@Builder
public record TreatmentCto(@Valid TreatmentEto treatmentEto, @Valid SpecialistEto specialistEto) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.capgemini.training.appointmentbooking.common.to;

import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Builder;


@Builder
public record TreatmentEto(Long id, @NotNull @Size(min = 5, max = 80) String name,
@NotNull @Size(min = 5, max = 80) String description, int durationMinutes) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.capgemini.training.appointmentbooking.common.to;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Builder;


@Builder
public record UserEto(Long id, @NotEmpty @Email String email, String passwordHash,
@NotNull @Size(min = 3, max = 20) String firstName,
@NotNull @Size(min = 3, max = 20) String lastName) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ default List<SpecialistEntity> findSpecialistByName(String firstName, String las
.where(user.firstname.eq(firstName)
.and(user.lastname.eq(lastName)))
.fetch();

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.capgemini.training.appointmentbooking.logic;

import com.capgemini.training.appointmentbooking.common.to.AppointmentCto;
import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria;
import jakarta.validation.constraints.NotNull;

import java.time.Instant;
import java.util.List;
import java.util.Optional;


public interface FindAppointmentUc {

Optional<AppointmentCto> findById(@NotNull Long id);

List<AppointmentCto> findByCriteria(AppointmentCriteria criteria);

List<AppointmentCto> findAll();

boolean hasConflictingAppointment(@NotNull Long specialistId, @NotNull Instant dateTime);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.capgemini.training.appointmentbooking.logic;

import com.capgemini.training.appointmentbooking.common.to.TreatmentCto;
import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.TreatmentCriteria;
import jakarta.validation.constraints.NotNull;

import java.util.List;
import java.util.Optional;


public interface FindTreatmentUc {

Optional<TreatmentCto> findById(@NotNull Long id);

List<TreatmentCto> findAll();

List<TreatmentCto> findByCriteria(TreatmentCriteria criteria);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.capgemini.training.appointmentbooking.logic;

import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus;
import com.capgemini.training.appointmentbooking.common.to.AppointmentBookingEto;
import com.capgemini.training.appointmentbooking.common.to.AppointmentCto;
import com.capgemini.training.appointmentbooking.common.to.AppointmentEto;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;


public interface ManageAppointmentUc {

AppointmentCto bookAppointment(@Valid AppointmentBookingEto appointmentBookingEto);

AppointmentEto updateAppointmentStatus(@NotNull Long appointmentId, @NotNull AppointmentStatus appointmentStatus);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.capgemini.training.appointmentbooking.logic;

import com.capgemini.training.appointmentbooking.common.to.TreatmentCreationTo;
import com.capgemini.training.appointmentbooking.common.to.TreatmentCto;
import jakarta.validation.Valid;

public interface ManageTreatmentUc {

TreatmentCto createTreatment(@Valid TreatmentCreationTo treatmentCreationTo);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.capgemini.training.appointmentbooking.logic.config;

import com.capgemini.training.appointmentbooking.logic.mapper.*;
import org.mapstruct.factory.Mappers;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
class MappingConfiguration {

@Bean
AppointmentMapper getAppointmentMapper() {
return Mappers.getMapper(AppointmentMapper.class);
}

@Bean
AppointmentCtoMapper getAppointmentCtoMapper() {
return Mappers.getMapper(AppointmentCtoMapper.class);
}

@Bean
ClientMapper getClientMapper() {
return Mappers.getMapper(ClientMapper.class);
}

@Bean
SpecialistMapper getSpecialistMapper() {
return Mappers.getMapper(SpecialistMapper.class);
}

@Bean
TreatmentMapper getTreatmentMapper() {
return Mappers.getMapper(TreatmentMapper.class);
}

@Bean
TreatmentCtoMapper getTreatmentCtoMapper() {
return Mappers.getMapper(TreatmentCtoMapper.class);
}

@Bean
UserMapper getUserMapper() {
return Mappers.getMapper(UserMapper.class);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.capgemini.training.appointmentbooking.logic.impl;

import com.capgemini.training.appointmentbooking.common.to.AppointmentCto;
import com.capgemini.training.appointmentbooking.dataaccess.repository.AppointmentRepository;
import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria;
import com.capgemini.training.appointmentbooking.logic.FindAppointmentUc;
import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentCtoMapper;
import jakarta.validation.constraints.NotNull;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import java.time.Instant;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;


@Service
@Transactional(readOnly = true)
@Validated
public class FindAppointmentUcImpl implements FindAppointmentUc {

private final AppointmentRepository appointmentRepository;

private final AppointmentCtoMapper appointmentCtoMapper;

public FindAppointmentUcImpl(AppointmentRepository appointmentRepository, AppointmentCtoMapper appointmentCtoMapper) {
this.appointmentRepository = appointmentRepository;
this.appointmentCtoMapper = appointmentCtoMapper;
}

@Override
public Optional<AppointmentCto> findById(@NotNull Long id) {
return appointmentRepository.findById(id).map(appointmentCtoMapper::toCto);
}

@Override
public List<AppointmentCto> findAll() {
return appointmentRepository.findAll().stream().map(appointmentCtoMapper::toCto).collect(Collectors.toList());
}

@Override
public List<AppointmentCto> findByCriteria(AppointmentCriteria criteria) {
return appointmentRepository.findByCriteria(criteria).stream().map(appointmentCtoMapper::toCto).collect(Collectors.toList());
}

@Override
public boolean hasConflictingAppointment(@NotNull Long specialistId, @NotNull Instant dateTime) {
return appointmentRepository.hasConflictingAppointmentBySpecialistIdAndDateTime(specialistId, dateTime);
}

}
Loading
Loading