Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add validity date in curriculum create dto #135

Open
wants to merge 15 commits into
base: develop
Choose a base branch
from
Open
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions;

import lombok.Getter;

import java.time.LocalDate;

@Getter
public class DateChronologyException extends RuntimeException {
Copy link
Member

@domingoslatorre domingoslatorre Jun 19, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Talvez essa exception poderia ter um nome mais específico como StartDateAfterEndDateException

private final LocalDate startDate;
private final LocalDate endDate;

public DateChronologyException(LocalDate startDate, LocalDate endDate) {
super();
this.startDate = startDate;
this.endDate = endDate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -213,4 +213,36 @@ public ResponseEntity<ProblemDetail> mergeFiles(MergeFilesException exception) {
HttpStatus.CONFLICT
);
}

@ExceptionHandler(DateChronologyException.class)
public ResponseEntity<ProblemDetail> dateCronology(DateChronologyException exception) {
return new ResponseEntity<>(
new ProblemDetail(
"the date " +
exception.getStartDate().toString() +
" should be before the date " +
exception.getEndDate().toString(),
Collections.emptyList()
),
HttpStatus.CONFLICT
);
}

@ExceptionHandler(TimeOverlayException.class)
public ResponseEntity<ProblemDetail> dateOverlay(TimeOverlayException exception) {
return new ResponseEntity<>(
new ProblemDetail(
"the time between " +
exception.getStartDate().toString() +
" and " +
exception.getEndDate().toString() +
" overlaps with the time between " +
exception.getOverlaidStartDate().toString() +
" and " +
exception.getOverlaidEndDate().toString(),
Collections.emptyList()
),
HttpStatus.CONFLICT
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions;

import lombok.Getter;

import java.time.LocalDate;

@Getter
public class TimeOverlayException extends RuntimeException {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Essa classe está bem flexível, podendo ser usada em qualquer situação de sobreposição de tempo. Isso é muito bom. Outra solução seria ter uma exceção mais específica e que indicasse com qual currículo acontece a sobreposição (id ou code), isso simplificaria a criação dela lá no service. Algo assim:

public class CurriculumTimeOverlayException extends RuntimeException {
    private final UUID curriculumOverlaidId;

    public TimeOverlayException(UUID curriculumOverlaidId) {
        super();
        this.curriculumOverlaidId = curriculumOverlaidId;
    }
}

Vamos discutir mais sobre isso no review semana que vem.

private final LocalDate startDate;
private final LocalDate endDate;
private final LocalDate overlaidStartDate;
private final LocalDate overlaidEndDate;

public TimeOverlayException(LocalDate startDate, LocalDate endDate, LocalDate overlaidStartDate, LocalDate overlaidEndDate) {
super();
this.startDate = startDate;
this.endDate = endDate;
this.overlaidStartDate = overlaidStartDate;
this.overlaidEndDate = overlaidEndDate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import lombok.Setter;

import javax.persistence.*;
import java.time.LocalDate;
import java.util.UUID;

@Entity
Expand All @@ -22,6 +23,8 @@ public class Curriculum {
private Integer internshipCourseLoad;
private String internshipStartCriteria;
private String internshipAllowedActivities;
private LocalDate validityStartDate;
private LocalDate validityEndDate;
@Enumerated(EnumType.STRING)
private EntityStatus status;

Expand All @@ -34,6 +37,8 @@ public Curriculum(
Integer internshipCourseLoad,
String internshipStartCriteria,
String internshipAllowedActivities,
LocalDate validityStartDate,
LocalDate validityEndDate,
Course course
) {
this.id = UUID.randomUUID();
Expand All @@ -42,6 +47,8 @@ public Curriculum(
this.internshipCourseLoad = internshipCourseLoad;
this.internshipStartCriteria = internshipStartCriteria;
this.internshipAllowedActivities = internshipAllowedActivities;
this.validityStartDate = validityStartDate;
this.validityEndDate = validityEndDate;
this.status = EntityStatus.ENABLED;
this.course = course;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.curriculum;

import lombok.Value;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
import java.time.LocalDate;

@Value
public class CurriculumCreateDto {
Expand All @@ -23,4 +25,9 @@ public class CurriculumCreateDto {
@NotNull
@NotBlank
String internshipAllowedActivities;
@NotNull
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
LocalDate validityStartDate;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
LocalDate validityEndDate;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.course.CourseDto;
import lombok.Value;

import java.time.LocalDate;
import java.util.UUID;

@Value
Expand All @@ -14,6 +15,8 @@ public class CurriculumDto {
Integer internshipCourseLoad;
String internshipStartCriteria;
String internshipAllowedActivities;
LocalDate validityStartDate;
LocalDate validityEndDate;
CourseDto course;
EntityStatus status;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.curriculum;

import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions.DateChronologyException;
import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions.TimeOverlayException;

import java.time.LocalDate;
import java.util.List;
import java.util.UUID;

public class CurriculumOverlapVerification {

public boolean checkingAddCurriculum(List<Curriculum> curriculums, CurriculumCreateDto curriculum){
var validityStartDate = curriculum.getValidityStartDate();
var validityEndDate = curriculum.getValidityEndDate();
if(validityEndDate != null) {
verifyDatesChronology(validityStartDate, validityEndDate);
for(Curriculum c : curriculums){
var comparingStartDate = c.getValidityStartDate();
var comparingEndDate = c.getValidityEndDate();
if(comparingEndDate != null && (
(validityStartDate.isAfter(comparingStartDate) && validityStartDate.isBefore(comparingEndDate)) || (validityEndDate.isAfter(comparingStartDate) && validityEndDate.isBefore(comparingEndDate)) || validityStartDate.isEqual(comparingStartDate) || validityStartDate.isEqual(comparingEndDate) || validityEndDate.isEqual(comparingStartDate) || validityEndDate.isEqual(comparingEndDate))
){
throw new TimeOverlayException(validityStartDate,validityEndDate,comparingStartDate,comparingEndDate);
}
else if(
comparingEndDate == null && (validityStartDate.isAfter(comparingStartDate) || validityEndDate.isAfter(comparingStartDate) || validityStartDate.isEqual(comparingStartDate) || validityEndDate.isEqual(comparingStartDate))
){
throw new TimeOverlayException(validityStartDate,validityEndDate,comparingStartDate,LocalDate.now());
}
}
}
else if(!(curriculums.isEmpty())){
for(Curriculum c : curriculums){
var comparingStartDate = c.getValidityStartDate();
var comparingEndDate = c.getValidityEndDate();
if(comparingEndDate == null){
throw new TimeOverlayException(validityStartDate, LocalDate.now(),comparingStartDate,LocalDate.now());
}
if(
validityStartDate.isBefore(comparingStartDate) || validityStartDate.isBefore(comparingEndDate) || validityStartDate.isEqual(comparingStartDate) || validityStartDate.isEqual(comparingEndDate)
){
throw new TimeOverlayException(validityStartDate,validityEndDate,comparingStartDate,comparingEndDate);
}
}
}
return true;
}

public boolean checkingUpdateCurriculum(List<Curriculum> curriculums, CurriculumCreateDto curriculum, UUID curriculumID){
var validityStartDate = curriculum.getValidityStartDate();
var validityEndDate = curriculum.getValidityEndDate();
if(validityEndDate != null) {
verifyDatesChronology(validityStartDate, validityEndDate);
for(Curriculum c : curriculums){
var comparingStartDate = c.getValidityStartDate();
var comparingEndDate = c.getValidityEndDate();
if(
(comparingEndDate != null && c.getId() != curriculumID) && ((validityStartDate.isAfter(comparingStartDate) && validityStartDate.isBefore(comparingEndDate)) || (validityEndDate.isAfter(comparingStartDate) && validityEndDate.isBefore(comparingEndDate)) || validityStartDate.isEqual(comparingStartDate) || validityStartDate.isEqual(comparingEndDate) || validityEndDate.isEqual(comparingStartDate) || validityEndDate.isEqual(comparingEndDate))
){
throw new TimeOverlayException(validityStartDate, validityEndDate, comparingStartDate, comparingEndDate);
}
else if (
(comparingEndDate == null && c.getId() != curriculumID) && (validityStartDate.isAfter(comparingStartDate) || validityEndDate.isAfter(comparingStartDate) || validityStartDate.isEqual(comparingStartDate) || validityEndDate.isEqual(comparingStartDate))
){
throw new TimeOverlayException(validityStartDate, validityEndDate,comparingStartDate,LocalDate.now());
}
}
}
else {
for(Curriculum c : curriculums){
var comparingStartDate = c.getValidityStartDate();
var comparingEndDate = c.getValidityEndDate();
if(
c.getId() != curriculumID && (validityStartDate.isBefore(comparingStartDate) || validityStartDate.isBefore(comparingEndDate) || validityStartDate.isEqual(comparingStartDate) || validityStartDate.isEqual(comparingEndDate))
){
throw new TimeOverlayException(validityStartDate,LocalDate.now(),comparingStartDate,comparingEndDate);
}
}
}
return true;
}

private void verifyDatesChronology(LocalDate startDate, LocalDate endDate){
if(startDate.isAfter(endDate) || startDate.isEqual(endDate)){
throw new DateChronologyException(startDate, endDate);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@

import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.dtos.EntityUpdateStatusDto;
import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.enums.EntityStatus;
import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions.ResourceName;
import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions.ResourceNotFoundException;
import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions.*;
import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.course.Course;
import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.course.CourseService;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -17,6 +16,7 @@
public class CurriculumServiceImpl implements CurriculumService {
private CurriculumRepository curriculumRepository;
private CourseService courseService;
private CurriculumOverlapVerification curriculumOverlapVerification;

public CurriculumServiceImpl(CurriculumRepository curriculumRepository) {
this.curriculumRepository = curriculumRepository;
Expand All @@ -30,13 +30,17 @@ public void setCourseService(CourseService courseService) {
@Override
public Curriculum create(UUID courseId, CurriculumCreateDto curriculumCreateDto) {
Course course = courseService.findById(courseId);
List<Curriculum> curriculumList = findAll(courseId);
curriculumOverlapVerification.checkingAddCurriculum(curriculumList, curriculumCreateDto);

return curriculumRepository.save(new Curriculum(
curriculumCreateDto.getCode(),
curriculumCreateDto.getCourseLoad(),
curriculumCreateDto.getInternshipCourseLoad(),
curriculumCreateDto.getInternshipStartCriteria(),
curriculumCreateDto.getInternshipAllowedActivities(),
curriculumCreateDto.getValidityStartDate(),
curriculumCreateDto.getValidityEndDate(),
course
));
}
Expand All @@ -63,13 +67,18 @@ public Curriculum findByCurriculumId(UUID curriculumId) {
public Curriculum update(UUID courseId, UUID curriculumId, CurriculumCreateDto curriculumCreateDto) {
Course course = courseService.findById(courseId);
getCurriculum(courseId, curriculumId);
List<Curriculum> curriculumList = findAll(courseId);

curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList, curriculumCreateDto, curriculumId);

Curriculum curriculumUpdated = new Curriculum(
curriculumCreateDto.getCode(),
curriculumCreateDto.getCourseLoad(),
curriculumCreateDto.getInternshipCourseLoad(),
curriculumCreateDto.getInternshipStartCriteria(),
curriculumCreateDto.getInternshipAllowedActivities(),
curriculumCreateDto.getValidityStartDate(),
curriculumCreateDto.getValidityEndDate(),
course
);
curriculumUpdated.setId(curriculumId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ CREATE TABLE curriculums(
internship_course_load INT NOT NULL,
internship_start_criteria VARCHAR NOT NULL,
internship_allowed_activities VARCHAR NOT NULL,
validity_start_date DATE NOT NULL,
validity_end_date DATE,
status VARCHAR NOT NULL,
course_id UUID NOT NULL,
CONSTRAINT curriculums_pk PRIMARY KEY (id),
Expand Down
Loading