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.java b/src/main/java/dev/wms/pwrapi/api/ForumAPI.java index a27377e..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(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/dao/forum/DatabaseMetadataRepository.java b/src/main/java/dev/wms/pwrapi/dao/forum/DatabaseMetadataRepository.java new file mode 100644 index 0000000..9aab639 --- /dev/null +++ b/src/main/java/dev/wms/pwrapi/dao/forum/DatabaseMetadataRepository.java @@ -0,0 +1,12 @@ +package dev.wms.pwrapi.dao.forum; + +import dev.wms.pwrapi.utils.forum.dto.DatabaseMetadataDTO; +import org.springframework.data.jdbc.repository.query.Query; +import org.springframework.data.repository.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 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/dao/forum/ReviewRepository.java b/src/main/java/dev/wms/pwrapi/dao/forum/ReviewRepository.java new file mode 100644 index 0000000..5711943 --- /dev/null +++ b/src/main/java/dev/wms/pwrapi/dao/forum/ReviewRepository.java @@ -0,0 +1,38 @@ +package dev.wms.pwrapi.dao.forum; + +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; + +import java.util.Optional; +import java.util.Set; + +public interface ReviewRepository extends PagingAndSortingRepository { + + @Query("SELECT COUNT(*) FROM review") + Long getTotalNumberOfReviews(); + + @Query("SELECT review_id AS 'id', course_name AS 'course_name', given_rating AS 'given_rating', title AS 'title'," + + " review, reviewer, post_date AS 'post_date' " + + "FROM review r " + + "WHERE r.review_id = :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 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); + + @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); +} \ No newline at end of file diff --git a/src/main/java/dev/wms/pwrapi/dao/forum/TeacherRepository.java b/src/main/java/dev/wms/pwrapi/dao/forum/TeacherRepository.java new file mode 100644 index 0000000..2a74701 --- /dev/null +++ b/src/main/java/dev/wms/pwrapi/dao/forum/TeacherRepository.java @@ -0,0 +1,61 @@ +package dev.wms.pwrapi.dao.forum; + +import dev.wms.pwrapi.entity.forum.TeacherInfoDTO; +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; + +import java.util.Optional; +import java.util.Set; + +public interface TeacherRepository extends PagingAndSortingRepository { + @Query("SELECT COUNT(*) FROM teacher") + Long getTotalNumberOfTeachers(); + + @Query("SELECT teacher_id AS 'id', category, academic_title, full_name, average_rating AS 'average' " + + "FROM teacher t " + + "WHERE t.teacher_id = :teacherId") + Optional getTeacherInfo(@Param("teacherId") Long teacherId); + + @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 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 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") int limit); + + @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 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") int limit); + + @Query("SELECT teacher_id " + + "FROM teacher " + + "WHERE " + + "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/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/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/TeacherInfoDTO.java b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java new file mode 100644 index 0000000..639cc1f --- /dev/null +++ b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherInfoDTO.java @@ -0,0 +1,14 @@ +package dev.wms.pwrapi.entity.forum; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class TeacherInfoDTO { + private Long id; + private String category; + private String academicTitle; + private String fullName; + 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 new file mode 100644 index 0000000..fffc096 --- /dev/null +++ b/src/main/java/dev/wms/pwrapi/entity/forum/TeacherWithReviewsDTO.java @@ -0,0 +1,21 @@ +package dev.wms.pwrapi.entity.forum; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; +import org.springframework.data.annotation.Id; + +import java.util.Set; + +@Builder +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class TeacherWithReviewsDTO { + @Id + private Long id; + private String category; + private String academicTitle; + private String fullName; + private float average; + private Set reviews; +} 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 14984fe..25c4d8a 100644 --- a/src/main/java/dev/wms/pwrapi/service/forum/ForumServiceImpl.java +++ b/src/main/java/dev/wms/pwrapi/service/forum/ForumServiceImpl.java @@ -1,99 +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; -@Service -public class ForumServiceImpl implements ForumService { +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; - private final ForumDAO forumDAO; +@Service +@AllArgsConstructor +@Slf4j +public class ForumServiceImpl { - @Autowired - public ForumServiceImpl(ForumDAOImpl forumDAOImpl){ - this.forumDAO = forumDAOImpl; - } + 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() + ); - @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; + return databaseMetadataRepository.getDatabaseMetadata(); } - @Override public DatabaseMetadataDTO getTotalReviews() { - int totalReviews = forumDAO.getNumberOfReviews(); - DatabaseMetadataDTO databaseMetadataDTO = new DatabaseMetadataDTO(); - databaseMetadataDTO.setTotalReviews(totalReviews); - return databaseMetadataDTO; + return DatabaseMetadataDTO.builder() + .totalReviews(reviewRepository.getTotalNumberOfReviews()) + .build(); } - @Override - public Review getReviewById(int id) { - Review review = forumDAO.findReviewById(id); - return review; + 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 getTotalTeachers() { - int totalTeachers = forumDAO.getNumberOfTeachers(); - DatabaseMetadataDTO databaseMetadataDTO = new DatabaseMetadataDTO(); - databaseMetadataDTO.setTotalTeachers(totalTeachers); - return databaseMetadataDTO; + return DatabaseMetadataDTO.builder() + .totalTeachers(teacherRepository.getTotalNumberOfTeachers()) + .build(); } - @Override - public Teacher fetchLimitedTeacherReviewsById(int teacherId, int limit) { - if(limit == -1) { - Teacher teacher = forumDAO.fetchTeacherByIdWithReviews(teacherId); - return teacher; - } - Teacher teacher = forumDAO.fetchTeacherByIdWithLimitedReviews(teacherId, limit); - return teacher; + 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); } - @Override - public Teacher fetchLimitedTeacherReviewsByFullName(String firstName, String lastName, int limit) { - if(limit == -1){ - Teacher teacher = forumDAO.fetchTeacherByFullNameWithReviews(firstName, lastName); - 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.fetchTeacherByFullNameWithLimitedReviews(firstName, lastName, limit); - return teacher; + 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); } - @Override - public List getTeachersByCategory(String category) { - return forumDAO.getTeachersByCategory(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/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 { - - @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/main/resources/application.properties b/src/main/resources/application.properties index 820b4af..30dcf9e 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 +logging.level.org.springframework.jdbc.core = TRACE pwr-api.news.cacheTTL=900000 \ No newline at end of file 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 {