diff --git a/src/main/java/innotutor/innotutor_backend/controller/SessionController.java b/src/main/java/innotutor/innotutor_backend/controller/SessionController.java index dacc192..91510a7 100644 --- a/src/main/java/innotutor/innotutor_backend/controller/SessionController.java +++ b/src/main/java/innotutor/innotutor_backend/controller/SessionController.java @@ -1,6 +1,7 @@ package innotutor.innotutor_backend.controller; import innotutor.innotutor_backend.dto.UserDTO; +import innotutor.innotutor_backend.dto.card.SessionRatingDTO; import innotutor.innotutor_backend.dto.card.SubjectDTO; import innotutor.innotutor_backend.dto.session.SessionDTO; import innotutor.innotutor_backend.dto.session.sessionsettings.SessionFormatDTO; @@ -18,7 +19,8 @@ @RestController @RequestMapping(value = "/session", produces = MediaType.APPLICATION_JSON_VALUE) -@CrossOrigin(origins = "*", allowedHeaders = "*", methods = {RequestMethod.GET, RequestMethod.POST}) +@CrossOrigin(origins = "*", allowedHeaders = "*", + methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE}) public class SessionController { private final transient SessionService sessionService; private final transient UserService userService; @@ -49,25 +51,76 @@ public ResponseEntity> getStudents( @RequestParam(name = "format", required = false) final String format, @RequestParam(name = "type", required = false) final String type, @AuthenticationPrincipal final CustomPrincipal user) { - final List students = sessionService.filterStudentsForSession(userService.getUserId(user), subject, format, type); + final List students + = sessionService.filterStudentsForSession(userService.getUserId(user), subject, format, type); return students == null ? new ResponseEntity<>(HttpStatus.NOT_FOUND) : new ResponseEntity<>(students, HttpStatus.OK); } @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity postTutorCardEnroll(@RequestBody final SessionDTO sessionDTO, - @AuthenticationPrincipal final CustomPrincipal user) { + public ResponseEntity postSession(@RequestBody final SessionDTO sessionDTO, + @AuthenticationPrincipal final CustomPrincipal user) { ResponseEntity response; if (sessionDTO == null) { response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); } else { - sessionDTO.setTutorId(userService.getUserId(user)); - final SessionDTO result = sessionService.postSession(sessionDTO); + final SessionDTO result = sessionService.postSession(sessionDTO, userService.getUserId(user)); response = result == null ? new ResponseEntity<>(HttpStatus.BAD_REQUEST) : new ResponseEntity<>(result, HttpStatus.CREATED); } return response; } + + @DeleteMapping(value = "/cancel/{sessionId}", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity cancelSession(@PathVariable final Long sessionId, + @AuthenticationPrincipal final CustomPrincipal user) { + ResponseEntity response; + if (sessionId == null) { + response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } else { + Boolean result = sessionService.cancelSession(sessionId, userService.getUserId(user)); + if (result == null) { + response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } else { + response = result + ? new ResponseEntity<>(HttpStatus.OK) + : new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + return response; + } + + @PutMapping(value = "/rate", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity rateSession(@RequestBody final SessionRatingDTO sessionRatingDTO, + @AuthenticationPrincipal final CustomPrincipal user) { + ResponseEntity response; + if (sessionRatingDTO == null) { + response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } else { + final SessionRatingDTO result = sessionService.rateSession(sessionRatingDTO, userService.getUserId(user)); + if (result == null) { + response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } else { + response = new ResponseEntity<>(result, HttpStatus.OK); + } + } + return response; + } + + @DeleteMapping(value = "/rate/{sessionId}", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity deleteRating(@PathVariable final Long sessionId, + @AuthenticationPrincipal final CustomPrincipal user) { + ResponseEntity response; + if (sessionId == null) { + response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } else { + response = sessionService.deleteRating(sessionId, userService.getUserId(user)) + ? new ResponseEntity<>(HttpStatus.OK) + : new ResponseEntity<>(HttpStatus.NOT_FOUND); + + } + return response; + } } diff --git a/src/main/java/innotutor/innotutor_backend/controller/card/CardController.java b/src/main/java/innotutor/innotutor_backend/controller/card/CardController.java index d5bfb60..189149e 100644 --- a/src/main/java/innotutor/innotutor_backend/controller/card/CardController.java +++ b/src/main/java/innotutor/innotutor_backend/controller/card/CardController.java @@ -1,7 +1,7 @@ package innotutor.innotutor_backend.controller.card; -import innotutor.innotutor_backend.dto.card.CardDTO; import innotutor.innotutor_backend.dto.enrollment.EnrollmentDTO; +import innotutor.innotutor_backend.dto.searcher.UserCard; import innotutor.innotutor_backend.security.CustomPrincipal; import innotutor.innotutor_backend.service.CardEnrollService; import innotutor.innotutor_backend.service.CardService; @@ -28,11 +28,11 @@ public CardController(final UserService userService, final CardService cardServi } @GetMapping(value = "/card/{cardId}", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity getCard(@PathVariable final Long cardId, @AuthenticationPrincipal final CustomPrincipal user) { + public ResponseEntity getCard(@PathVariable final Long cardId, @AuthenticationPrincipal final CustomPrincipal user) { if (cardId == null) { new ResponseEntity<>(HttpStatus.BAD_REQUEST); } - final CardDTO card = cardService.getCardById(cardId, userService.getUserId(user)); + final UserCard card = cardService.getCardFullInfoById(cardId, userService.getUserId(user)); return card == null ? new ResponseEntity<>(HttpStatus.NOT_FOUND) : new ResponseEntity<>(card, HttpStatus.OK); @@ -73,7 +73,7 @@ public ResponseEntity deleteCardById(final Long cardId, final CustomPrincipal if (cardId == null) { response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); } else { - response = cardService.deleteCardById(userService.getUserId(user), cardId) + response = cardService.deleteCardById(cardId, userService.getUserId(user)) ? new ResponseEntity<>(HttpStatus.OK) : new ResponseEntity<>(HttpStatus.NOT_FOUND); } diff --git a/src/main/java/innotutor/innotutor_backend/controller/card/RequestsController.java b/src/main/java/innotutor/innotutor_backend/controller/card/RequestsController.java index 595750a..8187cf3 100644 --- a/src/main/java/innotutor/innotutor_backend/controller/card/RequestsController.java +++ b/src/main/java/innotutor/innotutor_backend/controller/card/RequestsController.java @@ -1,6 +1,5 @@ package innotutor.innotutor_backend.controller.card; -import innotutor.innotutor_backend.controller.card.CardController; import innotutor.innotutor_backend.dto.card.CardDTO; import innotutor.innotutor_backend.dto.card.SubjectDTO; import innotutor.innotutor_backend.security.CustomPrincipal; @@ -76,8 +75,7 @@ public ResponseEntity postRequestCard(@RequestBody final CardDTO cardDT if (cardDTO == null) { response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); } else { - cardDTO.setCreatorId(userService.getUserId(user)); - final CardDTO result = cardService.postRequestCard(cardDTO); + final CardDTO result = cardService.postRequestCard(cardDTO, userService.getUserId(user)); response = result == null ? new ResponseEntity<>(HttpStatus.BAD_REQUEST) : new ResponseEntity<>(result, HttpStatus.CREATED); @@ -93,9 +91,7 @@ public ResponseEntity putRequestCard(@PathVariable final Long cardId, if (cardDTO == null || cardId == null) { response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); } else { - cardDTO.setCreatorId(userService.getUserId(user)); - cardDTO.setCardId(cardId); - final CardDTO result = cardService.putRequestCard(cardDTO); + final CardDTO result = cardService.putRequestCard(cardId, cardDTO, userService.getUserId(user)); if (result == null) { response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); } else { diff --git a/src/main/java/innotutor/innotutor_backend/controller/card/ServicesController.java b/src/main/java/innotutor/innotutor_backend/controller/card/ServicesController.java index 77fff79..3775fc1 100644 --- a/src/main/java/innotutor/innotutor_backend/controller/card/ServicesController.java +++ b/src/main/java/innotutor/innotutor_backend/controller/card/ServicesController.java @@ -1,6 +1,5 @@ package innotutor.innotutor_backend.controller.card; -import innotutor.innotutor_backend.controller.card.CardController; import innotutor.innotutor_backend.dto.card.CardDTO; import innotutor.innotutor_backend.dto.card.SubjectDTO; import innotutor.innotutor_backend.security.CustomPrincipal; @@ -76,8 +75,7 @@ public ResponseEntity postCvCard(@RequestBody final CardDTO cardDTO, if (cardDTO == null) { response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); } else { - cardDTO.setCreatorId(userService.getUserId(user)); - final CardDTO result = cardService.postCvCard(cardDTO); + final CardDTO result = cardService.postCvCard(cardDTO, userService.getUserId(user)); response = result == null ? new ResponseEntity<>(HttpStatus.BAD_REQUEST) : new ResponseEntity<>(result, HttpStatus.CREATED); @@ -93,9 +91,7 @@ public ResponseEntity putCvCard(@PathVariable final Long cardId, if (cardDTO == null || cardId == null) { response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); } else { - cardDTO.setCreatorId(userService.getUserId(user)); - cardDTO.setCardId(cardId); - final CardDTO result = cardService.putCvCard(cardDTO); + final CardDTO result = cardService.putCvCard(cardId, cardDTO, userService.getUserId(user)); if (result == null) { response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); } else { diff --git a/src/main/java/innotutor/innotutor_backend/controller/user/ScheduleController.java b/src/main/java/innotutor/innotutor_backend/controller/user/ScheduleController.java new file mode 100644 index 0000000..4906300 --- /dev/null +++ b/src/main/java/innotutor/innotutor_backend/controller/user/ScheduleController.java @@ -0,0 +1,32 @@ +package innotutor.innotutor_backend.controller.user; + +import innotutor.innotutor_backend.dto.session.ScheduleDTO; +import innotutor.innotutor_backend.security.CustomPrincipal; +import innotutor.innotutor_backend.service.SessionService; +import innotutor.innotutor_backend.service.UserService; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping(value = "/schedule", produces = MediaType.APPLICATION_JSON_VALUE) +@CrossOrigin(origins = "*", allowedHeaders = "*", methods = {RequestMethod.GET}) +public class ScheduleController { + private final transient SessionService sessionService; + private final transient UserService userService; + + public ScheduleController(final SessionService sessionService, final UserService userService) { + this.sessionService = sessionService; + this.userService = userService; + } + + @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getSchedule(@AuthenticationPrincipal final CustomPrincipal user) { + final ScheduleDTO schedule = sessionService.getSchedule(userService.getUserId(user)); + return schedule == null + ? new ResponseEntity<>(HttpStatus.NOT_FOUND) + : new ResponseEntity<>(schedule, HttpStatus.OK); + } +} diff --git a/src/main/java/innotutor/innotutor_backend/controller/user/MyStudentsController.java b/src/main/java/innotutor/innotutor_backend/controller/user/StudentsController.java similarity index 90% rename from src/main/java/innotutor/innotutor_backend/controller/user/MyStudentsController.java rename to src/main/java/innotutor/innotutor_backend/controller/user/StudentsController.java index a9fa477..e5c1bac 100644 --- a/src/main/java/innotutor/innotutor_backend/controller/user/MyStudentsController.java +++ b/src/main/java/innotutor/innotutor_backend/controller/user/StudentsController.java @@ -14,19 +14,19 @@ @RestController @RequestMapping(value = "/my-students", produces = MediaType.APPLICATION_JSON_VALUE) @CrossOrigin(origins = "*", allowedHeaders = "*", methods = {RequestMethod.GET, RequestMethod.PUT, RequestMethod.DELETE}) -public class MyStudentsController { +public class StudentsController { private final transient StudentsService studentsService; private final transient CardEnrollService cardEnrollService; private final transient UserService userService; - public MyStudentsController(final StudentsService studentsService, final CardEnrollService cardEnrollService, final UserService userService) { + public StudentsController(final StudentsService studentsService, final CardEnrollService cardEnrollService, final UserService userService) { this.studentsService = studentsService; this.cardEnrollService = cardEnrollService; this.userService = userService; } @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity getUserStudentsList(@AuthenticationPrincipal final CustomPrincipal user) { + public ResponseEntity getStudentsList(@AuthenticationPrincipal final CustomPrincipal user) { final RequestedStudentsListInfoDTO students = studentsService.getUserStudentsListFullInfo(userService.getUserId(user)); return students == null ? new ResponseEntity<>(HttpStatus.NOT_FOUND) diff --git a/src/main/java/innotutor/innotutor_backend/controller/user/MyTutorsController.java b/src/main/java/innotutor/innotutor_backend/controller/user/TutorsController.java similarity index 90% rename from src/main/java/innotutor/innotutor_backend/controller/user/MyTutorsController.java rename to src/main/java/innotutor/innotutor_backend/controller/user/TutorsController.java index e91117d..cb8a096 100644 --- a/src/main/java/innotutor/innotutor_backend/controller/user/MyTutorsController.java +++ b/src/main/java/innotutor/innotutor_backend/controller/user/TutorsController.java @@ -14,21 +14,21 @@ @RestController @RequestMapping(value = "/my-tutors", produces = MediaType.APPLICATION_JSON_VALUE) @CrossOrigin(origins = "*", allowedHeaders = "*", methods = {RequestMethod.GET, RequestMethod.PUT, RequestMethod.DELETE}) -public class MyTutorsController { +public class TutorsController { private final transient TutorsService tutorsService; private final transient CardEnrollService cardEnrollService; private final transient UserService userService; - public MyTutorsController(final TutorsService tutorsService, - final CardEnrollService cardEnrollService, - final UserService userService) { + public TutorsController(final TutorsService tutorsService, + final CardEnrollService cardEnrollService, + final UserService userService) { this.tutorsService = tutorsService; this.cardEnrollService = cardEnrollService; this.userService = userService; } @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity getUserTutorsList( + public ResponseEntity getTutorsList( @AuthenticationPrincipal final CustomPrincipal user) { final RespondedTutorsListInfoDTO tutors = tutorsService.getUserTutorsListFullInfo(userService.getUserId(user)); diff --git a/src/main/java/innotutor/innotutor_backend/dto/card/SessionRatingDTO.java b/src/main/java/innotutor/innotutor_backend/dto/card/SessionRatingDTO.java new file mode 100644 index 0000000..373a4e9 --- /dev/null +++ b/src/main/java/innotutor/innotutor_backend/dto/card/SessionRatingDTO.java @@ -0,0 +1,14 @@ +package innotutor.innotutor_backend.dto.card; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SessionRatingDTO { + private Long sessionId; + private Integer mark; + private String feedback; +} diff --git a/src/main/java/innotutor/innotutor_backend/dto/enrollment/WaitingListDTO.java b/src/main/java/innotutor/innotutor_backend/dto/enrollment/WaitingListDTO.java index 8add66f..7017b51 100644 --- a/src/main/java/innotutor/innotutor_backend/dto/enrollment/WaitingListDTO.java +++ b/src/main/java/innotutor/innotutor_backend/dto/enrollment/WaitingListDTO.java @@ -10,6 +10,8 @@ @NoArgsConstructor @AllArgsConstructor public class WaitingListDTO { - private List students; - private List tutors; + private List studentsRequested; + private List studentsRejected; + private List tutorsRequested; + private List tutorsRejected; } diff --git a/src/main/java/innotutor/innotutor_backend/dto/session/ScheduleDTO.java b/src/main/java/innotutor/innotutor_backend/dto/session/ScheduleDTO.java new file mode 100644 index 0000000..b576bab --- /dev/null +++ b/src/main/java/innotutor/innotutor_backend/dto/session/ScheduleDTO.java @@ -0,0 +1,17 @@ +package innotutor.innotutor_backend.dto.session; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ScheduleDTO { + private List studyingSessionsConducted; + private List studyingSessionsUpcoming; + private List teachingSessionsConducted; + private List teachingSessionsUpcoming; +} diff --git a/src/main/java/innotutor/innotutor_backend/dto/session/SessionDTO.java b/src/main/java/innotutor/innotutor_backend/dto/session/SessionDTO.java index 23ff8e7..510a8e7 100644 --- a/src/main/java/innotutor/innotutor_backend/dto/session/SessionDTO.java +++ b/src/main/java/innotutor/innotutor_backend/dto/session/SessionDTO.java @@ -5,8 +5,7 @@ import lombok.Data; import lombok.NoArgsConstructor; -import java.sql.Date; -import java.sql.Time; +import java.time.LocalDateTime; import java.util.List; @Data @@ -17,12 +16,10 @@ public class SessionDTO { private Long tutorId; private List studentIDsList; private String subject; - @JsonFormat(pattern = "dd/MM/yyyy") - private Date date; - @JsonFormat(pattern = "hh:mm:ss") - private Time startTime; - @JsonFormat(pattern = "hh:mm:ss") - private Time endTime; + @JsonFormat(pattern = "yyyy-MM-dd@HH:mm:ss.SSSSSS") + private LocalDateTime startTime; + @JsonFormat(pattern = "yyyy-MM-dd@HH:mm:ss.SSSSSS") + private LocalDateTime endTime; private String sessionFormat; private String sessionType; private String description; diff --git a/src/main/java/innotutor/innotutor_backend/dto/session/SessionsListDTO.java b/src/main/java/innotutor/innotutor_backend/dto/session/SessionsListDTO.java deleted file mode 100644 index b087379..0000000 --- a/src/main/java/innotutor/innotutor_backend/dto/session/SessionsListDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package innotutor.innotutor_backend.dto.session; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class SessionsListDTO { - private List studyingSessions; - private List teachingSessions; -} diff --git a/src/main/java/innotutor/innotutor_backend/entity/card/Card.java b/src/main/java/innotutor/innotutor_backend/entity/card/Card.java index ce3e855..9361829 100644 --- a/src/main/java/innotutor/innotutor_backend/entity/card/Card.java +++ b/src/main/java/innotutor/innotutor_backend/entity/card/Card.java @@ -27,7 +27,6 @@ public class Card { //NOPMD - suppressed ShortClassName - It has the same databa private Request requestByCardId; private Service serviceByCardId; private Collection cardEnrollsByCardId; - private Collection cardRatingsByCardId; private Collection cardSessionFormatsByCardId; private Collection cardSessionTypesByCardId; @@ -152,15 +151,6 @@ public void setCardEnrollsByCardId(final Collection cardEnrollsByCar this.cardEnrollsByCardId = cardEnrollsByCardId; } - @OneToMany(mappedBy = CARD_BY_CARD_ID) - public Collection getCardRatingsByCardId() { - return cardRatingsByCardId; - } - - public void setCardRatingsByCardId(final Collection cardRatingsByCardId) { - this.cardRatingsByCardId = cardRatingsByCardId; - } - @OneToMany(mappedBy = CARD_BY_CARD_ID) public Collection getCardSessionFormatsByCardId() { return cardSessionFormatsByCardId; diff --git a/src/main/java/innotutor/innotutor_backend/entity/card/enrollment/CardEnroll.java b/src/main/java/innotutor/innotutor_backend/entity/card/enrollment/CardEnroll.java index 88a1c87..162fa0e 100644 --- a/src/main/java/innotutor/innotutor_backend/entity/card/enrollment/CardEnroll.java +++ b/src/main/java/innotutor/innotutor_backend/entity/card/enrollment/CardEnroll.java @@ -4,8 +4,6 @@ import innotutor.innotutor_backend.entity.user.User; import lombok.NoArgsConstructor; import org.hibernate.annotations.CreationTimestamp; -import org.hibernate.annotations.OnDelete; -import org.hibernate.annotations.OnDeleteAction; import org.hibernate.annotations.UpdateTimestamp; import javax.persistence.*; @@ -30,7 +28,8 @@ public class CardEnroll { private Collection cardEnrollSessionFormatsByCardId; private Collection cardEnrollSessionTypesByCardId; - public CardEnroll(final Long cardId, final Long userId, final Long statusId, final String description, final Card cardByCardId, final User userByUserId, + public CardEnroll(final Long cardId, final Long userId, final Long statusId, final String description, + final Card cardByCardId, final User userByUserId, final EnrollmentStatus enrollmentStatusByStatusId) { this.cardId = cardId; this.userId = userId; diff --git a/src/main/java/innotutor/innotutor_backend/entity/session/Session.java b/src/main/java/innotutor/innotutor_backend/entity/session/Session.java index 1b4783f..f5078a8 100644 --- a/src/main/java/innotutor/innotutor_backend/entity/session/Session.java +++ b/src/main/java/innotutor/innotutor_backend/entity/session/Session.java @@ -7,9 +7,8 @@ import org.hibernate.annotations.UpdateTimestamp; import javax.persistence.*; -import java.sql.Date; -import java.sql.Time; import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.Collection; import java.util.Objects; @@ -19,14 +18,14 @@ public class Session { // NOPMD - suppressed GodClass // NOPMD - suppressed TooManyFields // It's not a GodClass since it represents only entity from DB + private final static String SESSION_BY_SESSION_ID = "sessionBySessionId"; private Long sessionId; private Long tutorId; private Long subjectId; private Long sessionFormatId; private Long sessionTypeId; - private Date date; - private Time startTime; - private Time endTime; + private LocalDateTime startTime; + private LocalDateTime endTime; private String description; private Timestamp creationDate; private Timestamp lastUpdate; @@ -35,14 +34,14 @@ public class Session { // NOPMD - suppressed GodClass private SessionFormat sessionFormatBySessionFormatId; private SessionType sessionTypeBySessionTypeId; private Collection sessionStudentsBySessionId; + private Collection sessionRatingsBySessionId; public Session(final Long tutorId, final Long subjectId, final Long sessionFormatId, final Long sessionTypeId, - final Date date, - final Time startTime, - final Time endTime, + final LocalDateTime startTime, + final LocalDateTime endTime, final String description, final User userByTutorId, final Subject subjectBySubjectId, @@ -52,7 +51,6 @@ public Session(final Long tutorId, this.subjectId = subjectId; this.sessionFormatId = sessionFormatId; this.sessionTypeId = sessionTypeId; - this.date = date; this.startTime = startTime; this.endTime = endTime; this.description = description; @@ -113,33 +111,23 @@ public void setSessionTypeId(final Long sessionTypeId) { this.sessionTypeId = sessionTypeId; } - @Basic - @Column(name = "date", nullable = false) - public Date getDate() { - return date; - } - - public void setDate(final Date date) { - this.date = date; - } - @Basic @Column(name = "start_time", nullable = false) - public Time getStartTime() { + public LocalDateTime getStartTime() { return startTime; } - public void setStartTime(final Time startTime) { + public void setStartTime(final LocalDateTime startTime) { this.startTime = startTime; } @Basic @Column(name = "end_time", nullable = false) - public Time getEndTime() { + public LocalDateTime getEndTime() { return endTime; } - public void setEndTime(final Time endTime) { + public void setEndTime(final LocalDateTime endTime) { this.endTime = endTime; } @@ -199,9 +187,6 @@ public boolean equals(final Object object) { if (!Objects.equals(sessionTypeId, session.sessionTypeId)) { return false; } - if (!Objects.equals(date, session.date)) { - return false; - } if (!Objects.equals(startTime, session.startTime)) { return false; } @@ -224,7 +209,6 @@ public int hashCode() { result = 31 * result + (subjectId == null ? 0 : subjectId.hashCode()); result = 31 * result + (sessionFormatId == null ? 0 : sessionFormatId.hashCode()); result = 31 * result + (sessionTypeId == null ? 0 : sessionTypeId.hashCode()); - result = 31 * result + (date == null ? 0 : date.hashCode()); result = 31 * result + (startTime == null ? 0 : startTime.hashCode()); result = 31 * result + (endTime == null ? 0 : endTime.hashCode()); result = 31 * result + (description == null ? 0 : description.hashCode()); @@ -273,7 +257,7 @@ public void setSessionTypeBySessionTypeId(final SessionType sessionTypeBySession this.sessionTypeBySessionTypeId = sessionTypeBySessionTypeId; } - @OneToMany(mappedBy = "sessionBySessionId") + @OneToMany(mappedBy = SESSION_BY_SESSION_ID, cascade = CascadeType.REMOVE, orphanRemoval = true) public Collection getSessionStudentsBySessionId() { return sessionStudentsBySessionId; } @@ -281,4 +265,13 @@ public Collection getSessionStudentsBySessionId() { public void setSessionStudentsBySessionId(final Collection sessionStudentsBySessionId) { this.sessionStudentsBySessionId = sessionStudentsBySessionId; } + + @OneToMany(mappedBy = SESSION_BY_SESSION_ID) + public Collection getSessionRatingsBySessionId() { + return sessionRatingsBySessionId; + } + + public void setSessionRatingsBySessionId(final Collection sessionRatingsBySessionId) { + this.sessionRatingsBySessionId = sessionRatingsBySessionId; + } } diff --git a/src/main/java/innotutor/innotutor_backend/entity/card/CardRating.java b/src/main/java/innotutor/innotutor_backend/entity/session/SessionRating.java similarity index 56% rename from src/main/java/innotutor/innotutor_backend/entity/card/CardRating.java rename to src/main/java/innotutor/innotutor_backend/entity/session/SessionRating.java index 5e4afe1..c30dbef 100644 --- a/src/main/java/innotutor/innotutor_backend/entity/card/CardRating.java +++ b/src/main/java/innotutor/innotutor_backend/entity/session/SessionRating.java @@ -1,4 +1,4 @@ -package innotutor.innotutor_backend.entity.card; +package innotutor.innotutor_backend.entity.session; import innotutor.innotutor_backend.entity.user.User; import lombok.NoArgsConstructor; @@ -11,36 +11,47 @@ @NoArgsConstructor @Entity -@Table(name = "card_rating", schema = "public", catalog = "innotutor") -public class CardRating { - private Long cardRatingId; - private Long cardId; +@Table(name = "session_rating", schema = "public", catalog = "innotutor") +public class SessionRating { + private Long sessionRatingId; + private Long sessionId; private Long userId; private Integer mark; + private String feedback; private Timestamp creationDate; private Timestamp lastUpdate; - private Card cardByCardId; + private Session sessionBySessionId; private User userByUserId; + public SessionRating(final Long sessionId, final Long userId, final Integer mark, final String feedback, + final Session sessionBySessionId, final User userByUserId) { + this.sessionId = sessionId; + this.userId = userId; + this.mark = mark; + this.feedback = feedback; + this.sessionBySessionId = sessionBySessionId; + this.userByUserId = userByUserId; + } + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "card_rating_id", nullable = false) - public Long getCardRatingId() { - return cardRatingId; + @Column(name = "session_rating_id", nullable = false) + public Long getSessionRatingId() { + return sessionRatingId; } - public void setCardRatingId(final Long cardRatingId) { - this.cardRatingId = cardRatingId; + public void setSessionRatingId(final Long sessionRatingId) { + this.sessionRatingId = sessionRatingId; } @Basic - @Column(name = "card_id", nullable = false, insertable = false, updatable = false) - public Long getCardId() { - return cardId; + @Column(name = "session_id", nullable = false, insertable = false, updatable = false) + public Long getSessionId() { + return sessionId; } - public void setCardId(final Long cardId) { - this.cardId = cardId; + public void setSessionId(final Long sessionId) { + this.sessionId = sessionId; } @Basic @@ -63,6 +74,16 @@ public void setMark(final Integer mark) { this.mark = mark; } + @Basic + @Column(name = "feedback", length = 256) + public String getFeedback() { + return feedback; + } + + public void setFeedback(final String feedback) { + this.feedback = feedback; + } + @Basic @CreationTimestamp @Column(name = "creation_date", insertable = false, updatable = false) @@ -93,11 +114,11 @@ public boolean equals(final Object object) { if (object == null || getClass() != object.getClass()) { return false; } - final CardRating that = (CardRating) object; - if (!Objects.equals(cardRatingId, that.cardRatingId)) { + final SessionRating that = (SessionRating) object; + if (!Objects.equals(sessionRatingId, that.sessionRatingId)) { return false; } - if (!Objects.equals(cardId, that.cardId)) { + if (!Objects.equals(sessionId, that.sessionId)) { return false; } if (!Objects.equals(userId, that.userId)) { @@ -106,6 +127,9 @@ public boolean equals(final Object object) { if (!Objects.equals(mark, that.mark)) { return false; } + if (!Objects.equals(feedback, that.feedback)) { + return false; + } if (!Objects.equals(creationDate, that.creationDate)) { return false; } @@ -114,23 +138,24 @@ public boolean equals(final Object object) { @Override public int hashCode() { - int result = cardRatingId == null ? 0 : cardRatingId.hashCode(); - result = 31 * result + (cardId == null ? 0 : cardId.hashCode()); + int result = sessionRatingId == null ? 0 : sessionRatingId.hashCode(); + result = 31 * result + (sessionId == null ? 0 : sessionId.hashCode()); result = 31 * result + (userId == null ? 0 : userId.hashCode()); result = 31 * result + (mark == null ? 0 : mark.hashCode()); + result = 31 * result + (feedback == null ? 0 : feedback.hashCode()); result = 31 * result + (creationDate == null ? 0 : creationDate.hashCode()); result = 31 * result + (lastUpdate == null ? 0 : lastUpdate.hashCode()); return result; } @ManyToOne - @JoinColumn(name = "card_id", referencedColumnName = "card_id", nullable = false) - public Card getCardByCardId() { - return cardByCardId; + @JoinColumn(name = "session_id", referencedColumnName = "session_id", nullable = false) + public Session getSessionBySessionId() { + return sessionBySessionId; } - public void setCardByCardId(final Card cardByCardId) { - this.cardByCardId = cardByCardId; + public void setSessionBySessionId(final Session sessionBySessionId) { + this.sessionBySessionId = sessionBySessionId; } @ManyToOne diff --git a/src/main/java/innotutor/innotutor_backend/entity/user/User.java b/src/main/java/innotutor/innotutor_backend/entity/user/User.java index 44c80f4..9651232 100644 --- a/src/main/java/innotutor/innotutor_backend/entity/user/User.java +++ b/src/main/java/innotutor/innotutor_backend/entity/user/User.java @@ -1,8 +1,8 @@ package innotutor.innotutor_backend.entity.user; -import innotutor.innotutor_backend.entity.card.CardRating; import innotutor.innotutor_backend.entity.card.enrollment.CardEnroll; import innotutor.innotutor_backend.entity.session.Session; +import innotutor.innotutor_backend.entity.session.SessionRating; import lombok.NoArgsConstructor; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; @@ -28,7 +28,7 @@ public class User { //NOPMD - suppressed ShortClassName - It has the same databa private Timestamp creationDate; private Timestamp lastUpdate; private Collection cardEnrollsByUserId; - private Collection cardRatingsByUserId; + private Collection sessionRatingsByUserId; private Collection requestsByUserId; private Collection servicesByUserId; private Collection sessionsByUserId; @@ -198,12 +198,12 @@ public void setCardEnrollsByUserId(final Collection cardEnrollsByUse } @OneToMany(mappedBy = "userByUserId", cascade = CascadeType.ALL) - public Collection getCardRatingsByUserId() { - return cardRatingsByUserId; + public Collection getSessionRatingsByUserId() { + return sessionRatingsByUserId; } - public void setCardRatingsByUserId(final Collection cardRatingsByUserId) { - this.cardRatingsByUserId = cardRatingsByUserId; + public void setSessionRatingsByUserId(final Collection sessionRatingsByUserId) { + this.sessionRatingsByUserId = sessionRatingsByUserId; } @OneToMany(mappedBy = "userByStudentId", cascade = CascadeType.ALL) @@ -233,7 +233,7 @@ public void setSessionsByUserId(final Collection sessionsByUserId) { this.sessionsByUserId = sessionsByUserId; } - @OneToMany(mappedBy = "userByStudentId", cascade = CascadeType.ALL) + @OneToMany(mappedBy = "userByStudentId", cascade = CascadeType.REMOVE, orphanRemoval = true) public Collection getSessionStudentsByUserId() { return sessionStudentsByUserId; } diff --git a/src/main/java/innotutor/innotutor_backend/repository/session/SessionRatingRepository.java b/src/main/java/innotutor/innotutor_backend/repository/session/SessionRatingRepository.java new file mode 100644 index 0000000..db480c2 --- /dev/null +++ b/src/main/java/innotutor/innotutor_backend/repository/session/SessionRatingRepository.java @@ -0,0 +1,10 @@ +package innotutor.innotutor_backend.repository.session; + +import innotutor.innotutor_backend.entity.session.SessionRating; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository + +public interface SessionRatingRepository extends JpaRepository { +} diff --git a/src/main/java/innotutor/innotutor_backend/service/CardEnrollService.java b/src/main/java/innotutor/innotutor_backend/service/CardEnrollService.java index 11b6c84..e5305f0 100644 --- a/src/main/java/innotutor/innotutor_backend/service/CardEnrollService.java +++ b/src/main/java/innotutor/innotutor_backend/service/CardEnrollService.java @@ -19,7 +19,7 @@ import innotutor.innotutor_backend.repository.session.SessionFormatRepository; import innotutor.innotutor_backend.repository.session.SessionTypeRepository; import innotutor.innotutor_backend.repository.user.UserRepository; -import innotutor.innotutor_backend.service.utility.card.CardCreatorId; +import innotutor.innotutor_backend.service.utility.card.CardCreatorUser; import innotutor.innotutor_backend.service.utility.sessionconverter.sessionformat.CardEnrollSessionFormatConverter; import innotutor.innotutor_backend.service.utility.sessionconverter.sessionformat.CardSessionFormatConverter; import innotutor.innotutor_backend.service.utility.sessionconverter.sessiontype.CardEnrollSessionTypeConverter; @@ -28,6 +28,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -54,7 +55,7 @@ public EnrollmentDTO postCardEnroll(final EnrollmentDTO enrollmentDTO) { final Optional userOptional = userRepository.findById(enrollerId); if (cardOptional.isPresent() && userOptional.isPresent()) { final Card card = cardOptional.get(); - if (!enrollerId.equals(new CardCreatorId(card).creatorId()) && isUniquePair(enrollerId, cardId)) { + if (!enrollerId.equals(new CardCreatorUser(card).creatorId()) && isUniquePair(enrollerId, cardId)) { final List sessionFormats = this.getCommonSessionFormats(card, enrollmentDTO); final List sessionTypes = this.getCommonSessionTypes(card, enrollmentDTO); if (!sessionFormats.isEmpty() && !sessionTypes.isEmpty()) { @@ -139,23 +140,24 @@ public WaitingListDTO getWaitingList(final Long userId) { final Optional userOptional = userRepository.findById(userId); if (userOptional.isPresent()) { User user = userOptional.get(); - List students = new ArrayList<>(); - List tutors = new ArrayList<>(); + HashMap> students = new HashMap<>(2); + HashMap> tutors = new HashMap<>(2); for (CardEnroll cardEnroll : user.getCardEnrollsByUserId()) { - if (cardEnroll.getEnrollmentStatusByStatusId().getStatus().equals(REQUESTED)) { + String enrollmentStatus = cardEnroll.getEnrollmentStatusByStatusId().getStatus(); + if (enrollmentStatus.equals(REQUESTED) || enrollmentStatus.equals(REJECTED)) { Card card = cardEnroll.getCardByCardId(); + EnrollmentDTO enrollmentDTO = this.convertCardEnrollToEnrollmentDTO(cardEnroll); Request request = card.getRequestByCardId(); + innotutor.innotutor_backend.entity.user.Service service = card.getServiceByCardId(); if (request != null) { - students.add(this.convertCardEnrollToEnrollmentDTO(cardEnroll)); - } else { - innotutor.innotutor_backend.entity.user.Service service = card.getServiceByCardId(); - if (service != null) { - tutors.add(this.convertCardEnrollToEnrollmentDTO(cardEnroll)); - } + this.updateEnrollmentList(students, enrollmentDTO, enrollmentStatus); + } else if (service != null) { + this.updateEnrollmentList(tutors, enrollmentDTO, enrollmentStatus); } } } - return new WaitingListDTO(students, tutors); + return new WaitingListDTO(students.get(REQUESTED), students.get(REJECTED), + tutors.get(REQUESTED), tutors.get(REJECTED)); } return null; } @@ -284,4 +286,12 @@ private EnrollmentDTO convertCardEnrollToEnrollmentDTO(final CardEnroll cardEnro sessionFormat, sessionType); } + + private void updateEnrollmentList(HashMap> enrollmentList, + EnrollmentDTO enrollmentDTO, + String enrollmentStatus) { + List currentList = enrollmentList.getOrDefault(enrollmentStatus, new ArrayList<>()); + currentList.add(enrollmentDTO); + enrollmentList.put(enrollmentStatus, currentList); + } } diff --git a/src/main/java/innotutor/innotutor_backend/service/CardService.java b/src/main/java/innotutor/innotutor_backend/service/CardService.java index 82a76b0..5ae9259 100644 --- a/src/main/java/innotutor/innotutor_backend/service/CardService.java +++ b/src/main/java/innotutor/innotutor_backend/service/CardService.java @@ -1,6 +1,7 @@ package innotutor.innotutor_backend.service; import innotutor.innotutor_backend.dto.card.CardDTO; +import innotutor.innotutor_backend.dto.searcher.UserCard; import innotutor.innotutor_backend.entity.card.Card; import innotutor.innotutor_backend.entity.user.Request; import innotutor.innotutor_backend.entity.user.User; @@ -13,10 +14,9 @@ import innotutor.innotutor_backend.repository.user.RequestRepository; import innotutor.innotutor_backend.repository.user.ServiceRepository; import innotutor.innotutor_backend.repository.user.UserRepository; -import innotutor.innotutor_backend.service.utility.card.CardCreatorId; +import innotutor.innotutor_backend.service.utility.card.CardCreatorUser; import innotutor.innotutor_backend.service.utility.card.CardDTOCreator; import innotutor.innotutor_backend.service.utility.card.CardType; -import innotutor.innotutor_backend.service.utility.cardmanager.CardCreator; import innotutor.innotutor_backend.service.utility.cardmanager.CardUpdater; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; @@ -26,6 +26,7 @@ @Service @AllArgsConstructor public class CardService { + private final CardEnrollService cardEnrollService; private final CardRepository cardRepository; private final UserRepository userRepository; private final SessionFormatRepository sessionFormatRepository; @@ -40,71 +41,49 @@ public CardDTO getCardById(final Long cardId, final Long userId) { final Optional cardOptional = cardRepository.findById(cardId); if (cardOptional.isPresent()) { final Card card = cardOptional.get(); - final Long creatorId = new CardCreatorId(card).creatorId(); - if (!card.getHidden() || userId.equals(creatorId)) { - return new CardDTOCreator(card, creatorId, subjectRepository).create(); + final User creator = new CardCreatorUser(card).creator(); + if (!card.getHidden() || userId.equals(creator.getUserId())) { + return new CardDTOCreator(card, creator, cardEnrollService, userId).create(); } } return null; } - public CardDTO postCvCard(final CardDTO cardDTO) { - return new CardCreator(cardDTO, - CardType.SERVICE, - cardRepository, - userRepository, - subjectRepository, - sessionFormatRepository, - sessionTypeRepository, - serviceRepository, - requestRepository, - cardSessionFormatRepository, - cardSessionTypeRepository).postCard(); + public UserCard getCardFullInfoById(final Long cardId, final Long userId) { + final Optional cardOptional = cardRepository.findById(cardId); + if (cardOptional.isPresent()) { + final Card card = cardOptional.get(); + final User creator = new CardCreatorUser(card).creator(); + if (!card.getHidden() || userId.equals(creator.getUserId())) { + innotutor.innotutor_backend.entity.user.Service service = card.getServiceByCardId(); + Request request = card.getRequestByCardId(); + if (service != null) { + return new CardDTOCreator(card, creator, cardEnrollService, userId).createTutorCvDTO(); + } else if (request != null) { + return new CardDTOCreator(card, creator, cardEnrollService, userId).createStudentRequestDTO(); + } + } + } + return null; } - public CardDTO postRequestCard(final CardDTO cardDTO) { - return new CardCreator(cardDTO, - CardType.REQUEST, - cardRepository, - userRepository, - subjectRepository, - sessionFormatRepository, - sessionTypeRepository, - serviceRepository, - requestRepository, - cardSessionFormatRepository, - cardSessionTypeRepository).postCard(); + public CardDTO postCvCard(final CardDTO cardDTO, final Long userId) { + return this.postCard(CardType.SERVICE, cardDTO, userId); } - public CardDTO putCvCard(final CardDTO cardDTO) { - return new CardUpdater(cardDTO, - CardType.SERVICE, - cardRepository, - userRepository, - subjectRepository, - sessionFormatRepository, - sessionTypeRepository, - serviceRepository, - requestRepository, - cardSessionFormatRepository, - cardSessionTypeRepository).putCard(); + public CardDTO postRequestCard(final CardDTO cardDTO, final Long userId) { + return this.postCard(CardType.REQUEST, cardDTO, userId); } - public CardDTO putRequestCard(final CardDTO cardDTO) { - return new CardUpdater(cardDTO, - CardType.REQUEST, - cardRepository, - userRepository, - subjectRepository, - sessionFormatRepository, - sessionTypeRepository, - serviceRepository, - requestRepository, - cardSessionFormatRepository, - cardSessionTypeRepository).putCard(); + public CardDTO putCvCard(final Long cardId, final CardDTO cardDTO, final Long userId) { + return this.putCard(cardId, CardType.SERVICE, cardDTO, userId); } - public boolean deleteCardById(final Long userId, final Long cardId) { + public CardDTO putRequestCard(final Long cardId, final CardDTO cardDTO, final Long userId) { + return this.putCard(cardId, CardType.REQUEST, cardDTO, userId); + } + + public boolean deleteCardById(final Long cardId, final Long userId) { final Optional cardOptional = cardRepository.findById(cardId); final Optional userOptional = userRepository.findById(userId); if (!cardOptional.isPresent() || !userOptional.isPresent()) { @@ -122,4 +101,37 @@ public boolean deleteCardById(final Long userId, final Long cardId) { } return false; } + + private CardDTO postCard(final CardType cardType, final CardDTO cardDTO, final Long userId) { + cardDTO.setCreatorId(userId); + return new innotutor.innotutor_backend.service.utility.cardmanager.CardCreator(cardDTO, + cardType, + cardRepository, + userRepository, + subjectRepository, + sessionFormatRepository, + sessionTypeRepository, + serviceRepository, + requestRepository, + cardSessionFormatRepository, + cardSessionTypeRepository).postCard(); + } + + private CardDTO putCard(final Long cardId, final CardType cardType, final CardDTO cardDTO, final Long userId) { + cardDTO.setCreatorId(userId); + cardDTO.setCardId(cardId); + return new CardUpdater(cardDTO, + cardType, + userId, + cardRepository, + userRepository, + subjectRepository, + sessionFormatRepository, + sessionTypeRepository, + serviceRepository, + requestRepository, + cardSessionFormatRepository, + cardSessionTypeRepository, + cardEnrollService).putCard(); + } } diff --git a/src/main/java/innotutor/innotutor_backend/service/CardsListService.java b/src/main/java/innotutor/innotutor_backend/service/CardsListService.java index 5f7f2aa..6a55086 100644 --- a/src/main/java/innotutor/innotutor_backend/service/CardsListService.java +++ b/src/main/java/innotutor/innotutor_backend/service/CardsListService.java @@ -2,7 +2,6 @@ import innotutor.innotutor_backend.dto.card.CardDTO; import innotutor.innotutor_backend.entity.user.User; -import innotutor.innotutor_backend.repository.session.SubjectRepository; import innotutor.innotutor_backend.repository.user.UserRepository; import innotutor.innotutor_backend.service.utility.card.CardDTOCreator; import lombok.AllArgsConstructor; @@ -17,7 +16,7 @@ @AllArgsConstructor public class CardsListService { private final UserRepository userRepository; - private final SubjectRepository subjectRepository; + private final CardEnrollService cardEnrollService; public List getServices(final Long userId) { //NOPMD - suppressed ReturnEmptyCollectionRatherThanNull - null indicates that such collection doesn't exist final Optional userOptional = userRepository.findById(userId); @@ -26,7 +25,11 @@ public List getServices(final Long userId) { //NOPMD - suppressed Retur final List services = new ArrayList<>(); user.getServicesByUserId().forEach(service -> services.add( - new CardDTOCreator(service.getCardByCardId(), user.getUserId(), subjectRepository).create() + new CardDTOCreator( + service.getCardByCardId(), + user, + cardEnrollService, + userId).create() ) ); return services; @@ -47,7 +50,10 @@ public List getRequests(final Long userId) { //NOPMD - suppressed Retur final List requests = new ArrayList<>(); user.getRequestsByUserId().forEach(request -> requests.add( - new CardDTOCreator(request.getCardByCardId(), user.getUserId(), subjectRepository).create() + new CardDTOCreator(request.getCardByCardId(), + user, + cardEnrollService, + userId).create() ) ); return requests; diff --git a/src/main/java/innotutor/innotutor_backend/service/SearcherService.java b/src/main/java/innotutor/innotutor_backend/service/SearcherService.java index 6d985b5..d5e0c1e 100644 --- a/src/main/java/innotutor/innotutor_backend/service/SearcherService.java +++ b/src/main/java/innotutor/innotutor_backend/service/SearcherService.java @@ -3,16 +3,18 @@ import innotutor.innotutor_backend.dto.searcher.StudentRequestDTO; import innotutor.innotutor_backend.dto.searcher.TutorCvDTO; import innotutor.innotutor_backend.dto.searcher.UserCard; -import innotutor.innotutor_backend.entity.card.CardRating; import innotutor.innotutor_backend.entity.user.User; import innotutor.innotutor_backend.repository.card.CardRepository; -import innotutor.innotutor_backend.service.utility.card.AverageCardRating; +import innotutor.innotutor_backend.service.utility.card.Ratings; import innotutor.innotutor_backend.service.utility.sessionconverter.sessionformat.CardSessionFormatConverter; import innotutor.innotutor_backend.service.utility.sessionconverter.sessiontype.CardSessionTypeConverter; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; @Service @@ -78,17 +80,17 @@ private List getAllTutorCvDTOList(final Long userId) { final List tutors = new ArrayList<>(); cardRepository.findByHidden(false).forEach(card -> { if (card.getServiceByCardId() != null) { - final Collection ratings = card.getCardRatingsByCardId(); final User tutor = card.getServiceByCardId().getUserByTutorId(); final Long cardId = card.getCardId(); + Ratings ratings = new Ratings(tutor, card.getSubjectId()); tutors.add( new TutorCvDTO( tutor.getUserId(), tutor.getName(), tutor.getSurname(), cardId, - new AverageCardRating(ratings).averageRating(), - ratings.size(), + ratings.averageRating(), + ratings.countVoted(), card.getDescription(), card.getSubjectBySubjectId().getName(), new CardSessionFormatConverter(card.getCardSessionFormatsByCardId()).stringList(), diff --git a/src/main/java/innotutor/innotutor_backend/service/SessionService.java b/src/main/java/innotutor/innotutor_backend/service/SessionService.java index 13e0ee2..550dc01 100644 --- a/src/main/java/innotutor/innotutor_backend/service/SessionService.java +++ b/src/main/java/innotutor/innotutor_backend/service/SessionService.java @@ -2,47 +2,44 @@ import innotutor.innotutor_backend.dto.UserDTO; import innotutor.innotutor_backend.dto.card.CardDTO; +import innotutor.innotutor_backend.dto.card.SessionRatingDTO; import innotutor.innotutor_backend.dto.card.SubjectDTO; import innotutor.innotutor_backend.dto.enrollment.EnrollmentDTO; +import innotutor.innotutor_backend.dto.session.ScheduleDTO; import innotutor.innotutor_backend.dto.session.SessionDTO; import innotutor.innotutor_backend.dto.session.sessionsettings.SessionFormatDTO; import innotutor.innotutor_backend.dto.session.sessionsettings.SessionTypeDTO; import innotutor.innotutor_backend.entity.card.Card; -import innotutor.innotutor_backend.entity.session.Session; -import innotutor.innotutor_backend.entity.session.SessionFormat; -import innotutor.innotutor_backend.entity.session.SessionType; -import innotutor.innotutor_backend.entity.session.Subject; +import innotutor.innotutor_backend.entity.session.*; import innotutor.innotutor_backend.entity.user.SessionStudent; import innotutor.innotutor_backend.entity.user.User; import innotutor.innotutor_backend.repository.card.CardRepository; -import innotutor.innotutor_backend.repository.session.SessionFormatRepository; -import innotutor.innotutor_backend.repository.session.SessionRepository; -import innotutor.innotutor_backend.repository.session.SessionTypeRepository; -import innotutor.innotutor_backend.repository.session.SubjectRepository; +import innotutor.innotutor_backend.repository.session.*; import innotutor.innotutor_backend.repository.user.SessionStudentRepository; import innotutor.innotutor_backend.repository.user.UserRepository; +import innotutor.innotutor_backend.service.utility.card.ValidSessionRating; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.time.LocalDateTime; +import java.util.*; import java.util.stream.Collectors; @Service @AllArgsConstructor public class SessionService { private final static String PRIVATE_TYPE = "private"; - private final CardsListService cardsListService; private final UserService userService; + private final StudentsService studentsService; + private final CardsListService cardsListService; private final SessionRepository sessionRepository; private final SessionFormatRepository sessionFormatRepository; private final SessionTypeRepository sessionTypeRepository; - private final SubjectRepository subjectRepository; - private final UserRepository userRepository; private final SessionStudentRepository sessionStudentRepository; + private final SessionRatingRepository sessionRatingRepository; + private final UserRepository userRepository; private final CardRepository cardRepository; - private final StudentsService studentsService; + private final SubjectRepository subjectRepository; public List getSessionFormats() { final List sessionFormats = new ArrayList<>(); @@ -82,11 +79,15 @@ public List getAvailableRequestSubjects(final Long userId) { //NOPMD return null; } - public SessionDTO postSession(final SessionDTO sessionDTO) { + public SessionDTO postSession(final SessionDTO sessionDTO, final Long userId) { + sessionDTO.setTutorId(userId); final SessionFormat sessionFormat = sessionFormatRepository.findSessionFormatByName(sessionDTO.getSessionFormat()); final SessionType sessionType = sessionTypeRepository.findSessionTypeByName(sessionDTO.getSessionType()); - final Optional userOptional = userRepository.findById(sessionDTO.getTutorId()); - if (userOptional.isPresent() && sessionFormat != null && sessionType != null) { + final Optional userOptional = userRepository.findById(userId); + if (sessionDTO.getStartTime().compareTo(LocalDateTime.now()) >= 0 + && userOptional.isPresent() + && sessionFormat != null + && sessionType != null) { final User tutor = userOptional.get(); final Optional cardOptional = tutor.getServicesByUserId().stream() .map(innotutor.innotutor_backend.entity.user.Service::getCardByCardId) @@ -99,6 +100,22 @@ public SessionDTO postSession(final SessionDTO sessionDTO) { return null; } + public Boolean cancelSession(final Long sessionId, final Long userId) { + Optional sessionOptional = sessionRepository.findById(sessionId); + Optional userOptional = userRepository.findById(userId); + if (sessionOptional.isPresent() && userOptional.isPresent()) { + Session session = sessionOptional.get(); + User user = userOptional.get(); + if (session.getEndTime().compareTo(LocalDateTime.now()) >= 0) { + return session.getTutorId().equals(userId) + ? this.cancelSessionTutor(session) + : this.cancelSessionStudent(sessionId, user); + } + return null; + } + return false; + } + public List filterStudentsForSession(final Long tutorId, final String specifiedSubject, final String specifiedFormat, @@ -125,6 +142,53 @@ public List filterStudentsForSession(final Long tutorId, return result; } + public ScheduleDTO getSchedule(final Long userId) { + final Optional userOptional = userRepository.findById(userId); + if (userOptional.isPresent()) { + final User user = userOptional.get(); + Collection studyingSessions = user.getSessionStudentsByUserId() + .stream() + .map(SessionStudent::getSessionBySessionId) + .collect(Collectors.toList()); + Collection teachingSessions = user.getSessionsByUserId(); + HashMap> studyingSessionsSeparated + = this.separateConductedUpcomingSessions(studyingSessions); + HashMap> teachingSessionsSeparated + = this.separateConductedUpcomingSessions(teachingSessions); + return new ScheduleDTO( + studyingSessionsSeparated.get("conducted"), + studyingSessionsSeparated.get("upcoming"), + teachingSessionsSeparated.get("conducted"), + teachingSessionsSeparated.get("upcoming") + ); + } + return null; + } + + public SessionRatingDTO rateSession(final SessionRatingDTO sessionRatingDTO, final Long userId) { + Optional sessionOptional = sessionRepository.findById(sessionRatingDTO.getSessionId()); + Optional userOptional = userRepository.findById(userId); + if (sessionOptional.isPresent() && userOptional.isPresent()) { + Session session = sessionOptional.get(); + if (session.getEndTime().compareTo(LocalDateTime.now()) < 0 && this.isSessionStudentExist(session, userId)) { + return this.changeSessionRating(sessionRatingDTO, session, userId, userOptional.get()); + } + } + return null; + } + + public boolean deleteRating(final Long sessionId, final Long userId) { + Optional sessionOptional = sessionRepository.findById(sessionId); + Optional userOptional = userRepository.findById(userId); + if (sessionOptional.isPresent() && userOptional.isPresent()) { + Session session = sessionOptional.get(); + if (this.isSessionStudentExist(session, userId)) { + return this.deleteSessionRating(session, userId); + } + } + return false; + } + private SessionDTO createSession(final User tutor, final Card card, final SessionDTO sessionDTO, final SessionFormat sessionFormat, final SessionType sessionType) { final List students = this.getValidStudents(tutor.getUserId(), sessionDTO.getStudentIDsList(), @@ -138,7 +202,6 @@ private SessionDTO createSession(final User tutor, final Card card, final Sessio card.getSubjectId(), sessionFormat.getSessionFormatId(), sessionType.getSessionTypeId(), - sessionDTO.getDate(), sessionDTO.getStartTime(), sessionDTO.getEndTime(), sessionDTO.getDescription(), @@ -153,7 +216,6 @@ private SessionDTO createSession(final User tutor, final Card card, final Sessio tutor.getUserId(), studentIDsList, card.getSubjectBySubjectId().getName(), - session.getDate(), session.getStartTime(), session.getEndTime(), sessionFormat.getName(), @@ -163,6 +225,24 @@ private SessionDTO createSession(final User tutor, final Card card, final Sessio return null; } + private boolean cancelSessionTutor(Session session) { + sessionRepository.delete(session); + return true; + } + + private boolean cancelSessionStudent(Long sessionId, User student) { + Optional sessionStudentToDeleteOptional = student.getSessionStudentsByUserId() + .stream() + .filter(sessionStudent -> sessionStudent.getSessionId().equals(sessionId)) + .findAny(); + if (sessionStudentToDeleteOptional.isPresent()) { + SessionStudent sessionStudentToDelete = sessionStudentToDeleteOptional.get(); + sessionStudentRepository.delete(sessionStudentToDelete); + return true; + } + return false; + } + private List getValidStudents(final Long tutorId, final List studentIDsList, final String subject, final String sessionFormat, final String sessionType) { final List validStudents = new ArrayList<>(); @@ -179,11 +259,62 @@ private List getValidStudents(final Long tutorId, final List student private void saveSessionStudentList(final Session session, final List students) { final List sessionStudentList = new ArrayList<>(); - students.forEach(student -> sessionStudentList.add(new SessionStudent(session.getSessionId(), student.getUserId(), - session, student))); + students.forEach(student -> sessionStudentList.add( + new SessionStudent(session.getSessionId(), student.getUserId(), session, student))); sessionStudentRepository.saveAll(sessionStudentList); } + private SessionRatingDTO changeSessionRating(final SessionRatingDTO sessionRatingDTO, + final Session session, + final Long userId, + final User student) { + Long sessionId = sessionRatingDTO.getSessionId(); + Integer mark = sessionRatingDTO.getMark(); + if (new ValidSessionRating(mark).isValid()) { + Optional sessionRatingOptional = session.getSessionRatingsBySessionId() + .stream() + .filter(sessionRating -> sessionRating.getUserId().equals(userId)) + .findAny(); + String feedback = sessionRatingDTO.getFeedback(); + SessionRating savedSessionRating; + if (sessionRatingOptional.isPresent()) { + SessionRating sessionRating = sessionRatingOptional.get(); + sessionRating.setMark(mark); + sessionRating.setFeedback(feedback); + savedSessionRating = sessionRatingRepository.save(sessionRating); + } else { + savedSessionRating = sessionRatingRepository.save( + new SessionRating(sessionId, userId, mark, feedback, session, student)); + } + return new SessionRatingDTO( + savedSessionRating.getSessionId(), + savedSessionRating.getMark(), + savedSessionRating.getFeedback()); + } else if (mark == null) { + this.deleteSessionRating(session, userId); + return sessionRatingDTO; + } + return null; + } + + private boolean deleteSessionRating(final Session session, final Long studentId) { + Optional sessionRatingOptional = session.getSessionRatingsBySessionId() + .stream() + .filter(sessionRating -> sessionRating.getUserId().equals(studentId)) + .findAny(); + if (sessionRatingOptional.isPresent()) { + sessionRatingRepository.delete(sessionRatingOptional.get()); + return true; + } + return false; + } + + private boolean isSessionStudentExist(final Session session, final Long studentId) { + return session.getSessionStudentsBySessionId() + .stream() + .anyMatch(sessionStudent -> sessionStudent.getStudentId().equals(studentId)); + } + private List getAvailableSubjects(final List userCards) { final List result = new ArrayList<>(); for (final SubjectDTO subject : this.getSubjects()) { @@ -200,4 +331,37 @@ private List getAvailableSubjects(final List userCards) { } return result; } + + private HashMap> separateConductedUpcomingSessions(Collection sessions) { + LocalDateTime currentDateTime = LocalDateTime.now(); + List conductedSessions = sessions.stream() + .filter(session -> session.getEndTime().compareTo(currentDateTime) < 0) + .map(this::convertSessionToSessionDTO) + .sorted(Comparator.comparing(SessionDTO::getStartTime).reversed()) + .collect(Collectors.toList()); + List upcomingSessions = sessions.stream() + .filter(session -> session.getEndTime().compareTo(currentDateTime) >= 0) + .map(this::convertSessionToSessionDTO) + .sorted(Comparator.comparing(SessionDTO::getStartTime)) + .collect(Collectors.toList()); + HashMap> separatedSessions = new HashMap<>(2); + separatedSessions.put("conducted", conductedSessions); + separatedSessions.put("upcoming", upcomingSessions); + return separatedSessions; + } + + private SessionDTO convertSessionToSessionDTO(Session session) { + final List studentIDsList = new ArrayList<>(); + session.getSessionStudentsBySessionId().forEach(student -> studentIDsList.add(student.getStudentId())); + return new SessionDTO( + session.getSessionId(), + session.getTutorId(), + studentIDsList, + session.getSubjectBySubjectId().getName(), + session.getStartTime(), + session.getEndTime(), + session.getSessionFormatBySessionFormatId().getName(), + session.getSessionTypeBySessionTypeId().getName(), + session.getDescription()); + } } diff --git a/src/main/java/innotutor/innotutor_backend/service/utility/card/AverageCardRating.java b/src/main/java/innotutor/innotutor_backend/service/utility/card/AverageCardRating.java deleted file mode 100644 index fb0fc2d..0000000 --- a/src/main/java/innotutor/innotutor_backend/service/utility/card/AverageCardRating.java +++ /dev/null @@ -1,23 +0,0 @@ -package innotutor.innotutor_backend.service.utility.card; - -import innotutor.innotutor_backend.entity.card.CardRating; -import lombok.AllArgsConstructor; - -import java.util.Collection; - -@AllArgsConstructor -public class AverageCardRating { - - private final Collection cardRatings; - - public Double averageRating() { - if (cardRatings.isEmpty()) { - return null; - } - double sum = 0; - for (final CardRating rating : cardRatings) { - sum += rating.getMark(); - } - return sum / cardRatings.size(); - } -} diff --git a/src/main/java/innotutor/innotutor_backend/service/utility/card/CardCreatorId.java b/src/main/java/innotutor/innotutor_backend/service/utility/card/CardCreatorUser.java similarity index 52% rename from src/main/java/innotutor/innotutor_backend/service/utility/card/CardCreatorId.java rename to src/main/java/innotutor/innotutor_backend/service/utility/card/CardCreatorUser.java index ebb226e..8b68b43 100644 --- a/src/main/java/innotutor/innotutor_backend/service/utility/card/CardCreatorId.java +++ b/src/main/java/innotutor/innotutor_backend/service/utility/card/CardCreatorUser.java @@ -1,11 +1,12 @@ package innotutor.innotutor_backend.service.utility.card; import innotutor.innotutor_backend.entity.card.Card; +import innotutor.innotutor_backend.entity.user.User; -public class CardCreatorId { +public class CardCreatorUser { private final transient Card card; - public CardCreatorId(final Card card) { + public CardCreatorUser(final Card card) { this.card = card; } @@ -18,4 +19,14 @@ public Long creatorId() { } return null; } + + public User creator() { + if (card.getServiceByCardId() != null) { + return card.getServiceByCardId().getUserByTutorId(); + } + if (card.getRequestByCardId() != null) { + return card.getRequestByCardId().getUserByStudentId(); + } + return null; + } } diff --git a/src/main/java/innotutor/innotutor_backend/service/utility/card/CardDTOCreator.java b/src/main/java/innotutor/innotutor_backend/service/utility/card/CardDTOCreator.java index f4946f0..b545910 100644 --- a/src/main/java/innotutor/innotutor_backend/service/utility/card/CardDTOCreator.java +++ b/src/main/java/innotutor/innotutor_backend/service/utility/card/CardDTOCreator.java @@ -1,37 +1,73 @@ package innotutor.innotutor_backend.service.utility.card; import innotutor.innotutor_backend.dto.card.CardDTO; +import innotutor.innotutor_backend.dto.searcher.StudentRequestDTO; +import innotutor.innotutor_backend.dto.searcher.TutorCvDTO; import innotutor.innotutor_backend.entity.card.Card; -import innotutor.innotutor_backend.entity.card.CardRating; -import innotutor.innotutor_backend.repository.session.SubjectRepository; +import innotutor.innotutor_backend.entity.user.User; +import innotutor.innotutor_backend.service.CardEnrollService; import innotutor.innotutor_backend.service.utility.sessionconverter.sessionformat.CardSessionFormatConverter; import innotutor.innotutor_backend.service.utility.sessionconverter.sessiontype.CardSessionTypeConverter; -import java.util.Collection; - public class CardDTOCreator { private final transient Card card; - private final transient Long creatorId; - private final transient SubjectRepository subjectRepository; + private final transient User creator; + private final transient CardEnrollService cardEnrollService; + private final transient Long userId; - public CardDTOCreator(final Card card, final Long creatorId, final SubjectRepository subjectRepository) { + public CardDTOCreator(final Card card, final User creator, + final CardEnrollService cardEnrollService, final Long userId) { this.card = card; - this.creatorId = creatorId; - this.subjectRepository = subjectRepository; + this.creator = creator; + this.cardEnrollService = cardEnrollService; + this.userId = userId; } public CardDTO create() { - final Collection ratings = card.getCardRatingsByCardId(); + final Ratings ratings = new Ratings(creator, card.getSubjectId()); return new CardDTO( card.getCardId(), - creatorId, - subjectRepository.getById(card.getSubjectId()).getName(), - new AverageCardRating(ratings).averageRating(), - ratings.size(), + creator.getUserId(), + card.getSubjectBySubjectId().getName(), + ratings.averageRating(), + ratings.countVoted(), card.getDescription(), card.getHidden(), new CardSessionFormatConverter(card.getCardSessionFormatsByCardId()).stringList(), new CardSessionTypeConverter(card.getCardSessionTypesByCardId()).stringList() ); } + + public TutorCvDTO createTutorCvDTO() { + final Long cardId = card.getCardId(); + final Ratings ratings = new Ratings(creator, card.getSubjectId()); + return new TutorCvDTO( + creator.getUserId(), + creator.getName(), + creator.getSurname(), + cardId, + ratings.averageRating(), + ratings.countVoted(), + card.getDescription(), + card.getSubjectBySubjectId().getName(), + new CardSessionFormatConverter(card.getCardSessionFormatsByCardId()).stringList(), + new CardSessionTypeConverter(card.getCardSessionTypesByCardId()).stringList(), + cardEnrollService.isEnrolled(cardId, userId) + ); + } + + public StudentRequestDTO createStudentRequestDTO() { + final Long cardId = card.getCardId(); + return new StudentRequestDTO( + creator.getUserId(), + creator.getName(), + creator.getSurname(), + cardId, + card.getDescription(), + card.getSubjectBySubjectId().getName(), + new CardSessionFormatConverter(card.getCardSessionFormatsByCardId()).stringList(), + new CardSessionTypeConverter(card.getCardSessionTypesByCardId()).stringList(), + cardEnrollService.isEnrolled(cardId, userId) + ); + } } diff --git a/src/main/java/innotutor/innotutor_backend/service/utility/card/Ratings.java b/src/main/java/innotutor/innotutor_backend/service/utility/card/Ratings.java new file mode 100644 index 0000000..f19ea38 --- /dev/null +++ b/src/main/java/innotutor/innotutor_backend/service/utility/card/Ratings.java @@ -0,0 +1,39 @@ +package innotutor.innotutor_backend.service.utility.card; + +import innotutor.innotutor_backend.entity.session.Session; +import innotutor.innotutor_backend.entity.session.SessionRating; +import innotutor.innotutor_backend.entity.user.User; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +public class Ratings { + + private final List marks; + + public Ratings(final User tutor, final Long subjectId) { + this.marks = tutor.getSessionsByUserId() + .stream() + .filter(session -> session.getSubjectId().equals(subjectId)) + .map(Session::getSessionRatingsBySessionId) + .flatMap(Collection::stream) + .map(SessionRating::getMark) + .collect(Collectors.toList()); + } + + public Double averageRating() { + if (marks.isEmpty()) { + return null; + } + double sum = 0; + for (final Integer mark : marks) { + sum += mark; + } + return sum / marks.size(); + } + + public Integer countVoted() { + return marks.size(); + } +} diff --git a/src/main/java/innotutor/innotutor_backend/service/utility/card/ValidSessionRating.java b/src/main/java/innotutor/innotutor_backend/service/utility/card/ValidSessionRating.java new file mode 100644 index 0000000..2c9bf43 --- /dev/null +++ b/src/main/java/innotutor/innotutor_backend/service/utility/card/ValidSessionRating.java @@ -0,0 +1,16 @@ +package innotutor.innotutor_backend.service.utility.card; + +public class ValidSessionRating { + + private final Integer mark; + private final int LOW_MARK = 0; + private final int HIGH_MARK = 5; + + public ValidSessionRating(final Integer mark) { + this.mark = mark; + } + + public boolean isValid() { + return mark != null && mark >= LOW_MARK && mark <= HIGH_MARK; + } +} diff --git a/src/main/java/innotutor/innotutor_backend/service/utility/cardmanager/CardUpdater.java b/src/main/java/innotutor/innotutor_backend/service/utility/cardmanager/CardUpdater.java index 721a404..c875ba7 100644 --- a/src/main/java/innotutor/innotutor_backend/service/utility/cardmanager/CardUpdater.java +++ b/src/main/java/innotutor/innotutor_backend/service/utility/cardmanager/CardUpdater.java @@ -13,7 +13,8 @@ import innotutor.innotutor_backend.repository.user.RequestRepository; import innotutor.innotutor_backend.repository.user.ServiceRepository; import innotutor.innotutor_backend.repository.user.UserRepository; -import innotutor.innotutor_backend.service.utility.card.CardCreatorId; +import innotutor.innotutor_backend.service.CardEnrollService; +import innotutor.innotutor_backend.service.utility.card.CardCreatorUser; import innotutor.innotutor_backend.service.utility.card.CardDTOCreator; import innotutor.innotutor_backend.service.utility.card.CardType; import innotutor.innotutor_backend.service.utility.saver.SessionFormatsCardSaver; @@ -30,6 +31,7 @@ public class CardUpdater { private final transient Card card; private final transient List sessionFormats; private final transient List sessionTypes; + private final transient Long userId; private final transient CardRepository cardRepository; private final transient UserRepository userRepository; private final transient SubjectRepository subjectRepository; @@ -39,9 +41,11 @@ public class CardUpdater { private final transient RequestRepository requestRepository; private final transient CardSessionFormatRepository cardSessionFormatRepository; private final transient CardSessionTypeRepository cardSessionTypeRepository; + private final transient CardEnrollService cardEnrollService; public CardUpdater(final CardDTO cardDTO, final CardType type, + final Long userId, final CardRepository cardRepository, final UserRepository userRepository, final SubjectRepository subjectRepository, @@ -50,9 +54,11 @@ public CardUpdater(final CardDTO cardDTO, final ServiceRepository serviceRepository, final RequestRepository requestRepository, final CardSessionFormatRepository cardSessionFormatRepository, - final CardSessionTypeRepository cardSessionTypeRepository) { + final CardSessionTypeRepository cardSessionTypeRepository, + final CardEnrollService cardEnrollService) { this.cardDTO = cardDTO; this.type = type; + this.userId = userId; this.cardRepository = cardRepository; this.userRepository = userRepository; this.subjectRepository = subjectRepository; @@ -62,6 +68,7 @@ public CardUpdater(final CardDTO cardDTO, this.requestRepository = requestRepository; this.cardSessionFormatRepository = cardSessionFormatRepository; this.cardSessionTypeRepository = cardSessionTypeRepository; + this.cardEnrollService = cardEnrollService; card = cardRepository.findById(cardDTO.getCardId()).orElse(null); sessionFormats = new SessionFormatEntityConverter( cardDTO.getSessionFormat(), @@ -75,7 +82,7 @@ public CardUpdater(final CardDTO cardDTO, public CardDTO putCard() { if (card == null) { - return new CardCreator(cardDTO, + return new innotutor.innotutor_backend.service.utility.cardmanager.CardCreator(cardDTO, type, cardRepository, userRepository, @@ -87,9 +94,9 @@ public CardDTO putCard() { cardSessionFormatRepository, cardSessionTypeRepository).postCard(); } - if (cardDTO.getCreatorId().equals(new CardCreatorId(card).creatorId()) + if (cardDTO.getCreatorId().equals(new CardCreatorUser(card).creatorId()) && !sessionFormats.isEmpty() && !sessionTypes.isEmpty()) { - return updateCard(); + return this.updateCard(); } return null; } @@ -100,7 +107,7 @@ private CardDTO updateCard() { Card savedCard = cardRepository.save(card); savedCard = this.updateSessionFormats(savedCard); savedCard = this.updateSessionTypes(savedCard); - return new CardDTOCreator(savedCard, cardDTO.getCreatorId(), subjectRepository).create(); + return new CardDTOCreator(savedCard, new CardCreatorUser(savedCard).creator(), cardEnrollService, userId).create(); } private Card updateSessionFormats(final Card card) {