From 6d80a84df04ba5e1c20951baa81393da5d0e0d55 Mon Sep 17 00:00:00 2001 From: Woojciech Date: Sat, 24 Dec 2022 22:30:52 +0100 Subject: [PATCH 01/10] Further forum refactor --- .../java/dev/wms/pwrapi/api/ForumAPI_r.java | 11 +++++++- .../dev/wms/pwrapi/entity/forum/Review_r.java | 6 ++++- .../pwrapi/entity/forum/TeacherInfoDTO.java | 12 +++++++++ .../entity/forum/TeacherWithReviewsDTO.java | 20 ++++++++++++++ .../pwrapi/repository/ReviewRepository.java | 6 +++++ .../pwrapi/repository/TeacherRepository.java | 9 +++++++ .../pwrapi/service/forum/ForumService_r.java | 27 +++++++++++++++++-- src/main/resources/application.properties | 1 + 8 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java create mode 100644 src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java diff --git a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java index a630d39..26434d3 100644 --- a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java +++ b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java @@ -1,6 +1,8 @@ package dev.wms.pwrapi.api; import dev.wms.pwrapi.entity.forum.Review_r; +import dev.wms.pwrapi.entity.forum.TeacherWithReviewsDTO; +import dev.wms.pwrapi.entity.forum.Teacher_r; import dev.wms.pwrapi.service.forum.ForumService_r; import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; import io.swagger.v3.oas.annotations.Operation; @@ -34,7 +36,7 @@ public ResponseEntity getTotalReviews() { @GetMapping("/opinie/{reviewId}") @Operation(summary = "Returns review with specified id.") - public ResponseEntity getReviewById(@PathVariable @Positive Long reviewId) { + public ResponseEntity getReviewById(@PathVariable @Positive(message = "reviewId has to be >= 0") Long reviewId) { return ResponseEntity.of(forumService.getReviewById(reviewId)); } @@ -43,4 +45,11 @@ public ResponseEntity getReviewById(@PathVariable @Positive Long revie public ResponseEntity getTotalTeachers() { return ResponseEntity.ok(forumService.getTotalTeachers()); } + + @GetMapping(value = "/prowadzacy/{teacherId}") + @Operation(summary = "Returns teacher with specified id.") + public ResponseEntity getTeacherWithReviews(@PathVariable @Positive (message = "teacherId has to be >= 0") + Long teacherId) { + return ResponseEntity.ok(forumService.getTeacherWithAllReviews(teacherId)); + } } diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java b/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java index 10a8b98..e6ee292 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java @@ -1,9 +1,13 @@ package dev.wms.pwrapi.entity.forum; +import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import org.springframework.data.annotation.Id; +import java.time.LocalDateTime; + @Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) public class Review_r { @Id private Long reviewId; @@ -12,6 +16,6 @@ public class Review_r { private String title; private String review; private String reviewer; - private String postDate; + private LocalDateTime postDate; private Teacher_r teacher; } diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java new file mode 100644 index 0000000..e030773 --- /dev/null +++ b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java @@ -0,0 +1,12 @@ +package dev.wms.pwrapi.entity.forum; + +import lombok.Data; + +@Data +public class TeacherInfoDTO { + private Long teacherId; + private String category; + private String academicTitle; + private String fullName; + private Double averageRating; +} diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java new file mode 100644 index 0000000..b5f0b2f --- /dev/null +++ b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java @@ -0,0 +1,20 @@ +package dev.wms.pwrapi.entity.forum; + +import lombok.Builder; +import lombok.Data; +import org.springframework.data.annotation.Id; + +import java.util.Set; + + +@Builder +@Data +public class TeacherWithReviewsDTO { + @Id + private Long teacherId; + private String category; + private String academicTitle; + private String fullName; + private Double averageRating; + private Set reviews; +} diff --git a/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java b/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java index 66d45c4..dea6e38 100644 --- a/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java +++ b/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java @@ -7,6 +7,7 @@ import org.springframework.data.repository.query.Param; import java.util.Optional; +import java.util.Set; public interface ReviewRepository extends PagingAndSortingRepository { @@ -23,4 +24,9 @@ public interface ReviewRepository extends PagingAndSortingRepository getTeacherReviews(@Param("teacherId") Long teacherId); } \ No newline at end of file diff --git a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java index 878fdbb..bf7ec20 100644 --- a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java +++ b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java @@ -1,10 +1,19 @@ package dev.wms.pwrapi.repository; +import dev.wms.pwrapi.entity.forum.TeacherInfoDTO; import dev.wms.pwrapi.entity.forum.Teacher_r; import org.springframework.data.jdbc.repository.query.Query; import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; public interface TeacherRepository extends PagingAndSortingRepository { @Query("SELECT COUNT(*) FROM teacher") Long getTotalNumberOfTeachers(); + + @Query("SELECT teacher_id, category, academic_title, full_name, average_rating " + + "FROM teacher t " + + "WHERE t.teacher_id = :teacherId") + TeacherInfoDTO getTeacherInfo(@Param("teacherId") Long teacherId); } \ No newline at end of file diff --git a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java index ae681b3..bd9dd1a 100644 --- a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java +++ b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java @@ -1,18 +1,19 @@ package dev.wms.pwrapi.service.forum; -import dev.wms.pwrapi.entity.forum.Review_r; +import dev.wms.pwrapi.entity.forum.*; import dev.wms.pwrapi.repository.DatabaseMetadataRepository; import dev.wms.pwrapi.repository.ReviewRepository; import dev.wms.pwrapi.repository.TeacherRepository; -import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO; import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Optional; @Service @AllArgsConstructor +@Slf4j public class ForumService_r { private final DatabaseMetadataRepository databaseMetadataRepository; @@ -40,4 +41,26 @@ public DatabaseMetadataDTO_r getTotalTeachers() { databaseMetadataDTO.setTotalTeachers(teacherRepository.getTotalNumberOfTeachers()); return databaseMetadataDTO; } + + public TeacherWithReviewsDTO getTeacherWithAllReviews(Long teacherId){ + //checkIfTeacherExists(teacherId); + TeacherInfoDTO teacherInfo = teacherRepository.getTeacherInfo(teacherId); + log.info("TEACHER:" + teacherInfo); + return TeacherWithReviewsDTO.builder() + .teacherId(teacherInfo.getTeacherId()) + .category(teacherInfo.getCategory()) + .academicTitle(teacherInfo.getAcademicTitle()) + .fullName(teacherInfo.getFullName()) + .averageRating(teacherInfo.getAverageRating()) + .reviews(reviewRepository.getTeacherReviews(teacherId)) + .build(); + } + + private void checkIfTeacherExists(Long teacherId){ + if(!teacherRepository.existsById(teacherId)){ + // TODO -> 404 status code + throw new RuntimeException("teacher does not exist :)"); + } + } + } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 820b4af..f6668aa 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,5 +2,6 @@ logging.file.path=./pwr-api-logs logging.file.name=pwr-api.log logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG spring.data.rest.default-media-type=application/json +log4j.category.org.springframework.jdbc.core = TRACE pwr-api.news.cacheTTL=900000 \ No newline at end of file From ea5e239e1a597c4ddceb80847c6f4ac12129dff6 Mon Sep 17 00:00:00 2001 From: Woojciech Date: Sun, 25 Dec 2022 10:08:19 +0100 Subject: [PATCH 02/10] Further forum refactor, repository methods introduced --- .../java/dev/wms/pwrapi/api/ForumAPI_r.java | 43 +++++++++++++++++-- .../dev/wms/pwrapi/entity/forum/Review_r.java | 2 + .../entity/forum/TeacherWithReviewsDTO.java | 1 - .../pwrapi/repository/ReviewRepository.java | 7 +++ .../pwrapi/service/forum/ForumService_r.java | 20 ++++++++- 5 files changed, 67 insertions(+), 6 deletions(-) diff --git a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java index 26434d3..6e005c9 100644 --- a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java +++ b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java @@ -1,18 +1,24 @@ package dev.wms.pwrapi.api; +import com.fasterxml.jackson.core.JsonProcessingException; import dev.wms.pwrapi.entity.forum.Review_r; +import dev.wms.pwrapi.entity.forum.Teacher; import dev.wms.pwrapi.entity.forum.TeacherWithReviewsDTO; import dev.wms.pwrapi.entity.forum.Teacher_r; import dev.wms.pwrapi.service.forum.ForumService_r; import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; +import dev.wms.pwrapi.utils.forum.exceptions.InvalidLimitException; +import dev.wms.pwrapi.utils.forum.exceptions.TeacherNotFoundByFullNameException; +import dev.wms.pwrapi.utils.forum.exceptions.TeacherNotFoundByIdException; +import dev.wms.pwrapi.utils.generalExceptions.InvalidIdException; import io.swagger.v3.oas.annotations.Operation; import lombok.AllArgsConstructor; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import javax.validation.constraints.Min; import javax.validation.constraints.Positive; @RestController @@ -52,4 +58,33 @@ public ResponseEntity getTeacherWithReviews(@PathVariable Long teacherId) { return ResponseEntity.ok(forumService.getTeacherWithAllReviews(teacherId)); } + + @GetMapping("/prowadzacy/szukajId") + @Operation(summary = "Returns certain teacher specified by id and limited number of reviews.", + description = "Maximal number of fetched reviews is specified by the limit parameter, set limit = -1 to " + + "fetch all available reviews.") + public ResponseEntity getTeacherWithLimitedReviews( + @RequestParam("teacherId") @Positive (message = "teacherId has to be >= 0") Long teacherId, + @RequestParam("limit") @Min(value = -1, message = "limit has to be >= -1")Long limit) { + return ResponseEntity.ok(forumService.getTeacherWithLimitedReviews(teacherId, limit)); + } + + @GetMapping("/prowadzacy/szukajImie") + @Operation(summary = "Returns certain teacher specified by full name and limited number of reviews.", + description = "Parameters firstName and lastName are interchangeable, query is based on pattern matching. " + + "Maximal number of reviews is specified by the limit parameter, set limit = -1 to fetch all available reviews.") + public ResponseEntity fetchTeacherReviewsByFullName(@RequestParam("firstName") String firstName, + @RequestParam("lastName") String lastName, + @RequestParam("limit") Long limit) { + if(limit >= -1){ + try { + Teacher response = forumService.fetchLimitedTeacherReviewsByFullName(firstName, lastName, limit); + return ResponseEntity.status(HttpStatus.OK).body(response); + }catch(EmptyResultDataAccessException e){ + throw new TeacherNotFoundByFullNameException(firstName, lastName); + } + }else{ + throw new InvalidLimitException(limit); + } + } } diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java b/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java index e6ee292..0721a67 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java @@ -1,5 +1,6 @@ package dev.wms.pwrapi.entity.forum; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import org.springframework.data.annotation.Id; @@ -16,6 +17,7 @@ public class Review_r { private String title; private String review; private String reviewer; + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime postDate; private Teacher_r teacher; } diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java index b5f0b2f..dbc5bae 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java @@ -6,7 +6,6 @@ import java.util.Set; - @Builder @Data public class TeacherWithReviewsDTO { diff --git a/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java b/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java index dea6e38..a423bd7 100644 --- a/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java +++ b/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.query.Param; +import java.util.List; import java.util.Optional; import java.util.Set; @@ -29,4 +30,10 @@ public interface ReviewRepository extends PagingAndSortingRepository getTeacherReviews(@Param("teacherId") Long teacherId); + + @Query("SELECT review_id, course_name, given_rating, title, review, reviewer, post_date " + + "FROM review r " + + "WHERE r.teacher_id = :teacherId " + + "LIMIT :limit") + Set getTeacherReviewsLimited(@Param("teacherId") Long teacherId, @Param("limit") Long limit); } \ No newline at end of file diff --git a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java index bd9dd1a..242f11a 100644 --- a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java +++ b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java @@ -42,10 +42,10 @@ public DatabaseMetadataDTO_r getTotalTeachers() { return databaseMetadataDTO; } + // TODO -> fix public TeacherWithReviewsDTO getTeacherWithAllReviews(Long teacherId){ //checkIfTeacherExists(teacherId); TeacherInfoDTO teacherInfo = teacherRepository.getTeacherInfo(teacherId); - log.info("TEACHER:" + teacherInfo); return TeacherWithReviewsDTO.builder() .teacherId(teacherInfo.getTeacherId()) .category(teacherInfo.getCategory()) @@ -58,9 +58,27 @@ public TeacherWithReviewsDTO getTeacherWithAllReviews(Long teacherId){ private void checkIfTeacherExists(Long teacherId){ if(!teacherRepository.existsById(teacherId)){ + /* // TODO -> 404 status code throw new RuntimeException("teacher does not exist :)"); + */ } } + public TeacherWithReviewsDTO getTeacherWithLimitedReviews(Long teacherId, Long limit){ +// checkIfTeacherExists(teacherId); + if(limit == -1){ + return getTeacherWithAllReviews(teacherId); + } + TeacherInfoDTO teacherInfo = teacherRepository.getTeacherInfo(teacherId); + return TeacherWithReviewsDTO.builder() + .teacherId(teacherInfo.getTeacherId()) + .category(teacherInfo.getCategory()) + .academicTitle(teacherInfo.getAcademicTitle()) + .fullName(teacherInfo.getFullName()) + .averageRating(teacherInfo.getAverageRating()) + .reviews(reviewRepository.getTeacherReviewsLimited(teacherId, limit)) + .build(); + } + } From cc0ecb9ac3bd9ad3c8c960cba572b4a6240913ae Mon Sep 17 00:00:00 2001 From: Woojciech Date: Sun, 25 Dec 2022 10:43:54 +0100 Subject: [PATCH 03/10] ForumAPI further refactor, introduced custom exception and teacher's Category enum --- .../java/dev/wms/pwrapi/api/ForumAPI_r.java | 41 +++++++++----- .../pwrapi/repository/TeacherRepository.java | 8 +++ .../pwrapi/service/forum/ForumService_r.java | 55 ++++++++++++------- .../pwrapi/utils/forum/consts/Category.java | 13 +++++ .../exceptions/TeacherNotFoundException.java | 11 ++++ 5 files changed, 94 insertions(+), 34 deletions(-) create mode 100644 src/main/java/dev/wms/pwrapi/utils/forum/consts/Category.java create mode 100644 src/main/java/dev/wms/pwrapi/utils/forum/exceptions/TeacherNotFoundException.java diff --git a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java index 6e005c9..ec4e267 100644 --- a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java +++ b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java @@ -4,22 +4,20 @@ import dev.wms.pwrapi.entity.forum.Review_r; import dev.wms.pwrapi.entity.forum.Teacher; import dev.wms.pwrapi.entity.forum.TeacherWithReviewsDTO; -import dev.wms.pwrapi.entity.forum.Teacher_r; import dev.wms.pwrapi.service.forum.ForumService_r; +import dev.wms.pwrapi.utils.forum.consts.Category; import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; -import dev.wms.pwrapi.utils.forum.exceptions.InvalidLimitException; -import dev.wms.pwrapi.utils.forum.exceptions.TeacherNotFoundByFullNameException; -import dev.wms.pwrapi.utils.forum.exceptions.TeacherNotFoundByIdException; -import dev.wms.pwrapi.utils.generalExceptions.InvalidIdException; +import dev.wms.pwrapi.utils.forum.exceptions.CategoryMembersNotFoundException; import io.swagger.v3.oas.annotations.Operation; import lombok.AllArgsConstructor; -import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; +import java.util.List; @RestController @RequestMapping("/api/forum_r") @@ -56,26 +54,28 @@ public ResponseEntity getTotalTeachers() { @Operation(summary = "Returns teacher with specified id.") public ResponseEntity getTeacherWithReviews(@PathVariable @Positive (message = "teacherId has to be >= 0") Long teacherId) { - return ResponseEntity.ok(forumService.getTeacherWithAllReviews(teacherId)); + return ResponseEntity.ok(forumService.getTeacherWithAllReviewsById(teacherId)); } @GetMapping("/prowadzacy/szukajId") @Operation(summary = "Returns certain teacher specified by id and limited number of reviews.", description = "Maximal number of fetched reviews is specified by the limit parameter, set limit = -1 to " + "fetch all available reviews.") - public ResponseEntity getTeacherWithLimitedReviews( + public ResponseEntity getTeacherWithLimitedReviewsById( @RequestParam("teacherId") @Positive (message = "teacherId has to be >= 0") Long teacherId, - @RequestParam("limit") @Min(value = -1, message = "limit has to be >= -1")Long limit) { - return ResponseEntity.ok(forumService.getTeacherWithLimitedReviews(teacherId, limit)); + @RequestParam("limit") @Min(value = -1, message = "limit has to be >= -1") Long limit) { + return ResponseEntity.ok(forumService.getTeacherWithLimitedReviewsById(teacherId, limit)); } @GetMapping("/prowadzacy/szukajImie") @Operation(summary = "Returns certain teacher specified by full name and limited number of reviews.", description = "Parameters firstName and lastName are interchangeable, query is based on pattern matching. " + "Maximal number of reviews is specified by the limit parameter, set limit = -1 to fetch all available reviews.") - public ResponseEntity fetchTeacherReviewsByFullName(@RequestParam("firstName") String firstName, - @RequestParam("lastName") String lastName, - @RequestParam("limit") Long limit) { + public ResponseEntity getTeacherWithLimitedReviewsByFullName( + @RequestParam("firstName") @NotNull(message = "firstName is required") String firstName, + @RequestParam("lastName") @NotNull(message = "lastName is required") String lastName, + @RequestParam("limit") @Min(value = -1, message = "limit has to be >= -1") Long limit) { + /* if(limit >= -1){ try { Teacher response = forumService.fetchLimitedTeacherReviewsByFullName(firstName, lastName, limit); @@ -86,5 +86,20 @@ public ResponseEntity fetchTeacherReviewsByFullName(@RequestParam("firs }else{ throw new InvalidLimitException(limit); } + */ + return ResponseEntity.ok(forumService.getTeacherWithLimitedReviewsByFullName(firstName, lastName, limit)); + } + + @GetMapping("/prowadzacy/kategoria/{category}") + @Operation(summary = "Returns all teachers who belong to the specified category.") + public ResponseEntity> getTeachersByCategory(@PathVariable Category category) { + /* + List response = forumService.getTeachersByCategory(category); + if(response.isEmpty()){ + throw new CategoryMembersNotFoundException(category); + } + return ResponseEntity.status(HttpStatus.OK).body(response); + */ + return null; } } diff --git a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java index bf7ec20..030e212 100644 --- a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java +++ b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java @@ -16,4 +16,12 @@ public interface TeacherRepository extends PagingAndSortingRepository fix - public TeacherWithReviewsDTO getTeacherWithAllReviews(Long teacherId){ + public TeacherWithReviewsDTO getTeacherWithAllReviewsById(Long teacherId){ //checkIfTeacherExists(teacherId); + TeacherWithReviewsDTO teacherInfo = getTeacherInfo(teacherId); + teacherInfo.setReviews(reviewRepository.getTeacherReviews(teacherId)); + return teacherInfo; + } + + public TeacherWithReviewsDTO getTeacherWithLimitedReviewsById(Long teacherId, Long limit){ + if(limit == -1){ + return getTeacherWithAllReviewsById(teacherId); + } +// checkIfTeacherExistsById(teacherId); + TeacherWithReviewsDTO teacherInfo = getTeacherInfo(teacherId); + teacherInfo.setReviews(reviewRepository.getTeacherReviewsLimited(teacherId, limit)); + return teacherInfo; + } + + public TeacherWithReviewsDTO getTeacherWithLimitedReviewsByFullName(String firstName, String lastName, Long limit){ + Long teacherId = getTeacherIdByFullName(firstName, lastName); + return getTeacherWithLimitedReviewsById(teacherId, limit); + } + + private TeacherWithReviewsDTO getTeacherInfo(Long teacherId){ TeacherInfoDTO teacherInfo = teacherRepository.getTeacherInfo(teacherId); return TeacherWithReviewsDTO.builder() .teacherId(teacherInfo.getTeacherId()) @@ -52,33 +75,23 @@ public TeacherWithReviewsDTO getTeacherWithAllReviews(Long teacherId){ .academicTitle(teacherInfo.getAcademicTitle()) .fullName(teacherInfo.getFullName()) .averageRating(teacherInfo.getAverageRating()) - .reviews(reviewRepository.getTeacherReviews(teacherId)) .build(); } - private void checkIfTeacherExists(Long teacherId){ + private void checkIfTeacherExistsById(Long teacherId){ if(!teacherRepository.existsById(teacherId)){ - /* - // TODO -> 404 status code - throw new RuntimeException("teacher does not exist :)"); - */ + throw new TeacherNotFoundException(teacherId); } } - - public TeacherWithReviewsDTO getTeacherWithLimitedReviews(Long teacherId, Long limit){ -// checkIfTeacherExists(teacherId); - if(limit == -1){ - return getTeacherWithAllReviews(teacherId); + private Long getTeacherIdByFullName(String firstName, String lastName){ + /* + Long teacherId = teacherRepository.getTeacherIdByFullName(firstName, lastName); + if(teacherId == null){ + throw new RuntimeException("teacher not present!"); } - TeacherInfoDTO teacherInfo = teacherRepository.getTeacherInfo(teacherId); - return TeacherWithReviewsDTO.builder() - .teacherId(teacherInfo.getTeacherId()) - .category(teacherInfo.getCategory()) - .academicTitle(teacherInfo.getAcademicTitle()) - .fullName(teacherInfo.getFullName()) - .averageRating(teacherInfo.getAverageRating()) - .reviews(reviewRepository.getTeacherReviewsLimited(teacherId, limit)) - .build(); + return teacherId; + */ + return teacherRepository.getTeacherIdByFullName(firstName, lastName); } } diff --git a/src/main/java/dev/wms/pwrapi/utils/forum/consts/Category.java b/src/main/java/dev/wms/pwrapi/utils/forum/consts/Category.java new file mode 100644 index 0000000..41b1863 --- /dev/null +++ b/src/main/java/dev/wms/pwrapi/utils/forum/consts/Category.java @@ -0,0 +1,13 @@ +package dev.wms.pwrapi.utils.forum.consts; + +public enum Category { + MATEMATYCY, + FIZYCY, + INFORMATYCY, + CHEMICY, + ELEKTRONICY, + JEZYKOWCY, + SPORTOWCY, + HUMANISCI, + INNI +} diff --git a/src/main/java/dev/wms/pwrapi/utils/forum/exceptions/TeacherNotFoundException.java b/src/main/java/dev/wms/pwrapi/utils/forum/exceptions/TeacherNotFoundException.java new file mode 100644 index 0000000..d711cec --- /dev/null +++ b/src/main/java/dev/wms/pwrapi/utils/forum/exceptions/TeacherNotFoundException.java @@ -0,0 +1,11 @@ +package dev.wms.pwrapi.utils.forum.exceptions; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.NOT_FOUND) +public class TeacherNotFoundException extends RuntimeException { + public TeacherNotFoundException(Long teacherId){ + super(String.format("Prowadzący o id '%d' nie istnieje.", teacherId)); + } +} From 8aa199de2d63fb0f1ee6ab1016104e1b3e292128 Mon Sep 17 00:00:00 2001 From: Woojciech Date: Sun, 25 Dec 2022 12:20:00 +0100 Subject: [PATCH 04/10] ForumAPI further refactor, new repository methods introduced --- .../java/dev/wms/pwrapi/api/ForumAPI_r.java | 55 ++++++++++++++++++- .../pwrapi/entity/forum/TeacherInfoDTO.java | 2 + .../entity/forum/TeacherWithReviewsDTO.java | 2 + .../pwrapi/repository/TeacherRepository.java | 28 ++++++++++ .../pwrapi/service/forum/ForumService_r.java | 44 ++++++++++++++- 5 files changed, 126 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java index ec4e267..b783433 100644 --- a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java +++ b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java @@ -3,9 +3,9 @@ import com.fasterxml.jackson.core.JsonProcessingException; import dev.wms.pwrapi.entity.forum.Review_r; import dev.wms.pwrapi.entity.forum.Teacher; +import dev.wms.pwrapi.entity.forum.TeacherInfoDTO; import dev.wms.pwrapi.entity.forum.TeacherWithReviewsDTO; import dev.wms.pwrapi.service.forum.ForumService_r; -import dev.wms.pwrapi.utils.forum.consts.Category; import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; import dev.wms.pwrapi.utils.forum.exceptions.CategoryMembersNotFoundException; import io.swagger.v3.oas.annotations.Operation; @@ -18,6 +18,7 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; import java.util.List; +import java.util.Set; @RestController @RequestMapping("/api/forum_r") @@ -92,7 +93,8 @@ public ResponseEntity getTeacherWithLimitedReviewsByFullN @GetMapping("/prowadzacy/kategoria/{category}") @Operation(summary = "Returns all teachers who belong to the specified category.") - public ResponseEntity> getTeachersByCategory(@PathVariable Category category) { + public ResponseEntity> getTeachersByCategory( + @PathVariable @NotNull(message = "category is required") String category) { /* List response = forumService.getTeachersByCategory(category); if(response.isEmpty()){ @@ -100,6 +102,53 @@ public ResponseEntity> getTeachersByCategory(@PathVariable Categor } return ResponseEntity.status(HttpStatus.OK).body(response); */ - return null; + return ResponseEntity.ok(forumService.getTeachersInfoByCategory(category)); + } + + @GetMapping("/prowadzacy/ranking") + @Operation(summary = "Returns teachers who belong to the specified category ranked by their average rating.") + public ResponseEntity> getTeachersRankedByCategory(@RequestParam("kategoria") String category) { + /* + List response = forumService.getBestTeachersRankedByCategory(category); + if(response.isEmpty()){ + throw new CategoryMembersNotFoundException(category); + } + return ResponseEntity.status(HttpStatus.OK).body(response); + */ + return ResponseEntity.ok(forumService.getBestTeachersOfCategory(category)); + } + + // TODO -> fix limit + @GetMapping("/prowadzacy/{category}/ranking/najlepsi") + @Operation(summary = "Returns limited number of best rated teachers who belong to the specified category, example reviews are provided.", + description = "Number of return teachers is specified by the limit parameter, each teacher has a maximal example of three associated reviews.") + public ResponseEntity> getBestRankedTeachersByCategoryWithReviewsLimited( + @PathVariable String category, @RequestParam("limit") @Min(-1) Long limit) { + + /* + List response = forumService.getBestRankedTeachersByCategoryLimited(category, limit); + if(response.isEmpty()){ + throw new CategoryMembersNotFoundException(category); + } + + return ResponseEntity.status(HttpStatus.OK).body(response); + */ + return ResponseEntity.ok(forumService.getLimitedBestTeachersOfCategoryWithExampleReviews(category, limit)); + } + + // TODO -> fix limit + @GetMapping("/prowadzacy/{category}/ranking/najgorsi") + @Operation(summary = "Returns limited number of worst rated teachers who belong to the specified category, example reviews are provided.", + description = "Number of return teachers is specified by the limit parameter, each teacher has a maximal example of three associated reviews.") + public ResponseEntity> getWorstRankedTeachersByCategoryWithReviewsLimited( + @PathVariable String category, @RequestParam("limit") @Min(-1) Long limit) { + /* + List response = forumService.getWorstRankedTeachersByCategoryLimited(category, limit); + if(response.isEmpty()){ + throw new CategoryMembersNotFoundException(category); + } + return ResponseEntity.status(HttpStatus.OK).body(response); + */ + return ResponseEntity.ok(forumService.getLimitedWorstTeachersOfCategoryWithExampleReviews(category, limit)); } } diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java index e030773..909ab3c 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java @@ -1,8 +1,10 @@ package dev.wms.pwrapi.entity.forum; +import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; @Data +@JsonInclude(JsonInclude.Include.NON_NULL) public class TeacherInfoDTO { private Long teacherId; private String category; diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java index dbc5bae..d136929 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java @@ -1,5 +1,6 @@ package dev.wms.pwrapi.entity.forum; +import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Builder; import lombok.Data; import org.springframework.data.annotation.Id; @@ -8,6 +9,7 @@ @Builder @Data +@JsonInclude(JsonInclude.Include.NON_NULL) public class TeacherWithReviewsDTO { @Id private Long teacherId; diff --git a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java index 030e212..7868482 100644 --- a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java +++ b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java @@ -7,6 +7,7 @@ import org.springframework.data.repository.query.Param; import java.util.Optional; +import java.util.Set; public interface TeacherRepository extends PagingAndSortingRepository { @Query("SELECT COUNT(*) FROM teacher") @@ -17,6 +18,33 @@ public interface TeacherRepository extends PagingAndSortingRepository getTeachersInfoByCategory(@Param("category") String category); + + @Query("SELECT teacher_id, category, academic_title, full_name, average_rating " + + "FROM teacher t " + + "WHERE t.category = :category " + + "ORDER BY average_rating DESC") + Set getBestTeachersOfCategory(@Param("category") String category); + + @Query("SELECT teacher_id, category, academic_title, full_name, average_rating " + + "FROM teacher t " + + "WHERE t.category = :category " + + "ORDER BY average_rating DESC " + + "LIMIT :limit") + Set getBestTeachersOfCategoryLimited(@Param("category") String category, + @Param("limit") Long limit); + + @Query("SELECT teacher_id, category, academic_title, full_name, average_rating " + + "FROM teacher t " + + "WHERE t.category = :category " + + "ORDER BY average_rating ASC " + + "LIMIT :limit") + Set getWorstTeachersOfCategoryLimited(@Param("category") String category, + @Param("limit") Long limit); + @Query("SELECT teacher_id " + "FROM teacher " + "WHERE " + diff --git a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java index 4625e9a..4af0467 100644 --- a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java +++ b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java @@ -5,13 +5,14 @@ import dev.wms.pwrapi.repository.ReviewRepository; import dev.wms.pwrapi.repository.TeacherRepository; import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; -import dev.wms.pwrapi.utils.forum.exceptions.TeacherNotFoundByIdException; import dev.wms.pwrapi.utils.forum.exceptions.TeacherNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; @Service @AllArgsConstructor @@ -21,6 +22,7 @@ public class ForumService_r { private final DatabaseMetadataRepository databaseMetadataRepository; private final ReviewRepository reviewRepository; private final TeacherRepository teacherRepository; + private final Long WORST_AND_BEST_TEACHERS_REVIEW_LIMIT = 3L; public DatabaseMetadataDTO_r getDatabaseMetadata() { return databaseMetadataRepository.getDatabaseMetadata(); @@ -78,6 +80,45 @@ private TeacherWithReviewsDTO getTeacherInfo(Long teacherId){ .build(); } + public Set getTeachersInfoByCategory(String category){ + return teacherRepository.getTeachersInfoByCategory(category); + } + + public Set getBestTeachersOfCategory(String category){ + return teacherRepository.getBestTeachersOfCategory(category); + } + + public Set getLimitedBestTeachersOfCategoryWithExampleReviews(String category, Long limit){ + return teacherRepository.getBestTeachersOfCategoryLimited(category, limit).stream() + .map(teacherInfo -> TeacherWithReviewsDTO.builder() + .teacherId(teacherInfo.getTeacherId()) + .category(teacherInfo.getCategory()) + .academicTitle(teacherInfo.getAcademicTitle()) + .fullName(teacherInfo.getFullName()) + .averageRating(teacherInfo.getAverageRating()) + .reviews(reviewRepository.getTeacherReviewsLimited(teacherInfo.getTeacherId(), + WORST_AND_BEST_TEACHERS_REVIEW_LIMIT)) + .build() + ) + .collect(Collectors.toSet()); + } + + public Set getLimitedWorstTeachersOfCategoryWithExampleReviews(String category, Long limit){ + Long reviewLimit = 3L; + return teacherRepository.getWorstTeachersOfCategoryLimited(category, limit).stream() + .map(teacherInfo -> TeacherWithReviewsDTO.builder() + .teacherId(teacherInfo.getTeacherId()) + .category(teacherInfo.getCategory()) + .academicTitle(teacherInfo.getAcademicTitle()) + .fullName(teacherInfo.getFullName()) + .averageRating(teacherInfo.getAverageRating()) + .reviews(reviewRepository.getTeacherReviewsLimited(teacherInfo.getTeacherId(), + WORST_AND_BEST_TEACHERS_REVIEW_LIMIT)) + .build() + ) + .collect(Collectors.toSet()); + } + private void checkIfTeacherExistsById(Long teacherId){ if(!teacherRepository.existsById(teacherId)){ throw new TeacherNotFoundException(teacherId); @@ -93,5 +134,4 @@ private Long getTeacherIdByFullName(String firstName, String lastName){ */ return teacherRepository.getTeacherIdByFullName(firstName, lastName); } - } From e2ced2ff62418480e405c71564af664f1b723514 Mon Sep 17 00:00:00 2001 From: Woojciech Date: Sun, 25 Dec 2022 14:34:09 +0100 Subject: [PATCH 05/10] New ForumAPI adjustments in order to keep backwards compatibility --- .../java/dev/wms/pwrapi/api/ForumAPI.java | 2 +- .../java/dev/wms/pwrapi/api/ForumAPI_r.java | 6 +-- .../DatabaseMetadataRepository.java | 3 +- .../pwrapi/repository/TeacherRepository.java | 6 +++ .../pwrapi/service/forum/ForumService_r.java | 46 ++++++++++++++++--- .../forum/dto/DatabaseMetadataDTO_r.java | 6 ++- .../CategoryMembersNotFoundException.java | 8 +++- .../exceptions/ReviewNotFoundException.java | 8 +++- 8 files changed, 69 insertions(+), 16 deletions(-) diff --git a/src/main/java/dev/wms/pwrapi/api/ForumAPI.java b/src/main/java/dev/wms/pwrapi/api/ForumAPI.java index a27377e..e1d5f0d 100644 --- a/src/main/java/dev/wms/pwrapi/api/ForumAPI.java +++ b/src/main/java/dev/wms/pwrapi/api/ForumAPI.java @@ -49,7 +49,7 @@ public ResponseEntity getReviewById(@PathVariable @Min(1) int reviewId) Review result = forumService.getReviewById(reviewId); return ResponseEntity.status(HttpStatus.OK).body(result); }catch (EmptyResultDataAccessException e){ - throw new ReviewNotFoundException(reviewId); + throw new ReviewNotFoundException((long) reviewId); } } diff --git a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java index b783433..1409c3d 100644 --- a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java +++ b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java @@ -34,15 +34,15 @@ public ResponseEntity getDatabaseMetadata() { } @GetMapping("/opinie") - @Operation(summary = "Returns total number of reviews.") + @Operation(summary = "Returns total number of teacher reviews collected.") public ResponseEntity getTotalReviews() { return ResponseEntity.ok(forumService.getTotalReviews()); } @GetMapping("/opinie/{reviewId}") - @Operation(summary = "Returns review with specified id.") + @Operation(summary = "Returns review with specified reviewId.") public ResponseEntity getReviewById(@PathVariable @Positive(message = "reviewId has to be >= 0") Long reviewId) { - return ResponseEntity.of(forumService.getReviewById(reviewId)); + return ResponseEntity.ok(forumService.getReviewById(reviewId)); } @GetMapping("/prowadzacy") diff --git a/src/main/java/dev/wms/pwrapi/repository/DatabaseMetadataRepository.java b/src/main/java/dev/wms/pwrapi/repository/DatabaseMetadataRepository.java index abc3ac0..b0d845a 100644 --- a/src/main/java/dev/wms/pwrapi/repository/DatabaseMetadataRepository.java +++ b/src/main/java/dev/wms/pwrapi/repository/DatabaseMetadataRepository.java @@ -7,6 +7,7 @@ public interface DatabaseMetadataRepository extends PagingAndSortingRepository { - @Query("SELECT (SELECT COUNT(*) FROM teacher), (SELECT COUNT(*) FROM review), (SELECT refresh_date FROM refresh_data)") + @Query("SELECT (SELECT COUNT(*) FROM teacher) AS 'total_teachers', (SELECT COUNT(*) FROM review) AS 'total_reviews', " + + "(SELECT refresh_date FROM refresh_data) AS 'latest_refresh'") DatabaseMetadataDTO_r getDatabaseMetadata(); } \ No newline at end of file diff --git a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java index 7868482..05bca26 100644 --- a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java +++ b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java @@ -37,6 +37,12 @@ public interface TeacherRepository extends PagingAndSortingRepository getBestTeachersOfCategoryLimited(@Param("category") String category, @Param("limit") Long limit); + @Query("SELECT teacher_id, category, academic_title, full_name, average_rating " + + "FROM teacher t " + + "WHERE t.category = :category " + + "ORDER BY average_rating ASC") + Set getWorstTeachersOfCategory(@Param("category") String category); + @Query("SELECT teacher_id, category, academic_title, full_name, average_rating " + "FROM teacher t " + "WHERE t.category = :category " + diff --git a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java index 4af0467..f7d3544 100644 --- a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java +++ b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java @@ -4,7 +4,12 @@ import dev.wms.pwrapi.repository.DatabaseMetadataRepository; import dev.wms.pwrapi.repository.ReviewRepository; import dev.wms.pwrapi.repository.TeacherRepository; +import dev.wms.pwrapi.utils.forum.consts.Category; +import static dev.wms.pwrapi.utils.forum.consts.Category.*; + import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; +import dev.wms.pwrapi.utils.forum.exceptions.CategoryMembersNotFoundException; +import dev.wms.pwrapi.utils.forum.exceptions.ReviewNotFoundException; import dev.wms.pwrapi.utils.forum.exceptions.TeacherNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -23,6 +28,9 @@ public class ForumService_r { private final ReviewRepository reviewRepository; private final TeacherRepository teacherRepository; private final Long WORST_AND_BEST_TEACHERS_REVIEW_LIMIT = 3L; + private final Set categories = + Set.of(MATEMATYCY.name(), FIZYCY.name(), INFORMATYCY.name(), CHEMICY.name(), ELEKTRONICY.name(), JEZYKOWCY.name(), + SPORTOWCY.name(), HUMANISCI.name(), INNI.name()); public DatabaseMetadataDTO_r getDatabaseMetadata() { return databaseMetadataRepository.getDatabaseMetadata(); @@ -34,10 +42,14 @@ public DatabaseMetadataDTO_r getTotalReviews() { return databaseMetadataDTO; } - public Optional getReviewById(Long reviewId) { + public Review_r getReviewById(Long reviewId) { Optional review = reviewRepository.getReviewWithoutTeacherById(reviewId); - review.ifPresent(r -> r.setTeacher(reviewRepository.getReviewRecipent(reviewId))); - return review; + review.ifPresentOrElse(r -> { + r.setTeacher(reviewRepository.getReviewRecipent(reviewId)); + }, () -> { + throw new ReviewNotFoundException(reviewId); + }); + return review.get(); } public DatabaseMetadataDTO_r getTotalTeachers() { @@ -81,15 +93,18 @@ private TeacherWithReviewsDTO getTeacherInfo(Long teacherId){ } public Set getTeachersInfoByCategory(String category){ + checkIfCategoryExists(category.toUpperCase()); return teacherRepository.getTeachersInfoByCategory(category); } public Set getBestTeachersOfCategory(String category){ + checkIfCategoryExists(category.toUpperCase()); return teacherRepository.getBestTeachersOfCategory(category); } public Set getLimitedBestTeachersOfCategoryWithExampleReviews(String category, Long limit){ - return teacherRepository.getBestTeachersOfCategoryLimited(category, limit).stream() + checkIfCategoryExists(category); + return getBestTeachersInfoByCategoryLimited(category, limit).stream() .map(teacherInfo -> TeacherWithReviewsDTO.builder() .teacherId(teacherInfo.getTeacherId()) .category(teacherInfo.getCategory()) @@ -103,9 +118,16 @@ public Set getLimitedBestTeachersOfCategoryWithExampleRev .collect(Collectors.toSet()); } + private Set getBestTeachersInfoByCategoryLimited(String category, Long limit){ + if(limit == -1){ + return teacherRepository.getBestTeachersOfCategory(category); + } + return teacherRepository.getBestTeachersOfCategoryLimited(category, limit); + } + public Set getLimitedWorstTeachersOfCategoryWithExampleReviews(String category, Long limit){ - Long reviewLimit = 3L; - return teacherRepository.getWorstTeachersOfCategoryLimited(category, limit).stream() + checkIfCategoryExists(category); + return getWorstTeachersInfoByCategoryLimited(category, limit).stream() .map(teacherInfo -> TeacherWithReviewsDTO.builder() .teacherId(teacherInfo.getTeacherId()) .category(teacherInfo.getCategory()) @@ -119,6 +141,18 @@ public Set getLimitedWorstTeachersOfCategoryWithExampleRe .collect(Collectors.toSet()); } + private Set getWorstTeachersInfoByCategoryLimited(String category, Long limit){ + if(limit == -1){ + return teacherRepository.getWorstTeachersOfCategory(category); + } + return teacherRepository.getWorstTeachersOfCategoryLimited(category, limit); + } + + private void checkIfCategoryExists(String category){ + if(!categories.contains(category.toUpperCase())){ + throw new CategoryMembersNotFoundException(category); + } + } private void checkIfTeacherExistsById(Long teacherId){ if(!teacherRepository.existsById(teacherId)){ throw new TeacherNotFoundException(teacherId); diff --git a/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO_r.java b/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO_r.java index 90e2fad..9b55be3 100644 --- a/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO_r.java +++ b/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO_r.java @@ -1,10 +1,13 @@ package dev.wms.pwrapi.utils.forum.dto; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @JsonInclude(JsonInclude.Include.NON_NULL) @Data @NoArgsConstructor @@ -13,5 +16,6 @@ public class DatabaseMetadataDTO_r { private Long totalTeachers; private Long totalReviews; - private String latestRefresh; + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") + private LocalDateTime latestRefresh; } \ No newline at end of file diff --git a/src/main/java/dev/wms/pwrapi/utils/forum/exceptions/CategoryMembersNotFoundException.java b/src/main/java/dev/wms/pwrapi/utils/forum/exceptions/CategoryMembersNotFoundException.java index fbfed33..a17ac2a 100644 --- a/src/main/java/dev/wms/pwrapi/utils/forum/exceptions/CategoryMembersNotFoundException.java +++ b/src/main/java/dev/wms/pwrapi/utils/forum/exceptions/CategoryMembersNotFoundException.java @@ -1,8 +1,12 @@ package dev.wms.pwrapi.utils.forum.exceptions; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.NOT_FOUND) public class CategoryMembersNotFoundException extends RuntimeException { public CategoryMembersNotFoundException(String category){ - super("Nie znaleziono prowadzących w kategorii: " + category + - ". Lista dostępnych kategorii [matematycy, fizycy, informatycy, chemicy, elektronicy, jezykowcy, sportowcy, humanisci, inni]."); + super(String.format("Nie znaleziono prowadzących w kategorii: %s, dostępne kategorie [matematycy, fizycy, " + + "informatycy, chemicy, elektronicy, jezykowcy, sportowcy, humanisci, inni]", category)); } } diff --git a/src/main/java/dev/wms/pwrapi/utils/forum/exceptions/ReviewNotFoundException.java b/src/main/java/dev/wms/pwrapi/utils/forum/exceptions/ReviewNotFoundException.java index de30fb7..47ee077 100644 --- a/src/main/java/dev/wms/pwrapi/utils/forum/exceptions/ReviewNotFoundException.java +++ b/src/main/java/dev/wms/pwrapi/utils/forum/exceptions/ReviewNotFoundException.java @@ -1,8 +1,12 @@ package dev.wms.pwrapi.utils.forum.exceptions; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.NOT_FOUND) public class ReviewNotFoundException extends RuntimeException { - public ReviewNotFoundException(int reviewId){ - super("Opinia o id: " + reviewId + " nie istnieje."); + public ReviewNotFoundException(Long reviewId){ + super(String.format("Opinia o id: %d nie istnieje.", reviewId)); } } From ba2bae75fdc520045ebeb1719577637630dff246 Mon Sep 17 00:00:00 2001 From: Woojciech Date: Sun, 5 Feb 2023 15:10:48 +0100 Subject: [PATCH 06/10] further forum improvements --- src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java | 2 -- src/main/java/dev/wms/pwrapi/entity/forum/Teacher_r.java | 2 +- src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java b/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java index 0721a67..56f086a 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java @@ -1,14 +1,12 @@ package dev.wms.pwrapi.entity.forum; import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import org.springframework.data.annotation.Id; import java.time.LocalDateTime; @Data -@JsonInclude(JsonInclude.Include.NON_EMPTY) public class Review_r { @Id private Long reviewId; diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/Teacher_r.java b/src/main/java/dev/wms/pwrapi/entity/forum/Teacher_r.java index e1a2d45..2f37128 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/Teacher_r.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/Teacher_r.java @@ -10,5 +10,5 @@ public class Teacher_r { private String category; private String academicTitle; private String fullName; - private Double average; + private float averageRating; } diff --git a/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java b/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java index a423bd7..f68da53 100644 --- a/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java +++ b/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java @@ -15,8 +15,8 @@ public interface ReviewRepository extends PagingAndSortingRepository getReviewWithoutTeacherById(@Param("reviewId") Long reviewId); From 513f299e85f955ad9ca265b747e2ebf1d17ef3bc Mon Sep 17 00:00:00 2001 From: Woojciech Date: Sun, 12 Feb 2023 23:47:36 +0100 Subject: [PATCH 07/10] further refactor improvements in order to mainain previous API contract --- .../java/dev/wms/pwrapi/api/EportalAPI.java | 3 +- .../java/dev/wms/pwrapi/api/ForumAPI_r.java | 33 ++++---- .../dev/wms/pwrapi/entity/forum/Review_r.java | 4 +- .../pwrapi/entity/forum/TeacherInfoDTO.java | 2 +- .../entity/forum/TeacherWithReviewsDTO.java | 4 +- .../wms/pwrapi/entity/forum/Teacher_r.java | 4 +- .../pwrapi/repository/ReviewRepository.java | 9 +- .../pwrapi/repository/TeacherRepository.java | 2 +- .../pwrapi/service/forum/ForumService_r.java | 82 +++++++++++-------- .../forum/dto/DatabaseMetadataDTO_r.java | 5 +- 10 files changed, 84 insertions(+), 64 deletions(-) diff --git a/src/main/java/dev/wms/pwrapi/api/EportalAPI.java b/src/main/java/dev/wms/pwrapi/api/EportalAPI.java index a2c1902..1b40a2b 100644 --- a/src/main/java/dev/wms/pwrapi/api/EportalAPI.java +++ b/src/main/java/dev/wms/pwrapi/api/EportalAPI.java @@ -1,6 +1,8 @@ package dev.wms.pwrapi.api; import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingException; @@ -62,7 +64,6 @@ public ResponseEntity> getEportalSekcje(@RequestParam Strin @GetMapping("/kursy/{id}/oceny") @Operation(summary = "Returns all marks for the given course", description = "You can fetch the course ID using /kursy endpoint") public ResponseEntity> getEportalOceny(@RequestParam String login, @RequestParam String password, @PathVariable int id) throws JsonProcessingException { - return ResponseEntity.status(HttpStatus.OK).body(eService.getEportalOceny(login, password, id)); } diff --git a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java index 1409c3d..b5f25da 100644 --- a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java +++ b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java @@ -1,50 +1,51 @@ package dev.wms.pwrapi.api; -import com.fasterxml.jackson.core.JsonProcessingException; import dev.wms.pwrapi.entity.forum.Review_r; -import dev.wms.pwrapi.entity.forum.Teacher; import dev.wms.pwrapi.entity.forum.TeacherInfoDTO; import dev.wms.pwrapi.entity.forum.TeacherWithReviewsDTO; import dev.wms.pwrapi.service.forum.ForumService_r; import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; -import dev.wms.pwrapi.utils.forum.exceptions.CategoryMembersNotFoundException; import io.swagger.v3.oas.annotations.Operation; -import lombok.AllArgsConstructor; -import org.springframework.http.HttpStatus; +import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; -import java.util.List; import java.util.Set; @RestController @RequestMapping("/api/forum_r") -@AllArgsConstructor +@RequiredArgsConstructor +@Validated public class ForumAPI_r { private final ForumService_r forumService; + // TODO - think about caching @GetMapping @Operation(summary = "Returns database metadata such as number of records in each category and latest refresh timestamp.") public ResponseEntity getDatabaseMetadata() { return ResponseEntity.ok(forumService.getDatabaseMetadata()); } + // TODO - think about caching @GetMapping("/opinie") @Operation(summary = "Returns total number of teacher reviews collected.") public ResponseEntity getTotalReviews() { return ResponseEntity.ok(forumService.getTotalReviews()); } + // TODO -> emtpy return instead of exception in case review is not found @GetMapping("/opinie/{reviewId}") @Operation(summary = "Returns review with specified reviewId.") - public ResponseEntity getReviewById(@PathVariable @Positive(message = "reviewId has to be >= 0") Long reviewId) { + public ResponseEntity getReviewById(@PathVariable @Positive(message = "reviewId powinno być >= 0") Long reviewId) { return ResponseEntity.ok(forumService.getReviewById(reviewId)); } + // TODO -> think about caching @GetMapping("/prowadzacy") @Operation(summary = "Returns total number of teachers.") public ResponseEntity getTotalTeachers() { @@ -53,8 +54,8 @@ public ResponseEntity getTotalTeachers() { @GetMapping(value = "/prowadzacy/{teacherId}") @Operation(summary = "Returns teacher with specified id.") - public ResponseEntity getTeacherWithReviews(@PathVariable @Positive (message = "teacherId has to be >= 0") - Long teacherId) { + public ResponseEntity getTeacherWithReviews( + @PathVariable @Positive (message = "teacherId powinno być >= 0") Long teacherId) { return ResponseEntity.ok(forumService.getTeacherWithAllReviewsById(teacherId)); } @@ -63,8 +64,8 @@ public ResponseEntity getTeacherWithReviews(@PathVariable description = "Maximal number of fetched reviews is specified by the limit parameter, set limit = -1 to " + "fetch all available reviews.") public ResponseEntity getTeacherWithLimitedReviewsById( - @RequestParam("teacherId") @Positive (message = "teacherId has to be >= 0") Long teacherId, - @RequestParam("limit") @Min(value = -1, message = "limit has to be >= -1") Long limit) { + @RequestParam("teacherId") @Positive (message = "teacherId powinno być >= 0") Long teacherId, + @RequestParam("limit") @Min(value = -1, message = "limit powinien być >= -1") Long limit) { return ResponseEntity.ok(forumService.getTeacherWithLimitedReviewsById(teacherId, limit)); } @@ -73,9 +74,9 @@ public ResponseEntity getTeacherWithLimitedReviewsById( description = "Parameters firstName and lastName are interchangeable, query is based on pattern matching. " + "Maximal number of reviews is specified by the limit parameter, set limit = -1 to fetch all available reviews.") public ResponseEntity getTeacherWithLimitedReviewsByFullName( - @RequestParam("firstName") @NotNull(message = "firstName is required") String firstName, - @RequestParam("lastName") @NotNull(message = "lastName is required") String lastName, - @RequestParam("limit") @Min(value = -1, message = "limit has to be >= -1") Long limit) { + @RequestParam("firstName") @NotNull(message = "firstName jest wymagane") String firstName, + @RequestParam("lastName") @NotNull(message = "lastName jest wymagane") String lastName, + @RequestParam("limit") @Min(value = -1, message = "limit powinien być >= -1") Long limit) { /* if(limit >= -1){ try { @@ -94,7 +95,7 @@ public ResponseEntity getTeacherWithLimitedReviewsByFullN @GetMapping("/prowadzacy/kategoria/{category}") @Operation(summary = "Returns all teachers who belong to the specified category.") public ResponseEntity> getTeachersByCategory( - @PathVariable @NotNull(message = "category is required") String category) { + @PathVariable @NotNull(message = "kategoria jest wymagana") String category) { /* List response = forumService.getTeachersByCategory(category); if(response.isEmpty()){ diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java b/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java index 56f086a..ff569b8 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java @@ -1,15 +1,17 @@ package dev.wms.pwrapi.entity.forum; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import org.springframework.data.annotation.Id; import java.time.LocalDateTime; @Data +@JsonInclude(JsonInclude.Include.NON_NULL) public class Review_r { @Id - private Long reviewId; + private Long id; private String courseName; private Double givenRating; private String title; diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java index 909ab3c..149f1d2 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java @@ -10,5 +10,5 @@ public class TeacherInfoDTO { private String category; private String academicTitle; private String fullName; - private Double averageRating; + private float averageRating; } diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java index d136929..cd9a889 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java @@ -12,10 +12,10 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class TeacherWithReviewsDTO { @Id - private Long teacherId; + private Long id; private String category; private String academicTitle; private String fullName; - private Double averageRating; + private float average; private Set reviews; } diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/Teacher_r.java b/src/main/java/dev/wms/pwrapi/entity/forum/Teacher_r.java index 2f37128..ecce079 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/Teacher_r.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/Teacher_r.java @@ -6,9 +6,9 @@ @Data public class Teacher_r { @Id - private Long teacherId; + private Long id; private String category; private String academicTitle; private String fullName; - private float averageRating; + private float average; } diff --git a/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java b/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java index f68da53..cf790b2 100644 --- a/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java +++ b/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java @@ -6,7 +6,6 @@ import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.query.Param; -import java.util.List; import java.util.Optional; import java.util.Set; @@ -15,18 +14,18 @@ public interface ReviewRepository extends PagingAndSortingRepository getReviewWithoutTeacherById(@Param("reviewId") Long reviewId); - @Query("SELECT * " + + @Query("SELECT teacher_id AS 'id', category, academic_title, full_name, average_rating AS 'average' " + "FROM teacher t " + "WHERE t.teacher_id = (SELECT teacher_id FROM review r WHERE r.review_id = :reviewId)") - Teacher_r getReviewRecipent(@Param("reviewId") Long reviewId); + Teacher_r getReviewRecipient(@Param("reviewId") Long reviewId); - @Query("SELECT review_id, course_name, given_rating, title, review, reviewer, post_date " + + @Query("SELECT review_id AS 'id', course_name, given_rating, title, review, reviewer, post_date " + "FROM review r " + "WHERE r.teacher_id = :teacherId") Set getTeacherReviews(@Param("teacherId") Long teacherId); diff --git a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java index 05bca26..1e036ad 100644 --- a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java +++ b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java @@ -16,7 +16,7 @@ public interface TeacherRepository extends PagingAndSortingRepository getTeacherInfo(@Param("teacherId") Long teacherId); @Query("SELECT teacher_id, category, academic_title, full_name, average_rating " + "FROM teacher t " + diff --git a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java index f7d3544..64208a6 100644 --- a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java +++ b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java @@ -4,7 +4,7 @@ import dev.wms.pwrapi.repository.DatabaseMetadataRepository; import dev.wms.pwrapi.repository.ReviewRepository; import dev.wms.pwrapi.repository.TeacherRepository; -import dev.wms.pwrapi.utils.forum.consts.Category; + import static dev.wms.pwrapi.utils.forum.consts.Category.*; import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; @@ -29,51 +29,67 @@ public class ForumService_r { private final TeacherRepository teacherRepository; private final Long WORST_AND_BEST_TEACHERS_REVIEW_LIMIT = 3L; private final Set categories = - Set.of(MATEMATYCY.name(), FIZYCY.name(), INFORMATYCY.name(), CHEMICY.name(), ELEKTRONICY.name(), JEZYKOWCY.name(), - SPORTOWCY.name(), HUMANISCI.name(), INNI.name()); + Set.of( + MATEMATYCY.name(), FIZYCY.name(), INFORMATYCY.name(), CHEMICY.name(), ELEKTRONICY.name(), + JEZYKOWCY.name(), SPORTOWCY.name(), HUMANISCI.name(), INNI.name() + ); public DatabaseMetadataDTO_r getDatabaseMetadata() { return databaseMetadataRepository.getDatabaseMetadata(); } public DatabaseMetadataDTO_r getTotalReviews() { - DatabaseMetadataDTO_r databaseMetadataDTO = new DatabaseMetadataDTO_r(); - databaseMetadataDTO.setTotalReviews(reviewRepository.getTotalNumberOfReviews()); - return databaseMetadataDTO; + return DatabaseMetadataDTO_r.builder() + .totalReviews(reviewRepository.getTotalNumberOfReviews()) + .build(); } public Review_r getReviewById(Long reviewId) { Optional review = reviewRepository.getReviewWithoutTeacherById(reviewId); - review.ifPresentOrElse(r -> { - r.setTeacher(reviewRepository.getReviewRecipent(reviewId)); - }, () -> { - throw new ReviewNotFoundException(reviewId); - }); + review.ifPresentOrElse( + r -> r.setTeacher(reviewRepository.getReviewRecipient(reviewId)), + () -> { + throw new ReviewNotFoundException(reviewId); + }); return review.get(); } public DatabaseMetadataDTO_r getTotalTeachers() { - DatabaseMetadataDTO_r databaseMetadataDTO = new DatabaseMetadataDTO_r(); - databaseMetadataDTO.setTotalTeachers(teacherRepository.getTotalNumberOfTeachers()); - return databaseMetadataDTO; + return DatabaseMetadataDTO_r.builder() + .totalTeachers(teacherRepository.getTotalNumberOfTeachers()) + .build(); } - // TODO -> fix public TeacherWithReviewsDTO getTeacherWithAllReviewsById(Long teacherId){ - //checkIfTeacherExists(teacherId); - TeacherWithReviewsDTO teacherInfo = getTeacherInfo(teacherId); - teacherInfo.setReviews(reviewRepository.getTeacherReviews(teacherId)); - return teacherInfo; + return teacherRepository.getTeacherInfo(teacherId) + .map(t -> { + return TeacherWithReviewsDTO.builder() + .id(t.getTeacherId()) + .category(t.getCategory()) + .academicTitle(t.getAcademicTitle()) + .fullName(t.getFullName()) + .average(t.getAverageRating()) + .reviews(reviewRepository.getTeacherReviews(t.getTeacherId())) + .build(); + }) + .orElseThrow(() -> new TeacherNotFoundException(teacherId)); } public TeacherWithReviewsDTO getTeacherWithLimitedReviewsById(Long teacherId, Long limit){ - if(limit == -1){ - return getTeacherWithAllReviewsById(teacherId); - } -// checkIfTeacherExistsById(teacherId); - TeacherWithReviewsDTO teacherInfo = getTeacherInfo(teacherId); - teacherInfo.setReviews(reviewRepository.getTeacherReviewsLimited(teacherId, limit)); - return teacherInfo; + return limit == - 1 + ? getTeacherWithAllReviewsById(teacherId) + : teacherRepository.getTeacherInfo(teacherId) + .map(t -> { + return TeacherWithReviewsDTO.builder() + .id(t.getTeacherId()) + .category(t.getCategory()) + .academicTitle(t.getAcademicTitle()) + .fullName(t.getFullName()) + .average(t.getAverageRating()) + .reviews(reviewRepository.getTeacherReviewsLimited(teacherId, limit)) + .build(); + }) + .orElseThrow(() -> new TeacherNotFoundException(teacherId)); } public TeacherWithReviewsDTO getTeacherWithLimitedReviewsByFullName(String firstName, String lastName, Long limit){ @@ -81,16 +97,18 @@ public TeacherWithReviewsDTO getTeacherWithLimitedReviewsByFullName(String first return getTeacherWithLimitedReviewsById(teacherId, limit); } - private TeacherWithReviewsDTO getTeacherInfo(Long teacherId){ - TeacherInfoDTO teacherInfo = teacherRepository.getTeacherInfo(teacherId); + /* + private TeacherWithReviewsDTO fetchTeacherReviews(TeacherInfoDTO teacherInfo){ return TeacherWithReviewsDTO.builder() .teacherId(teacherInfo.getTeacherId()) .category(teacherInfo.getCategory()) .academicTitle(teacherInfo.getAcademicTitle()) .fullName(teacherInfo.getFullName()) .averageRating(teacherInfo.getAverageRating()) + .reviews(reviewRepository.getTeacherReviews(teacherInfo.getTeacherId())) .build(); } + */ public Set getTeachersInfoByCategory(String category){ checkIfCategoryExists(category.toUpperCase()); @@ -106,11 +124,11 @@ public Set getLimitedBestTeachersOfCategoryWithExampleRev checkIfCategoryExists(category); return getBestTeachersInfoByCategoryLimited(category, limit).stream() .map(teacherInfo -> TeacherWithReviewsDTO.builder() - .teacherId(teacherInfo.getTeacherId()) + .id(teacherInfo.getTeacherId()) .category(teacherInfo.getCategory()) .academicTitle(teacherInfo.getAcademicTitle()) .fullName(teacherInfo.getFullName()) - .averageRating(teacherInfo.getAverageRating()) + .average(teacherInfo.getAverageRating()) .reviews(reviewRepository.getTeacherReviewsLimited(teacherInfo.getTeacherId(), WORST_AND_BEST_TEACHERS_REVIEW_LIMIT)) .build() @@ -129,11 +147,11 @@ public Set getLimitedWorstTeachersOfCategoryWithExampleRe checkIfCategoryExists(category); return getWorstTeachersInfoByCategoryLimited(category, limit).stream() .map(teacherInfo -> TeacherWithReviewsDTO.builder() - .teacherId(teacherInfo.getTeacherId()) + .id(teacherInfo.getTeacherId()) .category(teacherInfo.getCategory()) .academicTitle(teacherInfo.getAcademicTitle()) .fullName(teacherInfo.getFullName()) - .averageRating(teacherInfo.getAverageRating()) + .average(teacherInfo.getAverageRating()) .reviews(reviewRepository.getTeacherReviewsLimited(teacherInfo.getTeacherId(), WORST_AND_BEST_TEACHERS_REVIEW_LIMIT)) .build() diff --git a/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO_r.java b/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO_r.java index 9b55be3..ede445e 100644 --- a/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO_r.java +++ b/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO_r.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -10,10 +11,8 @@ @JsonInclude(JsonInclude.Include.NON_NULL) @Data -@NoArgsConstructor -@AllArgsConstructor +@Builder public class DatabaseMetadataDTO_r { - private Long totalTeachers; private Long totalReviews; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") From b6ba1820b0a3913a1a48aef80044c4620b0baf7b Mon Sep 17 00:00:00 2001 From: Woojciech Date: Mon, 13 Feb 2023 20:59:11 +0100 Subject: [PATCH 08/10] further integration provided for contract fulfilment of ForumAPI after refactor --- .../java/dev/wms/pwrapi/api/ForumAPI_r.java | 46 ++---------- .../pwrapi/entity/forum/TeacherInfoDTO.java | 6 +- .../pwrapi/repository/ReviewRepository.java | 2 +- .../pwrapi/repository/TeacherRepository.java | 16 ++--- .../pwrapi/service/forum/ForumService_r.java | 72 +++++++------------ src/main/resources/application.properties | 2 +- 6 files changed, 47 insertions(+), 97 deletions(-) diff --git a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java index b5f25da..8445c9a 100644 --- a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java +++ b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java @@ -77,63 +77,31 @@ public ResponseEntity getTeacherWithLimitedReviewsByFullN @RequestParam("firstName") @NotNull(message = "firstName jest wymagane") String firstName, @RequestParam("lastName") @NotNull(message = "lastName jest wymagane") String lastName, @RequestParam("limit") @Min(value = -1, message = "limit powinien być >= -1") Long limit) { - /* - if(limit >= -1){ - try { - Teacher response = forumService.fetchLimitedTeacherReviewsByFullName(firstName, lastName, limit); - return ResponseEntity.status(HttpStatus.OK).body(response); - }catch(EmptyResultDataAccessException e){ - throw new TeacherNotFoundByFullNameException(firstName, lastName); - } - }else{ - throw new InvalidLimitException(limit); - } - */ return ResponseEntity.ok(forumService.getTeacherWithLimitedReviewsByFullName(firstName, lastName, limit)); } @GetMapping("/prowadzacy/kategoria/{category}") @Operation(summary = "Returns all teachers who belong to the specified category.") public ResponseEntity> getTeachersByCategory( - @PathVariable @NotNull(message = "kategoria jest wymagana") String category) { - /* - List response = forumService.getTeachersByCategory(category); - if(response.isEmpty()){ - throw new CategoryMembersNotFoundException(category); - } - return ResponseEntity.status(HttpStatus.OK).body(response); - */ + @PathVariable String category) { return ResponseEntity.ok(forumService.getTeachersInfoByCategory(category)); } + //TODO -> add number of reviews (feature) @GetMapping("/prowadzacy/ranking") @Operation(summary = "Returns teachers who belong to the specified category ranked by their average rating.") public ResponseEntity> getTeachersRankedByCategory(@RequestParam("kategoria") String category) { - /* - List response = forumService.getBestTeachersRankedByCategory(category); - if(response.isEmpty()){ - throw new CategoryMembersNotFoundException(category); - } - return ResponseEntity.status(HttpStatus.OK).body(response); - */ return ResponseEntity.ok(forumService.getBestTeachersOfCategory(category)); } // TODO -> fix limit @GetMapping("/prowadzacy/{category}/ranking/najlepsi") - @Operation(summary = "Returns limited number of best rated teachers who belong to the specified category, example reviews are provided.", - description = "Number of return teachers is specified by the limit parameter, each teacher has a maximal example of three associated reviews.") + @Operation(summary = "Returns limited number of best rated teachers who belong to the specified category, " + + "example reviews are provided.", + description = "Number of return teachers is specified by the limit parameter, each teacher has a maximal " + + "example of three associated reviews.") public ResponseEntity> getBestRankedTeachersByCategoryWithReviewsLimited( - @PathVariable String category, @RequestParam("limit") @Min(-1) Long limit) { - - /* - List response = forumService.getBestRankedTeachersByCategoryLimited(category, limit); - if(response.isEmpty()){ - throw new CategoryMembersNotFoundException(category); - } - - return ResponseEntity.status(HttpStatus.OK).body(response); - */ + @PathVariable String category, @RequestParam("limit") @Min(-1) int limit) { return ResponseEntity.ok(forumService.getLimitedBestTeachersOfCategoryWithExampleReviews(category, limit)); } diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java index 149f1d2..639cc1f 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java @@ -4,11 +4,11 @@ import lombok.Data; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_EMPTY) public class TeacherInfoDTO { - private Long teacherId; + private Long id; private String category; private String academicTitle; private String fullName; - private float averageRating; + private float average; } diff --git a/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java b/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java index cf790b2..e3352aa 100644 --- a/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java +++ b/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java @@ -30,7 +30,7 @@ public interface ReviewRepository extends PagingAndSortingRepository getTeacherReviews(@Param("teacherId") Long teacherId); - @Query("SELECT review_id, course_name, given_rating, title, review, reviewer, post_date " + + @Query("SELECT review_id AS 'id', course_name, given_rating, title, review, reviewer, post_date " + "FROM review r " + "WHERE r.teacher_id = :teacherId " + "LIMIT :limit") diff --git a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java index 1e036ad..967f723 100644 --- a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java +++ b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java @@ -18,24 +18,24 @@ public interface TeacherRepository extends PagingAndSortingRepository getTeacherInfo(@Param("teacherId") Long teacherId); - @Query("SELECT teacher_id, category, academic_title, full_name, average_rating " + + @Query("SELECT teacher_id AS 'id', category, academic_title, full_name, average_rating AS 'average' " + "FROM teacher t " + "WHERE t.category = :category") Set getTeachersInfoByCategory(@Param("category") String category); - @Query("SELECT teacher_id, category, academic_title, full_name, average_rating " + + @Query("SELECT teacher_id AS 'id', category, academic_title, full_name, average_rating AS 'average'" + "FROM teacher t " + "WHERE t.category = :category " + "ORDER BY average_rating DESC") Set getBestTeachersOfCategory(@Param("category") String category); - @Query("SELECT teacher_id, category, academic_title, full_name, average_rating " + + @Query("SELECT teacher_id AS 'id', category, academic_title, full_name, average_rating AS 'average' " + "FROM teacher t " + "WHERE t.category = :category " + "ORDER BY average_rating DESC " + "LIMIT :limit") Set getBestTeachersOfCategoryLimited(@Param("category") String category, - @Param("limit") Long limit); + @Param("limit") int limit); @Query("SELECT teacher_id, category, academic_title, full_name, average_rating " + "FROM teacher t " + @@ -54,8 +54,8 @@ Set getWorstTeachersOfCategoryLimited(@Param("category") String @Query("SELECT teacher_id " + "FROM teacher " + "WHERE " + - "full_name LIKE '%':firstName'%':lastName'%' " + - "OR " + - "full_name LIKE '%':lastName'%':firstName'%'") - Long getTeacherIdByFullName(@Param("firstName") String firstName, @Param("lastName") String lastName); + "full_name LIKE :firstName " + + "AND " + + "full_name LIKE :lastName") + Optional getTeacherIdByFullName(@Param("firstName") String firstName, @Param("lastName") String lastName); } \ No newline at end of file diff --git a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java index 64208a6..0eb04e2 100644 --- a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java +++ b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java @@ -10,6 +10,7 @@ import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; import dev.wms.pwrapi.utils.forum.exceptions.CategoryMembersNotFoundException; import dev.wms.pwrapi.utils.forum.exceptions.ReviewNotFoundException; +import dev.wms.pwrapi.utils.forum.exceptions.TeacherNotFoundByFullNameException; import dev.wms.pwrapi.utils.forum.exceptions.TeacherNotFoundException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -64,12 +65,12 @@ public TeacherWithReviewsDTO getTeacherWithAllReviewsById(Long teacherId){ return teacherRepository.getTeacherInfo(teacherId) .map(t -> { return TeacherWithReviewsDTO.builder() - .id(t.getTeacherId()) + .id(t.getId()) .category(t.getCategory()) .academicTitle(t.getAcademicTitle()) .fullName(t.getFullName()) - .average(t.getAverageRating()) - .reviews(reviewRepository.getTeacherReviews(t.getTeacherId())) + .average(t.getAverage()) + .reviews(reviewRepository.getTeacherReviews(t.getId())) .build(); }) .orElseThrow(() -> new TeacherNotFoundException(teacherId)); @@ -81,11 +82,11 @@ public TeacherWithReviewsDTO getTeacherWithLimitedReviewsById(Long teacherId, Lo : teacherRepository.getTeacherInfo(teacherId) .map(t -> { return TeacherWithReviewsDTO.builder() - .id(t.getTeacherId()) + .id(t.getId()) .category(t.getCategory()) .academicTitle(t.getAcademicTitle()) .fullName(t.getFullName()) - .average(t.getAverageRating()) + .average(t.getAverage()) .reviews(reviewRepository.getTeacherReviewsLimited(teacherId, limit)) .build(); }) @@ -97,18 +98,14 @@ public TeacherWithReviewsDTO getTeacherWithLimitedReviewsByFullName(String first return getTeacherWithLimitedReviewsById(teacherId, limit); } - /* - private TeacherWithReviewsDTO fetchTeacherReviews(TeacherInfoDTO teacherInfo){ - return TeacherWithReviewsDTO.builder() - .teacherId(teacherInfo.getTeacherId()) - .category(teacherInfo.getCategory()) - .academicTitle(teacherInfo.getAcademicTitle()) - .fullName(teacherInfo.getFullName()) - .averageRating(teacherInfo.getAverageRating()) - .reviews(reviewRepository.getTeacherReviews(teacherInfo.getTeacherId())) - .build(); + // TODO -> work on LIKE + private Long getTeacherIdByFullName(String firstName, String lastName){ + Optional teacherId = teacherRepository.getTeacherIdByFullName("%" + firstName + "%", "%" + lastName + "%"); + if(teacherId.isEmpty()){ + throw new TeacherNotFoundByFullNameException(firstName, lastName); + } + return teacherId.get(); } - */ public Set getTeachersInfoByCategory(String category){ checkIfCategoryExists(category.toUpperCase()); @@ -120,23 +117,29 @@ public Set getBestTeachersOfCategory(String category){ return teacherRepository.getBestTeachersOfCategory(category); } - public Set getLimitedBestTeachersOfCategoryWithExampleReviews(String category, Long limit){ + private void checkIfCategoryExists(String category){ + if(!categories.contains(category.toUpperCase())){ + throw new CategoryMembersNotFoundException(category); + } + } + + public Set getLimitedBestTeachersOfCategoryWithExampleReviews(String category, int limit){ checkIfCategoryExists(category); return getBestTeachersInfoByCategoryLimited(category, limit).stream() .map(teacherInfo -> TeacherWithReviewsDTO.builder() - .id(teacherInfo.getTeacherId()) + .id(teacherInfo.getId()) .category(teacherInfo.getCategory()) .academicTitle(teacherInfo.getAcademicTitle()) .fullName(teacherInfo.getFullName()) - .average(teacherInfo.getAverageRating()) - .reviews(reviewRepository.getTeacherReviewsLimited(teacherInfo.getTeacherId(), + .average(teacherInfo.getAverage()) + .reviews(reviewRepository.getTeacherReviewsLimited(teacherInfo.getId(), WORST_AND_BEST_TEACHERS_REVIEW_LIMIT)) .build() ) .collect(Collectors.toSet()); } - private Set getBestTeachersInfoByCategoryLimited(String category, Long limit){ + private Set getBestTeachersInfoByCategoryLimited(String category, int limit){ if(limit == -1){ return teacherRepository.getBestTeachersOfCategory(category); } @@ -147,12 +150,12 @@ public Set getLimitedWorstTeachersOfCategoryWithExampleRe checkIfCategoryExists(category); return getWorstTeachersInfoByCategoryLimited(category, limit).stream() .map(teacherInfo -> TeacherWithReviewsDTO.builder() - .id(teacherInfo.getTeacherId()) + .id(teacherInfo.getId()) .category(teacherInfo.getCategory()) .academicTitle(teacherInfo.getAcademicTitle()) .fullName(teacherInfo.getFullName()) - .average(teacherInfo.getAverageRating()) - .reviews(reviewRepository.getTeacherReviewsLimited(teacherInfo.getTeacherId(), + .average(teacherInfo.getAverage()) + .reviews(reviewRepository.getTeacherReviewsLimited(teacherInfo.getId(), WORST_AND_BEST_TEACHERS_REVIEW_LIMIT)) .build() ) @@ -165,25 +168,4 @@ private Set getWorstTeachersInfoByCategoryLimited(String categor } return teacherRepository.getWorstTeachersOfCategoryLimited(category, limit); } - - private void checkIfCategoryExists(String category){ - if(!categories.contains(category.toUpperCase())){ - throw new CategoryMembersNotFoundException(category); - } - } - private void checkIfTeacherExistsById(Long teacherId){ - if(!teacherRepository.existsById(teacherId)){ - throw new TeacherNotFoundException(teacherId); - } - } - private Long getTeacherIdByFullName(String firstName, String lastName){ - /* - Long teacherId = teacherRepository.getTeacherIdByFullName(firstName, lastName); - if(teacherId == null){ - throw new RuntimeException("teacher not present!"); - } - return teacherId; - */ - return teacherRepository.getTeacherIdByFullName(firstName, lastName); - } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f6668aa..30dcf9e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,6 +2,6 @@ logging.file.path=./pwr-api-logs logging.file.name=pwr-api.log logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG spring.data.rest.default-media-type=application/json -log4j.category.org.springframework.jdbc.core = TRACE +logging.level.org.springframework.jdbc.core = TRACE pwr-api.news.cacheTTL=900000 \ No newline at end of file From 2903fd0077f24b03a69267ab77da5120845d6199 Mon Sep 17 00:00:00 2001 From: Woojciech Date: Fri, 17 Feb 2023 22:14:14 +0100 Subject: [PATCH 09/10] implement stable version of forum refactor, supply caching for forum endpoints --- .../java/dev/wms/pwrapi/api/ForumAPI_r.java | 20 ++++++------------- .../entity/forum/TeacherWithReviewsDTO.java | 2 +- .../pwrapi/repository/TeacherRepository.java | 8 ++++---- .../pwrapi/service/forum/ForumService_r.java | 14 ++++--------- .../pwrapi/utils/config/CachingConfig.java | 2 +- 5 files changed, 16 insertions(+), 30 deletions(-) diff --git a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java index 8445c9a..e6d4ce4 100644 --- a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java +++ b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java @@ -7,6 +7,7 @@ import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.Cacheable; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -24,14 +25,14 @@ public class ForumAPI_r { private final ForumService_r forumService; - // TODO - think about caching + @Cacheable("metadata") @GetMapping @Operation(summary = "Returns database metadata such as number of records in each category and latest refresh timestamp.") public ResponseEntity getDatabaseMetadata() { return ResponseEntity.ok(forumService.getDatabaseMetadata()); } - // TODO - think about caching + @Cacheable("reviews") @GetMapping("/opinie") @Operation(summary = "Returns total number of teacher reviews collected.") public ResponseEntity getTotalReviews() { @@ -45,7 +46,7 @@ public ResponseEntity getReviewById(@PathVariable @Positive(message = return ResponseEntity.ok(forumService.getReviewById(reviewId)); } - // TODO -> think about caching + @Cacheable("teachers") @GetMapping("/prowadzacy") @Operation(summary = "Returns total number of teachers.") public ResponseEntity getTotalTeachers() { @@ -94,30 +95,21 @@ public ResponseEntity> getTeachersRankedByCategory(@RequestP return ResponseEntity.ok(forumService.getBestTeachersOfCategory(category)); } - // TODO -> fix limit @GetMapping("/prowadzacy/{category}/ranking/najlepsi") @Operation(summary = "Returns limited number of best rated teachers who belong to the specified category, " + "example reviews are provided.", description = "Number of return teachers is specified by the limit parameter, each teacher has a maximal " + "example of three associated reviews.") public ResponseEntity> getBestRankedTeachersByCategoryWithReviewsLimited( - @PathVariable String category, @RequestParam("limit") @Min(-1) int limit) { + @PathVariable String category, @RequestParam("limit") @Positive(message = "limit powinien być >= 0") int limit) { return ResponseEntity.ok(forumService.getLimitedBestTeachersOfCategoryWithExampleReviews(category, limit)); } - // TODO -> fix limit @GetMapping("/prowadzacy/{category}/ranking/najgorsi") @Operation(summary = "Returns limited number of worst rated teachers who belong to the specified category, example reviews are provided.", description = "Number of return teachers is specified by the limit parameter, each teacher has a maximal example of three associated reviews.") public ResponseEntity> getWorstRankedTeachersByCategoryWithReviewsLimited( - @PathVariable String category, @RequestParam("limit") @Min(-1) Long limit) { - /* - List response = forumService.getWorstRankedTeachersByCategoryLimited(category, limit); - if(response.isEmpty()){ - throw new CategoryMembersNotFoundException(category); - } - return ResponseEntity.status(HttpStatus.OK).body(response); - */ + @PathVariable String category, @RequestParam("limit") @Positive(message = "limit powinien być >= 0") int limit) { return ResponseEntity.ok(forumService.getLimitedWorstTeachersOfCategoryWithExampleReviews(category, limit)); } } diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java index cd9a889..7ab6455 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java @@ -9,7 +9,7 @@ @Builder @Data -@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_EMPTY) public class TeacherWithReviewsDTO { @Id private Long id; diff --git a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java index 967f723..c4ed1c8 100644 --- a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java +++ b/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java @@ -13,7 +13,7 @@ public interface TeacherRepository extends PagingAndSortingRepository getTeacherInfo(@Param("teacherId") Long teacherId); @@ -37,19 +37,19 @@ public interface TeacherRepository extends PagingAndSortingRepository getBestTeachersOfCategoryLimited(@Param("category") String category, @Param("limit") int limit); - @Query("SELECT teacher_id, category, academic_title, full_name, average_rating " + + @Query("SELECT teacher_id AS 'id', category, academic_title, full_name, average_rating AS 'average' " + "FROM teacher t " + "WHERE t.category = :category " + "ORDER BY average_rating ASC") Set getWorstTeachersOfCategory(@Param("category") String category); - @Query("SELECT teacher_id, category, academic_title, full_name, average_rating " + + @Query("SELECT teacher_id AS 'id', category, academic_title, full_name, average_rating AS 'average' " + "FROM teacher t " + "WHERE t.category = :category " + "ORDER BY average_rating ASC " + "LIMIT :limit") Set getWorstTeachersOfCategoryLimited(@Param("category") String category, - @Param("limit") Long limit); + @Param("limit") int limit); @Query("SELECT teacher_id " + "FROM teacher " + diff --git a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java index 0eb04e2..49836f1 100644 --- a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java +++ b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java @@ -108,12 +108,12 @@ private Long getTeacherIdByFullName(String firstName, String lastName){ } public Set getTeachersInfoByCategory(String category){ - checkIfCategoryExists(category.toUpperCase()); + checkIfCategoryExists(category); return teacherRepository.getTeachersInfoByCategory(category); } public Set getBestTeachersOfCategory(String category){ - checkIfCategoryExists(category.toUpperCase()); + checkIfCategoryExists(category); return teacherRepository.getBestTeachersOfCategory(category); } @@ -140,13 +140,10 @@ public Set getLimitedBestTeachersOfCategoryWithExampleRev } private Set getBestTeachersInfoByCategoryLimited(String category, int limit){ - if(limit == -1){ - return teacherRepository.getBestTeachersOfCategory(category); - } return teacherRepository.getBestTeachersOfCategoryLimited(category, limit); } - public Set getLimitedWorstTeachersOfCategoryWithExampleReviews(String category, Long limit){ + public Set getLimitedWorstTeachersOfCategoryWithExampleReviews(String category, int limit){ checkIfCategoryExists(category); return getWorstTeachersInfoByCategoryLimited(category, limit).stream() .map(teacherInfo -> TeacherWithReviewsDTO.builder() @@ -162,10 +159,7 @@ public Set getLimitedWorstTeachersOfCategoryWithExampleRe .collect(Collectors.toSet()); } - private Set getWorstTeachersInfoByCategoryLimited(String category, Long limit){ - if(limit == -1){ - return teacherRepository.getWorstTeachersOfCategory(category); - } + private Set getWorstTeachersInfoByCategoryLimited(String category, int limit){ return teacherRepository.getWorstTeachersOfCategoryLimited(category, limit); } } diff --git a/src/main/java/dev/wms/pwrapi/utils/config/CachingConfig.java b/src/main/java/dev/wms/pwrapi/utils/config/CachingConfig.java index c9ddafa..e168d06 100644 --- a/src/main/java/dev/wms/pwrapi/utils/config/CachingConfig.java +++ b/src/main/java/dev/wms/pwrapi/utils/config/CachingConfig.java @@ -24,7 +24,7 @@ public class CachingConfig implements CacheManagerCustomizer Date: Sat, 18 Feb 2023 09:25:46 +0100 Subject: [PATCH 10/10] cleanup legacy ForumAPI --- .../java/dev/wms/pwrapi/api/ForumAPI.java | 169 +++++-------- .../java/dev/wms/pwrapi/api/ForumAPI_r.java | 115 --------- .../forum}/DatabaseMetadataRepository.java | 7 +- .../dev/wms/pwrapi/dao/forum/ForumDAO.java | 65 ----- .../wms/pwrapi/dao/forum/ForumDAOImpl.java | 231 ------------------ .../forum}/ReviewRepository.java | 16 +- .../forum}/TeacherRepository.java | 6 +- .../dev/wms/pwrapi/entity/forum/Review.java | 86 +------ .../dev/wms/pwrapi/entity/forum/Review_r.java | 23 -- .../dev/wms/pwrapi/entity/forum/Teacher.java | 80 +----- .../entity/forum/TeacherWithReviewsDTO.java | 2 +- .../wms/pwrapi/entity/forum/Teacher_r.java | 14 -- .../pwrapi/service/forum/ForumService.java | 24 -- .../service/forum/ForumServiceImpl.java | 196 ++++++++++----- .../pwrapi/service/forum/ForumService_r.java | 165 ------------- .../utils/forum/dto/DatabaseMetadataDTO.java | 19 +- .../forum/dto/DatabaseMetadataDTO_r.java | 20 -- .../forum/rowMappers/ReviewRowMapper.java | 27 -- .../ReviewWithTeacherRowMapper.java | 32 --- .../forum/rowMappers/TeacherRowMapper.java | 25 -- .../java/dev/wms/pwrapi/forum/ForumTests.java | 9 - 21 files changed, 235 insertions(+), 1096 deletions(-) delete mode 100644 src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java rename src/main/java/dev/wms/pwrapi/{repository => dao/forum}/DatabaseMetadataRepository.java (70%) delete mode 100644 src/main/java/dev/wms/pwrapi/dao/forum/ForumDAO.java delete mode 100644 src/main/java/dev/wms/pwrapi/dao/forum/ForumDAOImpl.java rename src/main/java/dev/wms/pwrapi/{repository => dao/forum}/ReviewRepository.java (72%) rename src/main/java/dev/wms/pwrapi/{repository => dao/forum}/TeacherRepository.java (96%) delete mode 100644 src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java delete mode 100644 src/main/java/dev/wms/pwrapi/entity/forum/Teacher_r.java delete mode 100644 src/main/java/dev/wms/pwrapi/service/forum/ForumService.java delete mode 100644 src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java delete mode 100644 src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO_r.java delete mode 100644 src/main/java/dev/wms/pwrapi/utils/forum/rowMappers/ReviewRowMapper.java delete mode 100644 src/main/java/dev/wms/pwrapi/utils/forum/rowMappers/ReviewWithTeacherRowMapper.java delete mode 100644 src/main/java/dev/wms/pwrapi/utils/forum/rowMappers/TeacherRowMapper.java diff --git a/src/main/java/dev/wms/pwrapi/api/ForumAPI.java b/src/main/java/dev/wms/pwrapi/api/ForumAPI.java index e1d5f0d..3e94feb 100644 --- a/src/main/java/dev/wms/pwrapi/api/ForumAPI.java +++ b/src/main/java/dev/wms/pwrapi/api/ForumAPI.java @@ -1,161 +1,116 @@ package dev.wms.pwrapi.api; -import com.fasterxml.jackson.core.JsonProcessingException; import dev.wms.pwrapi.entity.forum.Review; -import dev.wms.pwrapi.entity.forum.Teacher; -import dev.wms.pwrapi.service.forum.ForumService; +import dev.wms.pwrapi.entity.forum.TeacherInfoDTO; +import dev.wms.pwrapi.entity.forum.TeacherWithReviewsDTO; +import dev.wms.pwrapi.service.forum.ForumServiceImpl; import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO; -import dev.wms.pwrapi.utils.forum.exceptions.*; -import dev.wms.pwrapi.utils.generalExceptions.InvalidIdException; import io.swagger.v3.oas.annotations.Operation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.http.HttpStatus; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.Cacheable; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.Min; -import java.util.List; - -@RestController("/api/forum") -@RequestMapping(value = "/api/forum", produces = "application/json") +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; +import java.util.Set; + +@RestController +@RequestMapping("/api/forum") +@RequiredArgsConstructor +@Validated public class ForumAPI { - private final ForumService forumService; - - @Autowired - public ForumAPI(ForumService forumService){ - this.forumService = forumService; - } + private final ForumServiceImpl forumService; + @Cacheable("metadata") @GetMapping @Operation(summary = "Returns database metadata such as number of records in each category and latest refresh timestamp.") - public ResponseEntity getDatabaseMetadata() throws JsonProcessingException { - DatabaseMetadataDTO result = forumService.getDatabaseMetadata(); - return ResponseEntity.status(HttpStatus.OK).body(result); + public ResponseEntity getDatabaseMetadata() { + return ResponseEntity.ok(forumService.getDatabaseMetadata()); } + @Cacheable("reviews") @GetMapping("/opinie") - @Operation(summary = "Returns total number of reviews.") - public ResponseEntity getTotalReviews() throws JsonProcessingException { - DatabaseMetadataDTO result = forumService.getTotalReviews(); - return ResponseEntity.status(HttpStatus.OK).body(result); + @Operation(summary = "Returns total number of teacher reviews collected.") + public ResponseEntity getTotalReviews() { + return ResponseEntity.ok(forumService.getTotalReviews()); } + // TODO -> emtpy return instead of exception in case review is not found @GetMapping("/opinie/{reviewId}") - @Operation(summary = "Returns review with specified id.") - public ResponseEntity getReviewById(@PathVariable @Min(1) int reviewId) throws JsonProcessingException { - try { - Review result = forumService.getReviewById(reviewId); - return ResponseEntity.status(HttpStatus.OK).body(result); - }catch (EmptyResultDataAccessException e){ - throw new ReviewNotFoundException((long) reviewId); - } + @Operation(summary = "Returns review with specified reviewId.") + public ResponseEntity getReviewById(@PathVariable @Positive(message = "reviewId powinno być >= 0") Long reviewId) { + return ResponseEntity.ok(forumService.getReviewById(reviewId)); } + @Cacheable("teachers") @GetMapping("/prowadzacy") @Operation(summary = "Returns total number of teachers.") - public ResponseEntity getTotalTeachers() throws JsonProcessingException { - DatabaseMetadataDTO result = forumService.getTotalTeachers(); - return ResponseEntity.status(HttpStatus.OK).body(result); + public ResponseEntity getTotalTeachers() { + return ResponseEntity.ok(forumService.getTotalTeachers()); } @GetMapping(value = "/prowadzacy/{teacherId}") @Operation(summary = "Returns teacher with specified id.") - public ResponseEntity fetchAllTeacherReviewsById(@PathVariable int teacherId) throws JsonProcessingException { - if(teacherId <= 0) { - throw new InvalidIdException(teacherId); - } - - try{ - Teacher result = forumService.fetchLimitedTeacherReviewsById(teacherId, -1); - return ResponseEntity.status(HttpStatus.OK).body(result); - }catch(EmptyResultDataAccessException e){ - throw new TeacherNotFoundByIdException(teacherId); - } + public ResponseEntity getTeacherWithReviews( + @PathVariable @Positive (message = "teacherId powinno być >= 0") Long teacherId) { + return ResponseEntity.ok(forumService.getTeacherWithAllReviewsById(teacherId)); } @GetMapping("/prowadzacy/szukajId") @Operation(summary = "Returns certain teacher specified by id and limited number of reviews.", - description = "Maximal number of fetched reviews is specified by the limit parameter, set limit = -1 to fetch all available reviews.") - public ResponseEntity fetchLimitedTeacherReviewsById(@RequestParam("teacherId") int teacherId, @RequestParam("limit") int limit) throws JsonProcessingException { - if(teacherId <= 0){ - throw new InvalidIdException(teacherId); - } - - if(limit >= -1) { - try { - Teacher response = forumService.fetchLimitedTeacherReviewsById(teacherId, limit); - return ResponseEntity.status(HttpStatus.OK).body(response); - }catch(EmptyResultDataAccessException e){ - throw new TeacherNotFoundByIdException(teacherId); - } - }else{ - throw new InvalidLimitException(limit); - } + description = "Maximal number of fetched reviews is specified by the limit parameter, set limit = -1 to " + + "fetch all available reviews.") + public ResponseEntity getTeacherWithLimitedReviewsById( + @RequestParam("teacherId") @Positive (message = "teacherId powinno być >= 0") Long teacherId, + @RequestParam("limit") @Min(value = -1, message = "limit powinien być >= -1") Long limit) { + return ResponseEntity.ok(forumService.getTeacherWithLimitedReviewsById(teacherId, limit)); } @GetMapping("/prowadzacy/szukajImie") @Operation(summary = "Returns certain teacher specified by full name and limited number of reviews.", - description = "Parameters firstName and lastName are interchangeable, query is based on pattern matching. " + - "Maximal number of reviews is specified by the limit parameter, set limit = -1 to fetch all available reviews.") - public ResponseEntity fetchTeacherReviewsByFullName(@RequestParam("firstName") String firstName, - @RequestParam("lastName") String lastName, @RequestParam("limit") int limit) throws JsonProcessingException { - if(limit >= -1){ - try { - Teacher response = forumService.fetchLimitedTeacherReviewsByFullName(firstName, lastName, limit); - return ResponseEntity.status(HttpStatus.OK).body(response); - }catch(EmptyResultDataAccessException e){ - throw new TeacherNotFoundByFullNameException(firstName, lastName); - } - }else{ - throw new InvalidLimitException(limit); - } + description = "Parameters firstName and lastName are interchangeable, query is based on pattern matching. " + + "Maximal number of reviews is specified by the limit parameter, set limit = -1 to fetch all available reviews.") + public ResponseEntity getTeacherWithLimitedReviewsByFullName( + @RequestParam("firstName") @NotNull(message = "firstName jest wymagane") String firstName, + @RequestParam("lastName") @NotNull(message = "lastName jest wymagane") String lastName, + @RequestParam("limit") @Min(value = -1, message = "limit powinien być >= -1") Long limit) { + return ResponseEntity.ok(forumService.getTeacherWithLimitedReviewsByFullName(firstName, lastName, limit)); } @GetMapping("/prowadzacy/kategoria/{category}") @Operation(summary = "Returns all teachers who belong to the specified category.") - public ResponseEntity> getTeachersByCategory(@PathVariable String category) throws JsonProcessingException { - List response = forumService.getTeachersByCategory(category); - if(response.isEmpty()){ - throw new CategoryMembersNotFoundException(category); - } - return ResponseEntity.status(HttpStatus.OK).body(response); + public ResponseEntity> getTeachersByCategory( + @PathVariable String category) { + return ResponseEntity.ok(forumService.getTeachersInfoByCategory(category)); } + //TODO -> add number of reviews (feature) @GetMapping("/prowadzacy/ranking") @Operation(summary = "Returns teachers who belong to the specified category ranked by their average rating.") - public ResponseEntity> getTeachersRankedByCategory(@RequestParam("kategoria") String category) throws JsonProcessingException { - List response = forumService.getBestTeachersRankedByCategory(category); - if(response.isEmpty()){ - throw new CategoryMembersNotFoundException(category); - } - return ResponseEntity.status(HttpStatus.OK).body(response); + public ResponseEntity> getTeachersRankedByCategory( + @RequestParam(name = "kategoria") String category) { + return ResponseEntity.ok(forumService.getBestTeachersOfCategory(category)); } @GetMapping("/prowadzacy/{category}/ranking/najlepsi") - @Operation(summary = "Returns limited number of best rated teachers who belong to the specified category, example reviews are provided.", - description = "Number of return teachers is specified by the limit parameter, each teacher has a maximal example of three associated reviews.") - public ResponseEntity> getBestRankedTeachersByCategoryWithReviewsLimited(@PathVariable String category, @RequestParam("limit") @Min(-1) int limit) throws JsonProcessingException { - - List response = forumService.getBestRankedTeachersByCategoryLimited(category, limit); - if(response.isEmpty()){ - throw new CategoryMembersNotFoundException(category); - } - - return ResponseEntity.status(HttpStatus.OK).body(response); + @Operation(summary = "Returns limited number of best rated teachers who belong to the specified category, " + + "example reviews are provided.", + description = "Number of return teachers is specified by the limit parameter, each teacher has a maximal " + + "example of three associated reviews.") + public ResponseEntity> getBestRankedTeachersByCategoryWithReviewsLimited( + @PathVariable String category, @RequestParam("limit") @Positive(message = "limit powinien być >= 0") int limit) { + return ResponseEntity.ok(forumService.getLimitedBestTeachersOfCategoryWithExampleReviews(category, limit)); } @GetMapping("/prowadzacy/{category}/ranking/najgorsi") @Operation(summary = "Returns limited number of worst rated teachers who belong to the specified category, example reviews are provided.", description = "Number of return teachers is specified by the limit parameter, each teacher has a maximal example of three associated reviews.") - public ResponseEntity> getWorstRankedTeachersByCategoryWithReviewsLimited(@PathVariable String category, @RequestParam("limit") @Min(-1) int limit) throws JsonProcessingException { - List response = forumService.getWorstRankedTeachersByCategoryLimited(category, limit); - if(response.isEmpty()){ - throw new CategoryMembersNotFoundException(category); - } - return ResponseEntity.status(HttpStatus.OK).body(response); + public ResponseEntity> getWorstRankedTeachersByCategoryWithReviewsLimited( + @PathVariable String category, @RequestParam("limit") @Positive(message = "limit powinien być >= 0") int limit) { + return ResponseEntity.ok(forumService.getLimitedWorstTeachersOfCategoryWithExampleReviews(category, limit)); } - - } diff --git a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java b/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java deleted file mode 100644 index e6d4ce4..0000000 --- a/src/main/java/dev/wms/pwrapi/api/ForumAPI_r.java +++ /dev/null @@ -1,115 +0,0 @@ -package dev.wms.pwrapi.api; - -import dev.wms.pwrapi.entity.forum.Review_r; -import dev.wms.pwrapi.entity.forum.TeacherInfoDTO; -import dev.wms.pwrapi.entity.forum.TeacherWithReviewsDTO; -import dev.wms.pwrapi.service.forum.ForumService_r; -import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; -import io.swagger.v3.oas.annotations.Operation; -import lombok.RequiredArgsConstructor; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Positive; -import java.util.Set; - -@RestController -@RequestMapping("/api/forum_r") -@RequiredArgsConstructor -@Validated -public class ForumAPI_r { - - private final ForumService_r forumService; - - @Cacheable("metadata") - @GetMapping - @Operation(summary = "Returns database metadata such as number of records in each category and latest refresh timestamp.") - public ResponseEntity getDatabaseMetadata() { - return ResponseEntity.ok(forumService.getDatabaseMetadata()); - } - - @Cacheable("reviews") - @GetMapping("/opinie") - @Operation(summary = "Returns total number of teacher reviews collected.") - public ResponseEntity getTotalReviews() { - return ResponseEntity.ok(forumService.getTotalReviews()); - } - - // TODO -> emtpy return instead of exception in case review is not found - @GetMapping("/opinie/{reviewId}") - @Operation(summary = "Returns review with specified reviewId.") - public ResponseEntity getReviewById(@PathVariable @Positive(message = "reviewId powinno być >= 0") Long reviewId) { - return ResponseEntity.ok(forumService.getReviewById(reviewId)); - } - - @Cacheable("teachers") - @GetMapping("/prowadzacy") - @Operation(summary = "Returns total number of teachers.") - public ResponseEntity getTotalTeachers() { - return ResponseEntity.ok(forumService.getTotalTeachers()); - } - - @GetMapping(value = "/prowadzacy/{teacherId}") - @Operation(summary = "Returns teacher with specified id.") - public ResponseEntity getTeacherWithReviews( - @PathVariable @Positive (message = "teacherId powinno być >= 0") Long teacherId) { - return ResponseEntity.ok(forumService.getTeacherWithAllReviewsById(teacherId)); - } - - @GetMapping("/prowadzacy/szukajId") - @Operation(summary = "Returns certain teacher specified by id and limited number of reviews.", - description = "Maximal number of fetched reviews is specified by the limit parameter, set limit = -1 to " + - "fetch all available reviews.") - public ResponseEntity getTeacherWithLimitedReviewsById( - @RequestParam("teacherId") @Positive (message = "teacherId powinno być >= 0") Long teacherId, - @RequestParam("limit") @Min(value = -1, message = "limit powinien być >= -1") Long limit) { - return ResponseEntity.ok(forumService.getTeacherWithLimitedReviewsById(teacherId, limit)); - } - - @GetMapping("/prowadzacy/szukajImie") - @Operation(summary = "Returns certain teacher specified by full name and limited number of reviews.", - description = "Parameters firstName and lastName are interchangeable, query is based on pattern matching. " + - "Maximal number of reviews is specified by the limit parameter, set limit = -1 to fetch all available reviews.") - public ResponseEntity getTeacherWithLimitedReviewsByFullName( - @RequestParam("firstName") @NotNull(message = "firstName jest wymagane") String firstName, - @RequestParam("lastName") @NotNull(message = "lastName jest wymagane") String lastName, - @RequestParam("limit") @Min(value = -1, message = "limit powinien być >= -1") Long limit) { - return ResponseEntity.ok(forumService.getTeacherWithLimitedReviewsByFullName(firstName, lastName, limit)); - } - - @GetMapping("/prowadzacy/kategoria/{category}") - @Operation(summary = "Returns all teachers who belong to the specified category.") - public ResponseEntity> getTeachersByCategory( - @PathVariable String category) { - return ResponseEntity.ok(forumService.getTeachersInfoByCategory(category)); - } - - //TODO -> add number of reviews (feature) - @GetMapping("/prowadzacy/ranking") - @Operation(summary = "Returns teachers who belong to the specified category ranked by their average rating.") - public ResponseEntity> getTeachersRankedByCategory(@RequestParam("kategoria") String category) { - return ResponseEntity.ok(forumService.getBestTeachersOfCategory(category)); - } - - @GetMapping("/prowadzacy/{category}/ranking/najlepsi") - @Operation(summary = "Returns limited number of best rated teachers who belong to the specified category, " + - "example reviews are provided.", - description = "Number of return teachers is specified by the limit parameter, each teacher has a maximal " + - "example of three associated reviews.") - public ResponseEntity> getBestRankedTeachersByCategoryWithReviewsLimited( - @PathVariable String category, @RequestParam("limit") @Positive(message = "limit powinien być >= 0") int limit) { - return ResponseEntity.ok(forumService.getLimitedBestTeachersOfCategoryWithExampleReviews(category, limit)); - } - - @GetMapping("/prowadzacy/{category}/ranking/najgorsi") - @Operation(summary = "Returns limited number of worst rated teachers who belong to the specified category, example reviews are provided.", - description = "Number of return teachers is specified by the limit parameter, each teacher has a maximal example of three associated reviews.") - public ResponseEntity> getWorstRankedTeachersByCategoryWithReviewsLimited( - @PathVariable String category, @RequestParam("limit") @Positive(message = "limit powinien być >= 0") int limit) { - return ResponseEntity.ok(forumService.getLimitedWorstTeachersOfCategoryWithExampleReviews(category, limit)); - } -} diff --git a/src/main/java/dev/wms/pwrapi/repository/DatabaseMetadataRepository.java b/src/main/java/dev/wms/pwrapi/dao/forum/DatabaseMetadataRepository.java similarity index 70% rename from src/main/java/dev/wms/pwrapi/repository/DatabaseMetadataRepository.java rename to src/main/java/dev/wms/pwrapi/dao/forum/DatabaseMetadataRepository.java index b0d845a..9aab639 100644 --- a/src/main/java/dev/wms/pwrapi/repository/DatabaseMetadataRepository.java +++ b/src/main/java/dev/wms/pwrapi/dao/forum/DatabaseMetadataRepository.java @@ -1,13 +1,12 @@ -package dev.wms.pwrapi.repository; +package dev.wms.pwrapi.dao.forum; import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO; -import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; import org.springframework.data.jdbc.repository.query.Query; import org.springframework.data.repository.PagingAndSortingRepository; -public interface DatabaseMetadataRepository extends PagingAndSortingRepository { +public interface DatabaseMetadataRepository extends PagingAndSortingRepository { @Query("SELECT (SELECT COUNT(*) FROM teacher) AS 'total_teachers', (SELECT COUNT(*) FROM review) AS 'total_reviews', " + "(SELECT refresh_date FROM refresh_data) AS 'latest_refresh'") - DatabaseMetadataDTO_r getDatabaseMetadata(); + DatabaseMetadataDTO getDatabaseMetadata(); } \ No newline at end of file diff --git a/src/main/java/dev/wms/pwrapi/dao/forum/ForumDAO.java b/src/main/java/dev/wms/pwrapi/dao/forum/ForumDAO.java deleted file mode 100644 index 5df94e9..0000000 --- a/src/main/java/dev/wms/pwrapi/dao/forum/ForumDAO.java +++ /dev/null @@ -1,65 +0,0 @@ -package dev.wms.pwrapi.dao.forum; - -import dev.wms.pwrapi.entity.forum.Review; -import dev.wms.pwrapi.entity.forum.Teacher; - -import java.util.List; - -public interface ForumDAO { - int getNumberOfTeachers(); - - int getNumberOfReviews(); - - String getLastRefreshDate(); - - List fetchAllTeachers(); - - List fetchTeachersLimited(int limit); - - List fetchAllReviews(); - - List fetchReviewsLimited(int limit); - - List fetchTeacherReviewsById(int teacherId); - - List fetchTeacherReviewsByFullName(String firstName, String lastName); - - List fetchTeacherReviewsByIdLimited(int teacherId, int limit); - - List fetchTeacherReviewsByFullNameLimited(String firstName, String lastName, int limit); - - List fetchRecentTeacherReviewsByFullNameLimited(String firstName, String lastName, int limit); - - List fetchOldestTeacherReviewsByFullNameLimited(String firstName, String lastName, int limit); - - List fetchRecentTeacherReviewsByIdLimited(int teacherId, int limit); - - List fetchOldestTeacherReviewsByIdLimited(int teacherId, int limit); - - Teacher findTeacherById(int teacherId); - - Teacher findTeacherByName(String firstName, String lastName); - - Review findReviewById(int reviewId); - - List fetchBestRatedTeachersLimited(int limit); - - List fetchWorstOrBestTeachersByCategoryWithReviewsLimited(String category, int teacherLimit, int reviewLimit, boolean isBest); - - List fetchWorstRatedTeachersLimited(int limit); - - Teacher fetchTeacherByIdWithReviews(int teacherId); - - Teacher fetchTeacherByIdWithLimitedReviews(int teacherId, int limit); - - Teacher fetchTeacherByFullNameWithReviews(String firstName, String lastName); - - Teacher fetchTeacherByFullNameWithLimitedReviews(String firstName, String lastName, int limit); - - List getTeachersByCategory(String category); - - List getTeachersRankedByCategory(String category, boolean isAscending); - - List getTeachersRankedByCategoryLimited(String category, int limit, boolean isAscending); - -} diff --git a/src/main/java/dev/wms/pwrapi/dao/forum/ForumDAOImpl.java b/src/main/java/dev/wms/pwrapi/dao/forum/ForumDAOImpl.java deleted file mode 100644 index 2bd7c61..0000000 --- a/src/main/java/dev/wms/pwrapi/dao/forum/ForumDAOImpl.java +++ /dev/null @@ -1,231 +0,0 @@ -package dev.wms.pwrapi.dao.forum; - -import dev.wms.pwrapi.entity.forum.Review; -import dev.wms.pwrapi.entity.forum.Teacher; -import dev.wms.pwrapi.utils.forum.rowMappers.ReviewRowMapper; -import dev.wms.pwrapi.utils.forum.rowMappers.ReviewWithTeacherRowMapper; -import dev.wms.pwrapi.utils.forum.rowMappers.TeacherRowMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.stereotype.Repository; - -import javax.sql.DataSource; -import java.util.List; -import java.util.Map; - -@Repository -public class ForumDAOImpl implements ForumDAO { - - private NamedParameterJdbcTemplate jdbcTemplate; - private TeacherRowMapper teacherRowMapper; - private ReviewRowMapper reviewRowMapper; - private ReviewWithTeacherRowMapper reviewWithTeacherRowMapper; - - @Autowired - public ForumDAOImpl(DataSource dataSource, TeacherRowMapper teacherRowMapper, - ReviewRowMapper reviewRowMapper, ReviewWithTeacherRowMapper reviewWithTeacherRowMapper){ - jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); - this.teacherRowMapper = teacherRowMapper; - this.reviewRowMapper = reviewRowMapper; - this.reviewWithTeacherRowMapper = reviewWithTeacherRowMapper; - } - - @Override - public int getNumberOfTeachers(){ - String query = "SELECT COUNT(*) FROM teacher"; - return jdbcTemplate.queryForObject(query, Map.of(), Integer.class); - } - - @Override - public int getNumberOfReviews(){ - String query = "SELECT COUNT(*) FROM review"; - return jdbcTemplate.queryForObject(query, Map.of(), Integer.class); - } - - @Override - public String getLastRefreshDate() { - String query = "SELECT refresh_date FROM refresh_data ORDER BY refresh_date DESC LIMIT 1"; - return jdbcTemplate.queryForObject(query, Map.of(), String.class); - } - - @Override - public List fetchAllTeachers(){ - String query = "SELECT * FROM teacher"; - return jdbcTemplate.query(query, teacherRowMapper); - } - - @Override - public List fetchTeachersLimited(int limit){ - String query = "SELECT * FROM teacher LIMIT :limit"; - return jdbcTemplate.query(query, Map.of("limit", limit), teacherRowMapper); - } - - @Override - public List fetchAllReviews(){ - String query = "SELECT * FROM review"; - return jdbcTemplate.query(query, reviewRowMapper); - } - - @Override - public List fetchReviewsLimited(int limit){ - String query = "SELECT * FROM review LIMIT :limit"; - return jdbcTemplate.query(query, Map.of("limit", limit), reviewRowMapper); - } - - @Override - public List fetchTeacherReviewsById(int teacherId){ - String query = "SELECT * FROM review WHERE teacher_id = :tId"; - return jdbcTemplate.query(query, Map.of("tId", teacherId), reviewRowMapper); - } - - @Override - public List fetchTeacherReviewsByFullName(String firstName, String lastName){ - String query = "SELECT * FROM review WHERE teacher_id = (SELECT teacher_id FROM teacher WHERE full_name LIKE :fn AND full_name LIKE :ln)"; - return jdbcTemplate.query(query, Map.of("fn","%" + firstName + "%", "ln", "%" + lastName + "%"), reviewRowMapper); - } - - @Override - public List fetchTeacherReviewsByIdLimited(int teacherId, int limit){ - String query = "SELECT * FROM review WHERE teacher_id = :tId LIMIT :limit"; - return jdbcTemplate.query(query, Map.of("tId", teacherId, "limit", limit), reviewRowMapper); - } - - @Override - public List fetchTeacherReviewsByFullNameLimited(String firstName, String lastName, int limit){ - String query = "SELECT * FROM review WHERE teacher_id = (SELECT teacher_id FROM teacher WHERE full_name LIKE :fn AND full_name LIKE :ln) LIMIT :limit"; - return jdbcTemplate.query(query, Map.of("fn", "%" + firstName + "%", "ln", "%" + lastName + "%", "limit", limit), reviewRowMapper); - } - - @Override - public List fetchRecentTeacherReviewsByFullNameLimited(String firstName, String lastName, int limit){ - String query = "SELECT * FROM review WHERE teacher_id = (SELECT teacher_id FROM teacher WHERE full_name LIKE :fn AND full_name LIKE :ln) " + - "ORDER BY post_date DESC LIMIT :limit"; - return jdbcTemplate.query(query, Map.of("fn", "%" + firstName + "%", "ln", "%" + lastName + "%", "limit", limit), reviewRowMapper); - } - - @Override - public List fetchOldestTeacherReviewsByFullNameLimited(String firstName, String lastName, int limit){ - String query = "SELECT * FROM review WHERE teacher_id = (SELECT teacher_id FROM teacher WHERE full_name LIKE :fn AND full_name LIKE :ln) " + - "ORDER BY post_date ASC LIMIT :limit"; - return jdbcTemplate.query(query, Map.of("fn", "%" + firstName + "%", "ln","%" + lastName + "%", "limit", limit), reviewRowMapper); - } - - @Override - public List fetchRecentTeacherReviewsByIdLimited(int teacherId, int limit){ - String query = "SELECT * FROM review WHERE teacher_id = :tId ORDER BY post_date DESC LIMIT :limit"; - return jdbcTemplate.query(query, Map.of("tId", teacherId,"limit", limit), reviewRowMapper); - } - - @Override - public List fetchOldestTeacherReviewsByIdLimited(int teacherId, int limit){ - String query = "SELECT * FROM review WHERE teacher_id = :tId ORDER BY post_date ASC LIMIT :limit"; - return jdbcTemplate.query(query, Map.of("tId", teacherId, "limit", limit), reviewRowMapper); - } - - @Override - public Teacher findTeacherById(int teacherId){ - String query = "SELECT * FROM teacher WHERE teacher_id = :id"; - return jdbcTemplate.queryForObject(query, Map.of("id", teacherId), teacherRowMapper); - } - - @Override - public Teacher findTeacherByName(String firstName, String lastName){ - String query = "SELECT * FROM teacher WHERE full_name LIKE :fn AND full_name LIKE :ln"; - return jdbcTemplate.queryForObject(query, Map.of("fn", "%" + firstName + "%", "ln", "%" + lastName + "%"), teacherRowMapper); - } - - @Override - public Review findReviewById(int reviewId) { - String query = "SELECT * FROM review JOIN teacher ON review.teacher_id = teacher.teacher_id WHERE review.review_id = :id"; - return jdbcTemplate.queryForObject(query, Map.of("id", reviewId), reviewWithTeacherRowMapper); - } - - @Override - public List fetchBestRatedTeachersLimited(int limit){ - String query = "SELECT * FROM teacher ORDER BY average_rating DESC LIMIT :limit"; - return jdbcTemplate.query(query, Map.of("limit", limit), teacherRowMapper); - } - - @Override - public List fetchWorstOrBestTeachersByCategoryWithReviewsLimited(String category, int teacherLimit, int reviewLimit, boolean isBest){ - String queryTeacher = isBest ? "SELECT * FROM teacher WHERE category = :cat ORDER BY average_rating DESC LIMIT :tLimit" - : "SELECT * FROM teacher WHERE category = :cat ORDER BY average_rating ASC LIMIT :tLimit"; - String queryReview = "SELECT * FROM review WHERE teacher_id = :tId LIMIT :rLimit"; - List teachers = jdbcTemplate.query(queryTeacher, Map.of("tLimit", teacherLimit, "cat", category), teacherRowMapper); - teachers.forEach(teacher -> { - jdbcTemplate.query(queryReview, Map.of("tId", teacher.getId(), "rLimit", reviewLimit), reviewRowMapper) - .forEach(review -> teacher.addReview(review)); - }); - return teachers; - } - - @Override - public List fetchWorstRatedTeachersLimited(int limit){ - String query = "SELECT * FROM teacher ORDER BY average_rating ASC LIMIT :limit"; - return jdbcTemplate.query(query, Map.of("limit", limit), teacherRowMapper); - } - - @Override - public Teacher fetchTeacherByIdWithReviews(int teacherId){ - String queryTeacher = "SELECT * FROM teacher WHERE teacher_id = :tId"; - String queryReviews = "SELECT * FROM review WHERE teacher_id = :tId"; - Map map = Map.of("tId", teacherId); - Teacher teacher = jdbcTemplate.queryForObject(queryTeacher, map, teacherRowMapper); - jdbcTemplate.query(queryReviews, map, reviewRowMapper).forEach(review -> teacher.addReview(review)); - return teacher; - } - - @Override - public Teacher fetchTeacherByIdWithLimitedReviews(int teacherId, int limit){ - String queryTeacher = "SELECT * FROM teacher WHERE teacher_id = :tId"; - String queryReviews = "SELECT * FROM review WHERE teacher_id = :tId LIMIT :limit"; - Teacher teacher = jdbcTemplate.queryForObject(queryTeacher, Map.of("tId", teacherId), teacherRowMapper); - jdbcTemplate.query(queryReviews, Map.of("tId", teacherId, "limit", limit), reviewRowMapper).forEach(review -> teacher.addReview(review)); - return teacher; - } - - @Override - public Teacher fetchTeacherByFullNameWithReviews(String firstName, String lastName){ - String queryTeacher = "SELECT * FROM teacher WHERE full_name LIKE :fn AND full_name LIKE :ln"; - //String queryTeacher = "SELECT * FROM teacher WHERE first_name = :fn AND last_name = :ln"; - String queryReviews = "SELECT * FROM review WHERE teacher_id = :tId"; - Teacher teacher = jdbcTemplate.queryForObject(queryTeacher, Map.of("fn", "%" + firstName + "%", "ln", "%" + lastName + "%"), teacherRowMapper); - jdbcTemplate.query(queryReviews, Map.of("tId", teacher.getId()), reviewRowMapper).forEach(review -> teacher.addReview(review)); - return teacher; - } - - @Override - public Teacher fetchTeacherByFullNameWithLimitedReviews(String firstName, String lastName, int limit){ - String queryTeacher = "SELECT * FROM teacher WHERE full_name LIKE :fn AND full_name LIKE :ln"; - // String queryTeacher = "SELECT * FROM teacher WHERE first_name = :fn AND last_name = :ln"; - String queryReviews = "SELECT * FROM review WHERE teacher_id = :tId LIMIT :limit"; - Teacher teacher = jdbcTemplate.queryForObject(queryTeacher, Map.of("fn", "%" + firstName + "%", "ln", "%" + lastName + "%"), teacherRowMapper); - jdbcTemplate.query(queryReviews, Map.of("tId", teacher.getId(), "limit", limit), reviewRowMapper).forEach(review -> teacher.addReview(review)); - return teacher; - } - - @Override - public List getTeachersByCategory(String category) { - String query = "SELECT * FROM teacher WHERE category = :cat"; - List teachers = jdbcTemplate.query(query, Map.of("cat", category), teacherRowMapper); - return teachers; - } - - @Override - public List getTeachersRankedByCategory(String category, boolean isAscending) { - String query = isAscending ? "SELECT * FROM teacher WHERE category = :cat ORDER BY average_rating ASC" - : "SELECT * FROM teacher WHERE category = :cat ORDER BY average_rating DESC"; - - List teachers = jdbcTemplate.query(query, Map.of("cat", category), teacherRowMapper); - return teachers; - } - - @Override - public List getTeachersRankedByCategoryLimited(String category, int limit, boolean isAscending) { - String query = isAscending ? "SELECT * FROM teacher WHERE category = :cat ORDER BY average_rating ASC LIMIT :limit" - : "SELECT * FROM teacher WHERE category = :cat ORDER BY average_rating DESC LIMIT :limit"; - List teachers = jdbcTemplate.query(query, Map.of("cat", category, "limit", limit), teacherRowMapper); - return teachers; - } - -} diff --git a/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java b/src/main/java/dev/wms/pwrapi/dao/forum/ReviewRepository.java similarity index 72% rename from src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java rename to src/main/java/dev/wms/pwrapi/dao/forum/ReviewRepository.java index e3352aa..5711943 100644 --- a/src/main/java/dev/wms/pwrapi/repository/ReviewRepository.java +++ b/src/main/java/dev/wms/pwrapi/dao/forum/ReviewRepository.java @@ -1,7 +1,7 @@ -package dev.wms.pwrapi.repository; +package dev.wms.pwrapi.dao.forum; -import dev.wms.pwrapi.entity.forum.Review_r; -import dev.wms.pwrapi.entity.forum.Teacher_r; +import dev.wms.pwrapi.entity.forum.Review; +import dev.wms.pwrapi.entity.forum.Teacher; import org.springframework.data.jdbc.repository.query.Query; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.query.Param; @@ -9,7 +9,7 @@ import java.util.Optional; import java.util.Set; -public interface ReviewRepository extends PagingAndSortingRepository { +public interface ReviewRepository extends PagingAndSortingRepository { @Query("SELECT COUNT(*) FROM review") Long getTotalNumberOfReviews(); @@ -18,21 +18,21 @@ public interface ReviewRepository extends PagingAndSortingRepository getReviewWithoutTeacherById(@Param("reviewId") Long reviewId); + Optional getReviewWithoutTeacherById(@Param("reviewId") Long reviewId); @Query("SELECT teacher_id AS 'id', category, academic_title, full_name, average_rating AS 'average' " + "FROM teacher t " + "WHERE t.teacher_id = (SELECT teacher_id FROM review r WHERE r.review_id = :reviewId)") - Teacher_r getReviewRecipient(@Param("reviewId") Long reviewId); + Teacher getReviewRecipient(@Param("reviewId") Long reviewId); @Query("SELECT review_id AS 'id', course_name, given_rating, title, review, reviewer, post_date " + "FROM review r " + "WHERE r.teacher_id = :teacherId") - Set getTeacherReviews(@Param("teacherId") Long teacherId); + Set getTeacherReviews(@Param("teacherId") Long teacherId); @Query("SELECT review_id AS 'id', course_name, given_rating, title, review, reviewer, post_date " + "FROM review r " + "WHERE r.teacher_id = :teacherId " + "LIMIT :limit") - Set getTeacherReviewsLimited(@Param("teacherId") Long teacherId, @Param("limit") Long limit); + Set getTeacherReviewsLimited(@Param("teacherId") Long teacherId, @Param("limit") Long limit); } \ No newline at end of file diff --git a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java b/src/main/java/dev/wms/pwrapi/dao/forum/TeacherRepository.java similarity index 96% rename from src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java rename to src/main/java/dev/wms/pwrapi/dao/forum/TeacherRepository.java index c4ed1c8..2a74701 100644 --- a/src/main/java/dev/wms/pwrapi/repository/TeacherRepository.java +++ b/src/main/java/dev/wms/pwrapi/dao/forum/TeacherRepository.java @@ -1,7 +1,7 @@ -package dev.wms.pwrapi.repository; +package dev.wms.pwrapi.dao.forum; import dev.wms.pwrapi.entity.forum.TeacherInfoDTO; -import dev.wms.pwrapi.entity.forum.Teacher_r; +import dev.wms.pwrapi.entity.forum.Teacher; import org.springframework.data.jdbc.repository.query.Query; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.query.Param; @@ -9,7 +9,7 @@ import java.util.Optional; import java.util.Set; -public interface TeacherRepository extends PagingAndSortingRepository { +public interface TeacherRepository extends PagingAndSortingRepository { @Query("SELECT COUNT(*) FROM teacher") Long getTotalNumberOfTeachers(); diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/Review.java b/src/main/java/dev/wms/pwrapi/entity/forum/Review.java index 94bba23..a480426 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/Review.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/Review.java @@ -1,85 +1,23 @@ package dev.wms.pwrapi.entity.forum; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import org.springframework.data.annotation.Id; -// review won't exist without teacher -@JsonInclude(JsonInclude.Include.NON_EMPTY) -public class Review { +import java.time.LocalDateTime; - private int id; +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Review { + @Id + private Long id; private String courseName; - private double givenRating; + private Double givenRating; private String title; private String review; private String reviewer; - private String postDate; + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") + private LocalDateTime postDate; private Teacher teacher; - - public Review(){ - - } - - public Teacher getTeacher() { - return teacher; - } - - public void setTeacher(Teacher teacher) { - this.teacher = teacher; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getCourseName() { - return courseName; - } - - public void setCourseName(String courseName) { - this.courseName = courseName; - } - - public double getGivenRating() { - return givenRating; - } - - public void setGivenRating(double givenRating) { - this.givenRating = givenRating; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getReview() { - return review; - } - - public void setReview(String review) { - this.review = review; - } - - public String getReviewer() { - return reviewer; - } - - public void setReviewer(String reviewer) { - this.reviewer = reviewer; - } - - public String getPostDate() { - return postDate; - } - - public void setPostDate(String postDate) { - this.postDate = postDate; - } } diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java b/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java deleted file mode 100644 index ff569b8..0000000 --- a/src/main/java/dev/wms/pwrapi/entity/forum/Review_r.java +++ /dev/null @@ -1,23 +0,0 @@ -package dev.wms.pwrapi.entity.forum; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.Data; -import org.springframework.data.annotation.Id; - -import java.time.LocalDateTime; - -@Data -@JsonInclude(JsonInclude.Include.NON_NULL) -public class Review_r { - @Id - private Long id; - private String courseName; - private Double givenRating; - private String title; - private String review; - private String reviewer; - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") - private LocalDateTime postDate; - private Teacher_r teacher; -} diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/Teacher.java b/src/main/java/dev/wms/pwrapi/entity/forum/Teacher.java index 20d992e..cfee927 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/Teacher.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/Teacher.java @@ -1,82 +1,14 @@ package dev.wms.pwrapi.entity.forum; -import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import org.springframework.data.annotation.Id; -import java.util.ArrayList; -import java.util.List; - -@JsonInclude(JsonInclude.Include.NON_EMPTY) +@Data public class Teacher { - - private int id; + @Id + private Long id; private String category; private String academicTitle; private String fullName; - private double average; - private List reviews; - - public Teacher(){ - this.reviews = new ArrayList<>(); - } - - public Teacher(int id, String category, String academicTitle, String fullName, double average) { - this.id = id; - this.category = category; - this.academicTitle = academicTitle; - this.fullName = fullName; - this.average = average; - this.reviews = new ArrayList<>(); - } - - public void addReview(Review review){ - reviews.add(review); - } - - public List getReviews() { - return reviews; - } - - public void setReviews(ArrayList reviews) { - this.reviews = reviews; - } - - public String getCategory() { - return category; - } - - public void setCategory(String category) { - this.category = category; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getAcademicTitle() { - return academicTitle; - } - - public void setAcademicTitle(String academicTitle) { - this.academicTitle = academicTitle; - } - - public String getFullName() { - return fullName; - } - - public void setFullName(String fullName) { - this.fullName = fullName; - } - - public double getAverage() { - return average; - } - - public void setAverage(double average) { - this.average = average; - } + private float average; } diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java index 7ab6455..fffc096 100644 --- a/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java +++ b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java @@ -17,5 +17,5 @@ public class TeacherWithReviewsDTO { private String academicTitle; private String fullName; private float average; - private Set reviews; + private Set reviews; } diff --git a/src/main/java/dev/wms/pwrapi/entity/forum/Teacher_r.java b/src/main/java/dev/wms/pwrapi/entity/forum/Teacher_r.java deleted file mode 100644 index ecce079..0000000 --- a/src/main/java/dev/wms/pwrapi/entity/forum/Teacher_r.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.wms.pwrapi.entity.forum; - -import lombok.Data; -import org.springframework.data.annotation.Id; - -@Data -public class Teacher_r { - @Id - private Long id; - private String category; - private String academicTitle; - private String fullName; - private float average; -} diff --git a/src/main/java/dev/wms/pwrapi/service/forum/ForumService.java b/src/main/java/dev/wms/pwrapi/service/forum/ForumService.java deleted file mode 100644 index 8b60357..0000000 --- a/src/main/java/dev/wms/pwrapi/service/forum/ForumService.java +++ /dev/null @@ -1,24 +0,0 @@ -package dev.wms.pwrapi.service.forum; - -import com.fasterxml.jackson.core.JsonProcessingException; -import dev.wms.pwrapi.entity.forum.Review; -import dev.wms.pwrapi.entity.forum.Teacher; -import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO; - -import java.util.List; - -public interface ForumService { - DatabaseMetadataDTO getDatabaseMetadata() throws JsonProcessingException; - DatabaseMetadataDTO getTotalReviews() throws JsonProcessingException; - Review getReviewById(int id) throws JsonProcessingException; - DatabaseMetadataDTO getTotalTeachers() throws JsonProcessingException; - Teacher fetchLimitedTeacherReviewsById(int teacherId, int limit) throws JsonProcessingException; - Teacher fetchLimitedTeacherReviewsByFullName(String firstName, String lastName, int limit) throws JsonProcessingException; - List getTeachersByCategory(String category) throws JsonProcessingException; - List getBestTeachersRankedByCategory(String category) throws JsonProcessingException; - - List getWorstTeachersRankedByCategory(String category) throws JsonProcessingException; - - List getBestRankedTeachersByCategoryLimited(String category, int limit) throws JsonProcessingException; - List getWorstRankedTeachersByCategoryLimited(String category, int limit) throws JsonProcessingException; -} diff --git a/src/main/java/dev/wms/pwrapi/service/forum/ForumServiceImpl.java b/src/main/java/dev/wms/pwrapi/service/forum/ForumServiceImpl.java index f7625d5..e87150c 100644 --- a/src/main/java/dev/wms/pwrapi/service/forum/ForumServiceImpl.java +++ b/src/main/java/dev/wms/pwrapi/service/forum/ForumServiceImpl.java @@ -1,100 +1,164 @@ package dev.wms.pwrapi.service.forum; -import com.fasterxml.jackson.core.JsonProcessingException; -import dev.wms.pwrapi.dao.forum.ForumDAO; -import dev.wms.pwrapi.dao.forum.ForumDAOImpl; -import dev.wms.pwrapi.entity.forum.Review; -import dev.wms.pwrapi.entity.forum.Teacher; +import dev.wms.pwrapi.entity.forum.*; +import dev.wms.pwrapi.dao.forum.DatabaseMetadataRepository; +import dev.wms.pwrapi.dao.forum.ReviewRepository; +import dev.wms.pwrapi.dao.forum.TeacherRepository; + +import static dev.wms.pwrapi.utils.forum.consts.Category.*; + import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO; -import org.springframework.beans.factory.annotation.Autowired; +import dev.wms.pwrapi.utils.forum.exceptions.CategoryMembersNotFoundException; +import dev.wms.pwrapi.utils.forum.exceptions.ReviewNotFoundException; +import dev.wms.pwrapi.utils.forum.exceptions.TeacherNotFoundByFullNameException; +import dev.wms.pwrapi.utils.forum.exceptions.TeacherNotFoundException; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.util.List; + +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; @Service -public class ForumServiceImpl implements ForumService { +@AllArgsConstructor +@Slf4j +public class ForumServiceImpl { + + private final DatabaseMetadataRepository databaseMetadataRepository; + private final ReviewRepository reviewRepository; + private final TeacherRepository teacherRepository; + private final Long WORST_AND_BEST_TEACHERS_REVIEW_LIMIT = 3L; + private final Set categories = + Set.of( + MATEMATYCY.name(), FIZYCY.name(), INFORMATYCY.name(), CHEMICY.name(), ELEKTRONICY.name(), + JEZYKOWCY.name(), SPORTOWCY.name(), HUMANISCI.name(), INNI.name() + ); - private final ForumDAO forumDAO; + public DatabaseMetadataDTO getDatabaseMetadata() { + return databaseMetadataRepository.getDatabaseMetadata(); + } - @Autowired - public ForumServiceImpl(ForumDAOImpl forumDAOImpl){ - this.forumDAO = forumDAOImpl; + public DatabaseMetadataDTO getTotalReviews() { + return DatabaseMetadataDTO.builder() + .totalReviews(reviewRepository.getTotalNumberOfReviews()) + .build(); } + public Review getReviewById(Long reviewId) { + Optional review = reviewRepository.getReviewWithoutTeacherById(reviewId); + review.ifPresentOrElse( + r -> r.setTeacher(reviewRepository.getReviewRecipient(reviewId)), + () -> { + throw new ReviewNotFoundException(reviewId); + }); + return review.get(); + } - @Override - public DatabaseMetadataDTO getDatabaseMetadata() { - int totalTeachers = forumDAO.getNumberOfTeachers(); - int totalReviews = forumDAO.getNumberOfReviews(); - String latestRefreshDate = forumDAO.getLastRefreshDate(); - DatabaseMetadataDTO databaseMetadataDTO = new DatabaseMetadataDTO(totalTeachers, totalReviews, latestRefreshDate); - return databaseMetadataDTO; + public DatabaseMetadataDTO getTotalTeachers() { + return DatabaseMetadataDTO.builder() + .totalTeachers(teacherRepository.getTotalNumberOfTeachers()) + .build(); } - @Override - public DatabaseMetadataDTO getTotalReviews() { - int totalReviews = forumDAO.getNumberOfReviews(); - DatabaseMetadataDTO databaseMetadataDTO = new DatabaseMetadataDTO(); - databaseMetadataDTO.setTotalReviews(totalReviews); - return databaseMetadataDTO; + public TeacherWithReviewsDTO getTeacherWithAllReviewsById(Long teacherId){ + return teacherRepository.getTeacherInfo(teacherId) + .map(t -> { + return TeacherWithReviewsDTO.builder() + .id(t.getId()) + .category(t.getCategory()) + .academicTitle(t.getAcademicTitle()) + .fullName(t.getFullName()) + .average(t.getAverage()) + .reviews(reviewRepository.getTeacherReviews(t.getId())) + .build(); + }) + .orElseThrow(() -> new TeacherNotFoundException(teacherId)); } - @Override - public Review getReviewById(int id) { - Review review = forumDAO.findReviewById(id); - return review; + public TeacherWithReviewsDTO getTeacherWithLimitedReviewsById(Long teacherId, Long limit){ + return limit == - 1 + ? getTeacherWithAllReviewsById(teacherId) + : teacherRepository.getTeacherInfo(teacherId) + .map(t -> { + return TeacherWithReviewsDTO.builder() + .id(t.getId()) + .category(t.getCategory()) + .academicTitle(t.getAcademicTitle()) + .fullName(t.getFullName()) + .average(t.getAverage()) + .reviews(reviewRepository.getTeacherReviewsLimited(teacherId, limit)) + .build(); + }) + .orElseThrow(() -> new TeacherNotFoundException(teacherId)); } - @Override - public DatabaseMetadataDTO getTotalTeachers() { - int totalTeachers = forumDAO.getNumberOfTeachers(); - DatabaseMetadataDTO databaseMetadataDTO = new DatabaseMetadataDTO(); - databaseMetadataDTO.setTotalTeachers(totalTeachers); - return databaseMetadataDTO; + public TeacherWithReviewsDTO getTeacherWithLimitedReviewsByFullName(String firstName, String lastName, Long limit){ + Long teacherId = getTeacherIdByFullName(firstName, lastName); + return getTeacherWithLimitedReviewsById(teacherId, limit); } - @Override - public Teacher fetchLimitedTeacherReviewsById(int teacherId, int limit) { - if(limit == -1) { - Teacher teacher = forumDAO.fetchTeacherByIdWithReviews(teacherId); - return teacher; + private Long getTeacherIdByFullName(String firstName, String lastName){ + Optional teacherId = teacherRepository.getTeacherIdByFullName("%" + firstName + "%", "%" + lastName + "%"); + if(teacherId.isEmpty()){ + throw new TeacherNotFoundByFullNameException(firstName, lastName); } - Teacher teacher = forumDAO.fetchTeacherByIdWithLimitedReviews(teacherId, limit); - return teacher; + return teacherId.get(); } - @Override - public Teacher fetchLimitedTeacherReviewsByFullName(String firstName, String lastName, int limit) { - if(limit == -1){ - Teacher teacher = forumDAO.fetchTeacherByFullNameWithReviews(firstName, lastName); - return teacher; - } - Teacher teacher = forumDAO.fetchTeacherByFullNameWithLimitedReviews(firstName, lastName, limit); - return teacher; + public Set getTeachersInfoByCategory(String category){ + checkIfCategoryExists(category); + return teacherRepository.getTeachersInfoByCategory(category); } - @Override - public List getTeachersByCategory(String category) { - return forumDAO.getTeachersByCategory(category); + public Set getBestTeachersOfCategory(String category){ + checkIfCategoryExists(category); + return teacherRepository.getBestTeachersOfCategory(category); + } + + private void checkIfCategoryExists(String category){ + if(!categories.contains(category.toUpperCase())){ + throw new CategoryMembersNotFoundException(category); + } } - @Override - public List getBestTeachersRankedByCategory(String category) { - return forumDAO.getTeachersRankedByCategory(category, false); + public Set getLimitedBestTeachersOfCategoryWithExampleReviews(String category, int limit){ + checkIfCategoryExists(category); + return getBestTeachersInfoByCategoryLimited(category, limit).stream() + .map(teacherInfo -> TeacherWithReviewsDTO.builder() + .id(teacherInfo.getId()) + .category(teacherInfo.getCategory()) + .academicTitle(teacherInfo.getAcademicTitle()) + .fullName(teacherInfo.getFullName()) + .average(teacherInfo.getAverage()) + .reviews(reviewRepository.getTeacherReviewsLimited(teacherInfo.getId(), + WORST_AND_BEST_TEACHERS_REVIEW_LIMIT)) + .build() + ) + .collect(Collectors.toSet()); } - @Override - public List getWorstTeachersRankedByCategory(String category) { - List teachers = forumDAO.getTeachersRankedByCategory(category, false); - return teachers; + private Set getBestTeachersInfoByCategoryLimited(String category, int limit){ + return teacherRepository.getBestTeachersOfCategoryLimited(category, limit); } - @Override - public List getBestRankedTeachersByCategoryLimited(String category, int limit) { - return forumDAO.fetchWorstOrBestTeachersByCategoryWithReviewsLimited(category, limit, 3, true); + public Set getLimitedWorstTeachersOfCategoryWithExampleReviews(String category, int limit){ + checkIfCategoryExists(category); + return getWorstTeachersInfoByCategoryLimited(category, limit).stream() + .map(teacherInfo -> TeacherWithReviewsDTO.builder() + .id(teacherInfo.getId()) + .category(teacherInfo.getCategory()) + .academicTitle(teacherInfo.getAcademicTitle()) + .fullName(teacherInfo.getFullName()) + .average(teacherInfo.getAverage()) + .reviews(reviewRepository.getTeacherReviewsLimited(teacherInfo.getId(), + WORST_AND_BEST_TEACHERS_REVIEW_LIMIT)) + .build() + ) + .collect(Collectors.toSet()); } - @Override - public List getWorstRankedTeachersByCategoryLimited(String category, int limit) { - return forumDAO.fetchWorstOrBestTeachersByCategoryWithReviewsLimited(category, limit, 3, false); + private Set getWorstTeachersInfoByCategoryLimited(String category, int limit){ + return teacherRepository.getWorstTeachersOfCategoryLimited(category, limit); } } diff --git a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java b/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java deleted file mode 100644 index 49836f1..0000000 --- a/src/main/java/dev/wms/pwrapi/service/forum/ForumService_r.java +++ /dev/null @@ -1,165 +0,0 @@ -package dev.wms.pwrapi.service.forum; - -import dev.wms.pwrapi.entity.forum.*; -import dev.wms.pwrapi.repository.DatabaseMetadataRepository; -import dev.wms.pwrapi.repository.ReviewRepository; -import dev.wms.pwrapi.repository.TeacherRepository; - -import static dev.wms.pwrapi.utils.forum.consts.Category.*; - -import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO_r; -import dev.wms.pwrapi.utils.forum.exceptions.CategoryMembersNotFoundException; -import dev.wms.pwrapi.utils.forum.exceptions.ReviewNotFoundException; -import dev.wms.pwrapi.utils.forum.exceptions.TeacherNotFoundByFullNameException; -import dev.wms.pwrapi.utils.forum.exceptions.TeacherNotFoundException; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -@Slf4j -public class ForumService_r { - - private final DatabaseMetadataRepository databaseMetadataRepository; - private final ReviewRepository reviewRepository; - private final TeacherRepository teacherRepository; - private final Long WORST_AND_BEST_TEACHERS_REVIEW_LIMIT = 3L; - private final Set categories = - Set.of( - MATEMATYCY.name(), FIZYCY.name(), INFORMATYCY.name(), CHEMICY.name(), ELEKTRONICY.name(), - JEZYKOWCY.name(), SPORTOWCY.name(), HUMANISCI.name(), INNI.name() - ); - - public DatabaseMetadataDTO_r getDatabaseMetadata() { - return databaseMetadataRepository.getDatabaseMetadata(); - } - - public DatabaseMetadataDTO_r getTotalReviews() { - return DatabaseMetadataDTO_r.builder() - .totalReviews(reviewRepository.getTotalNumberOfReviews()) - .build(); - } - - public Review_r getReviewById(Long reviewId) { - Optional review = reviewRepository.getReviewWithoutTeacherById(reviewId); - review.ifPresentOrElse( - r -> r.setTeacher(reviewRepository.getReviewRecipient(reviewId)), - () -> { - throw new ReviewNotFoundException(reviewId); - }); - return review.get(); - } - - public DatabaseMetadataDTO_r getTotalTeachers() { - return DatabaseMetadataDTO_r.builder() - .totalTeachers(teacherRepository.getTotalNumberOfTeachers()) - .build(); - } - - public TeacherWithReviewsDTO getTeacherWithAllReviewsById(Long teacherId){ - return teacherRepository.getTeacherInfo(teacherId) - .map(t -> { - return TeacherWithReviewsDTO.builder() - .id(t.getId()) - .category(t.getCategory()) - .academicTitle(t.getAcademicTitle()) - .fullName(t.getFullName()) - .average(t.getAverage()) - .reviews(reviewRepository.getTeacherReviews(t.getId())) - .build(); - }) - .orElseThrow(() -> new TeacherNotFoundException(teacherId)); - } - - public TeacherWithReviewsDTO getTeacherWithLimitedReviewsById(Long teacherId, Long limit){ - return limit == - 1 - ? getTeacherWithAllReviewsById(teacherId) - : teacherRepository.getTeacherInfo(teacherId) - .map(t -> { - return TeacherWithReviewsDTO.builder() - .id(t.getId()) - .category(t.getCategory()) - .academicTitle(t.getAcademicTitle()) - .fullName(t.getFullName()) - .average(t.getAverage()) - .reviews(reviewRepository.getTeacherReviewsLimited(teacherId, limit)) - .build(); - }) - .orElseThrow(() -> new TeacherNotFoundException(teacherId)); - } - - public TeacherWithReviewsDTO getTeacherWithLimitedReviewsByFullName(String firstName, String lastName, Long limit){ - Long teacherId = getTeacherIdByFullName(firstName, lastName); - return getTeacherWithLimitedReviewsById(teacherId, limit); - } - - // TODO -> work on LIKE - private Long getTeacherIdByFullName(String firstName, String lastName){ - Optional teacherId = teacherRepository.getTeacherIdByFullName("%" + firstName + "%", "%" + lastName + "%"); - if(teacherId.isEmpty()){ - throw new TeacherNotFoundByFullNameException(firstName, lastName); - } - return teacherId.get(); - } - - public Set getTeachersInfoByCategory(String category){ - checkIfCategoryExists(category); - return teacherRepository.getTeachersInfoByCategory(category); - } - - public Set getBestTeachersOfCategory(String category){ - checkIfCategoryExists(category); - return teacherRepository.getBestTeachersOfCategory(category); - } - - private void checkIfCategoryExists(String category){ - if(!categories.contains(category.toUpperCase())){ - throw new CategoryMembersNotFoundException(category); - } - } - - public Set getLimitedBestTeachersOfCategoryWithExampleReviews(String category, int limit){ - checkIfCategoryExists(category); - return getBestTeachersInfoByCategoryLimited(category, limit).stream() - .map(teacherInfo -> TeacherWithReviewsDTO.builder() - .id(teacherInfo.getId()) - .category(teacherInfo.getCategory()) - .academicTitle(teacherInfo.getAcademicTitle()) - .fullName(teacherInfo.getFullName()) - .average(teacherInfo.getAverage()) - .reviews(reviewRepository.getTeacherReviewsLimited(teacherInfo.getId(), - WORST_AND_BEST_TEACHERS_REVIEW_LIMIT)) - .build() - ) - .collect(Collectors.toSet()); - } - - private Set getBestTeachersInfoByCategoryLimited(String category, int limit){ - return teacherRepository.getBestTeachersOfCategoryLimited(category, limit); - } - - public Set getLimitedWorstTeachersOfCategoryWithExampleReviews(String category, int limit){ - checkIfCategoryExists(category); - return getWorstTeachersInfoByCategoryLimited(category, limit).stream() - .map(teacherInfo -> TeacherWithReviewsDTO.builder() - .id(teacherInfo.getId()) - .category(teacherInfo.getCategory()) - .academicTitle(teacherInfo.getAcademicTitle()) - .fullName(teacherInfo.getFullName()) - .average(teacherInfo.getAverage()) - .reviews(reviewRepository.getTeacherReviewsLimited(teacherInfo.getId(), - WORST_AND_BEST_TEACHERS_REVIEW_LIMIT)) - .build() - ) - .collect(Collectors.toSet()); - } - - private Set getWorstTeachersInfoByCategoryLimited(String category, int limit){ - return teacherRepository.getWorstTeachersOfCategoryLimited(category, limit); - } -} diff --git a/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO.java b/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO.java index 95ec4c5..fef31dd 100644 --- a/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO.java +++ b/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO.java @@ -1,17 +1,18 @@ package dev.wms.pwrapi.utils.forum.dto; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; -import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; @JsonInclude(JsonInclude.Include.NON_NULL) @Data -@NoArgsConstructor -@AllArgsConstructor +@Builder public class DatabaseMetadataDTO { - - private int totalTeachers; - private int totalReviews; - private String latestRefresh; -} + private Long totalTeachers; + private Long totalReviews; + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") + private LocalDateTime latestRefresh; +} \ No newline at end of file diff --git a/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO_r.java b/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO_r.java deleted file mode 100644 index ede445e..0000000 --- a/src/main/java/dev/wms/pwrapi/utils/forum/dto/DatabaseMetadataDTO_r.java +++ /dev/null @@ -1,20 +0,0 @@ -package dev.wms.pwrapi.utils.forum.dto; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -@JsonInclude(JsonInclude.Include.NON_NULL) -@Data -@Builder -public class DatabaseMetadataDTO_r { - private Long totalTeachers; - private Long totalReviews; - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") - private LocalDateTime latestRefresh; -} \ No newline at end of file diff --git a/src/main/java/dev/wms/pwrapi/utils/forum/rowMappers/ReviewRowMapper.java b/src/main/java/dev/wms/pwrapi/utils/forum/rowMappers/ReviewRowMapper.java deleted file mode 100644 index 75cbb41..0000000 --- a/src/main/java/dev/wms/pwrapi/utils/forum/rowMappers/ReviewRowMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package dev.wms.pwrapi.utils.forum.rowMappers; - -import dev.wms.pwrapi.entity.forum.Review; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; - -import java.sql.ResultSet; -import java.sql.SQLException; - -@Component -public class ReviewRowMapper implements RowMapper { - - @Override - public Review mapRow(ResultSet rs, int rowNum) throws SQLException { - Review review = new Review(); - - review.setId(rs.getInt("review_id")); - review.setCourseName(rs.getString("course_name")); - review.setGivenRating(rs.getDouble("given_rating")); - review.setTitle(rs.getString("title")); - review.setReview(rs.getString("review")); - review.setReviewer(rs.getString("reviewer")); - review.setPostDate(rs.getString("post_date")); - - return review; - } -} diff --git a/src/main/java/dev/wms/pwrapi/utils/forum/rowMappers/ReviewWithTeacherRowMapper.java b/src/main/java/dev/wms/pwrapi/utils/forum/rowMappers/ReviewWithTeacherRowMapper.java deleted file mode 100644 index 93b7d2a..0000000 --- a/src/main/java/dev/wms/pwrapi/utils/forum/rowMappers/ReviewWithTeacherRowMapper.java +++ /dev/null @@ -1,32 +0,0 @@ -package dev.wms.pwrapi.utils.forum.rowMappers; - -import dev.wms.pwrapi.entity.forum.Review; -import dev.wms.pwrapi.entity.forum.Teacher; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; - -import java.sql.ResultSet; -import java.sql.SQLException; - -@Component -public class ReviewWithTeacherRowMapper implements RowMapper { - - private TeacherRowMapper teacherRowMapper; - private ReviewRowMapper reviewRowMapper; - - @Autowired - public ReviewWithTeacherRowMapper(TeacherRowMapper teacherRowMapper, ReviewRowMapper reviewRowMapper){ - this.teacherRowMapper = teacherRowMapper; - this.reviewRowMapper = reviewRowMapper; - } - - @Override - public Review mapRow(ResultSet rs, int rowNum) throws SQLException { - Teacher teacher = teacherRowMapper.mapRow(rs, rowNum); - Review review = reviewRowMapper.mapRow(rs, rowNum); - - review.setTeacher(teacher); - return review; - } -} diff --git a/src/main/java/dev/wms/pwrapi/utils/forum/rowMappers/TeacherRowMapper.java b/src/main/java/dev/wms/pwrapi/utils/forum/rowMappers/TeacherRowMapper.java deleted file mode 100644 index 62eef34..0000000 --- a/src/main/java/dev/wms/pwrapi/utils/forum/rowMappers/TeacherRowMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package dev.wms.pwrapi.utils.forum.rowMappers; - -import dev.wms.pwrapi.entity.forum.Teacher; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; - -import java.sql.ResultSet; -import java.sql.SQLException; - -@Component -public class TeacherRowMapper implements RowMapper { - - @Override - public Teacher mapRow(ResultSet rs, int rowNum) throws SQLException { - Teacher teacher = new Teacher(); - - teacher.setId(rs.getInt("teacher_id")); - teacher.setCategory(rs.getString("category")); - teacher.setFullName(rs.getString("full_name")); - teacher.setAcademicTitle(rs.getString("academic_title")); - teacher.setAverage(rs.getDouble("average_rating")); - - return teacher; - } -} diff --git a/src/test/java/dev/wms/pwrapi/forum/ForumTests.java b/src/test/java/dev/wms/pwrapi/forum/ForumTests.java index 3d7d7af..785c20f 100644 --- a/src/test/java/dev/wms/pwrapi/forum/ForumTests.java +++ b/src/test/java/dev/wms/pwrapi/forum/ForumTests.java @@ -1,15 +1,6 @@ package dev.wms.pwrapi.forum; -import com.fasterxml.jackson.core.JsonProcessingException; -import dev.wms.pwrapi.entity.forum.Teacher; -import dev.wms.pwrapi.service.forum.ForumService; -import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpStatus; - -import static io.restassured.RestAssured.*; -import static org.hamcrest.Matchers.equalTo; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) public class ForumTests {