diff --git a/src/main/java/com/backend/elearning/domain/course/CourseRepository.java b/src/main/java/com/backend/elearning/domain/course/CourseRepository.java index 787a484..013a36c 100644 --- a/src/main/java/com/backend/elearning/domain/course/CourseRepository.java +++ b/src/main/java/com/backend/elearning/domain/course/CourseRepository.java @@ -246,14 +246,7 @@ List findByMultiQueryWithKeyword( @Param("categoryName") String categoryName, @Param("topicId") Integer topicId ); - @Modifying - @Query(""" - update - Course s - set s.status = :status, s.reasonRefused = :reason - where s.id = :id - """) - void updateStatusCourse(@Param("status") CourseStatus status, @Param("reason") String reason ,@Param("id") Long courseId); + diff --git a/src/main/java/com/backend/elearning/domain/course/CourseServiceImpl.java b/src/main/java/com/backend/elearning/domain/course/CourseServiceImpl.java index ee84e7d..db774d4 100644 --- a/src/main/java/com/backend/elearning/domain/course/CourseServiceImpl.java +++ b/src/main/java/com/backend/elearning/domain/course/CourseServiceImpl.java @@ -447,9 +447,13 @@ public void delete(Long id) { } @Override - @Transactional public void updateStatusCourse(CourseStatusPostVM courseStatusPostVM, Long courseId) { - courseRepository.updateStatusCourse(courseStatusPostVM.status(), courseStatusPostVM.reason(), courseId); + Course course = courseRepository.findById(courseId).orElseThrow(); + if (courseStatusPostVM.status().equals(CourseStatus.UNPUBLISHED) && courseStatusPostVM.reason() != null) { + course.setReasonRefused(courseStatusPostVM.reason()); + } + course.setStatus(courseStatusPostVM.status()); + courseRepository.saveAndFlush(course); } @Override diff --git a/src/main/java/com/backend/elearning/domain/course/CourseVM.java b/src/main/java/com/backend/elearning/domain/course/CourseVM.java index 6807f53..77a5fa4 100644 --- a/src/main/java/com/backend/elearning/domain/course/CourseVM.java +++ b/src/main/java/com/backend/elearning/domain/course/CourseVM.java @@ -36,7 +36,8 @@ public record CourseVM( List sections, UserProfileVM user, boolean learning, - String breadcrumb + String breadcrumb, + String reason ) { public static CourseVM fromModel (Course course, List sections, int ratingCount, @@ -60,6 +61,8 @@ public static CourseVM fromModel (Course course, List sections, int r DateTimeUtils.convertLocalDateTimeToString(course.getCreatedAt()) : ""; String updatedAt = course.getUpdatedAt() != null ? DateTimeUtils.convertLocalDateTimeToString(course.getUpdatedAt()) : ""; + String reason = course.getReasonRefused() != null ? + course.getReasonRefused() : ""; return new CourseVM(course.getId(), course.getTitle(), course.getHeadline(), course.getSlug(), course.getObjectives(), course.getRequirements(), course.getTargetAudiences(), course.getDescription(),level, @@ -79,6 +82,7 @@ public static CourseVM fromModel (Course course, List sections, int r createdBy, sections, userProfileVM, learning, - breadcrumb); + breadcrumb, + reason); } } diff --git a/src/main/java/com/backend/elearning/domain/order/Order.java b/src/main/java/com/backend/elearning/domain/order/Order.java index 1a6ffdf..8d042fe 100644 --- a/src/main/java/com/backend/elearning/domain/order/Order.java +++ b/src/main/java/com/backend/elearning/domain/order/Order.java @@ -36,6 +36,8 @@ public class Order { @Enumerated(EnumType.STRING) private EOrderStatus status; + private String reasonFailed; + @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) private List orderDetails = new ArrayList<>(); diff --git a/src/main/java/com/backend/elearning/domain/order/OrderController.java b/src/main/java/com/backend/elearning/domain/order/OrderController.java index c5dc728..0b8a2a5 100644 --- a/src/main/java/com/backend/elearning/domain/order/OrderController.java +++ b/src/main/java/com/backend/elearning/domain/order/OrderController.java @@ -32,10 +32,10 @@ public ResponseEntity createOrder(@RequestBody OrderPostDto orderPostDto) return ResponseEntity.ok().body(orderId); } - @PutMapping("/orders/{orderId}/status/{orderStatus}") + @PutMapping("/orders/{orderId}/status") public ResponseEntity createOrder( @PathVariable("orderId") Long orderId, - @PathVariable("orderStatus") String status + @PathVariable("orderStatus") OrderStatusPostVM status ) { orderService.updateOrderStatus(orderId, status); return ResponseEntity.noContent().build(); diff --git a/src/main/java/com/backend/elearning/domain/order/OrderService.java b/src/main/java/com/backend/elearning/domain/order/OrderService.java index fd1aeec..e74682e 100644 --- a/src/main/java/com/backend/elearning/domain/order/OrderService.java +++ b/src/main/java/com/backend/elearning/domain/order/OrderService.java @@ -10,6 +10,6 @@ public interface OrderService { List findAllByUserIdAndStatus(EOrderStatus status); - void updateOrderStatus(Long orderId, String orderStatus); + void updateOrderStatus(Long orderId, OrderStatusPostVM orderStatusPostVM); PageableData getPageableOrders(int pageNum, int pageSize, Long orderId); } diff --git a/src/main/java/com/backend/elearning/domain/order/OrderStatusPostVM.java b/src/main/java/com/backend/elearning/domain/order/OrderStatusPostVM.java new file mode 100644 index 0000000..c49f5ad --- /dev/null +++ b/src/main/java/com/backend/elearning/domain/order/OrderStatusPostVM.java @@ -0,0 +1,7 @@ +package com.backend.elearning.domain.order; + +public record OrderStatusPostVM ( + EOrderStatus status, + String reason +) { +} diff --git a/src/main/java/com/backend/elearning/domain/order/impl/OrderServiceImpl.java b/src/main/java/com/backend/elearning/domain/order/impl/OrderServiceImpl.java index faa0b79..21b25e8 100644 --- a/src/main/java/com/backend/elearning/domain/order/impl/OrderServiceImpl.java +++ b/src/main/java/com/backend/elearning/domain/order/impl/OrderServiceImpl.java @@ -8,7 +8,9 @@ import com.backend.elearning.domain.course.Course; import com.backend.elearning.domain.course.CourseGetVM; import com.backend.elearning.domain.course.CourseRepository; +import com.backend.elearning.domain.course.CourseStatus; import com.backend.elearning.domain.order.*; +import com.backend.elearning.domain.review.Review; import com.backend.elearning.domain.student.Student; import com.backend.elearning.domain.student.StudentRepository; import com.backend.elearning.domain.user.UserRepository; @@ -134,14 +136,18 @@ public List findAllByUserIdAndStatus(EOrderStatus status) { } @Override - @Transactional - public void updateOrderStatus(Long orderId, String orderStatus) { - EOrderStatus status = EOrderStatus.valueOf(orderStatus); - orderRepository.updateOrderStatus(orderId, status); + public void updateOrderStatus(Long orderId, OrderStatusPostVM orderStatusPostVM) { + Order order = orderRepository.findById(orderId).orElseThrow(); + if (orderStatusPostVM.status().equals(EOrderStatus.FAILURE) && orderStatusPostVM.reason() != null) { + order.setReasonFailed(orderStatusPostVM.reason()); + } + order.setStatus(orderStatusPostVM.status()); + orderRepository.saveAndFlush(order); } + @Override public PageableData getPageableOrders(int pageNum, int pageSize, Long keyword) { Pageable pageable = PageRequest.of(pageNum, pageSize); diff --git a/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureController.java b/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureController.java index 5816b43..fba01c5 100644 --- a/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureController.java +++ b/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureController.java @@ -57,7 +57,6 @@ public ResponseEntity delete ( } @GetMapping("/question-lecture/lectures/{lectureId}") - public ResponseEntity> getByLectureId ( @PathVariable("lectureId") Long lectureId ) { @@ -65,4 +64,20 @@ public ResponseEntity> getByLectureId ( return ResponseEntity.status(HttpStatus.OK).body(response); } + @GetMapping("/question-lecture/course/{courseId}") + public ResponseEntity> getByCourseId ( + @PathVariable("courseId") Long courseId + ) { + List response = questionLectureService.getByCourse(courseId); + return ResponseEntity.status(HttpStatus.OK).body(response); + } + + @GetMapping("/question-lecture/section/{sectionId}") + public ResponseEntity> getBySection ( + @PathVariable("sectionId") Long sectionId + ) { + List response = questionLectureService.getBySection(sectionId); + return ResponseEntity.status(HttpStatus.OK).body(response); + } + } diff --git a/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureRepo.java b/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureRepo.java index f701557..0031bdd 100644 --- a/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureRepo.java +++ b/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureRepo.java @@ -20,4 +20,27 @@ public interface QuestionLectureRepo extends JpaRepository getByLectureId(@Param("lectureId") Long lectureId); + + + @Query(""" + select ql + from QuestionLecture ql + join ql.lecture l + join ql.student s + join l.section se + join se.course c + where c.id = :courseId + """) + List getByCourse(@Param("courseId") Long courseId); + + + @Query(""" + select ql + from QuestionLecture ql + join ql.lecture l + join ql.student s + join l.section se + where se.id = :sectionId + """) + List getBySection(@Param("sectionId") Long sectionId); } diff --git a/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureService.java b/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureService.java index 37f403d..1998f9f 100644 --- a/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureService.java +++ b/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureService.java @@ -12,4 +12,8 @@ public interface QuestionLectureService { List getByLectureId(Long lectureId); + List getByCourse(Long courseId); + + List getBySection(Long sectionId); + } diff --git a/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureServiceImpl.java b/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureServiceImpl.java index f9a038f..978c15b 100644 --- a/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureServiceImpl.java +++ b/src/main/java/com/backend/elearning/domain/questionLecture/QuestionLectureServiceImpl.java @@ -85,6 +85,52 @@ public List getByLectureId(Long lectureId) { List answerLectures = new ArrayList<>(); + List userAnswers = userAnswerRepo.getByQuestionLectureId(questionLecture.getId()); + for (UserAnswer userAnswer : userAnswers) { + answerLectures.add(AnswerLecture.fromModelUser(userAnswer)); + } + List studentAnswers = studentAnswerRepo.getByQuestionLectureId(questionLecture.getId()); + for (StudentAnswer studentAnswer : studentAnswers) { + answerLectures.add(AnswerLecture.fromModelStudent(studentAnswer)); + } + answerLectures.sort(Comparator.comparing(AnswerLecture::createdAt)); + return QuestionLectureGetVM.fromModel(questionLecture, answerLectures); + }).toList(); + return questionLectureGetVMS; + } + + @Override + public List getByCourse(Long courseId) { + List questionLectures = questionLectureRepo.getByCourse(courseId); + + List questionLectureGetVMS = questionLectures.stream().map(questionLecture -> { + + List answerLectures = new ArrayList<>(); + + + List userAnswers = userAnswerRepo.getByQuestionLectureId(questionLecture.getId()); + for (UserAnswer userAnswer : userAnswers) { + answerLectures.add(AnswerLecture.fromModelUser(userAnswer)); + } + List studentAnswers = studentAnswerRepo.getByQuestionLectureId(questionLecture.getId()); + for (StudentAnswer studentAnswer : studentAnswers) { + answerLectures.add(AnswerLecture.fromModelStudent(studentAnswer)); + } + answerLectures.sort(Comparator.comparing(AnswerLecture::createdAt)); + return QuestionLectureGetVM.fromModel(questionLecture, answerLectures); + }).toList(); + return questionLectureGetVMS; + } + + @Override + public List getBySection(Long sectionId) { + List questionLectures = questionLectureRepo.getBySection(sectionId); + + List questionLectureGetVMS = questionLectures.stream().map(questionLecture -> { + + List answerLectures = new ArrayList<>(); + + List userAnswers = userAnswerRepo.getByQuestionLectureId(questionLecture.getId()); for (UserAnswer userAnswer : userAnswers) { answerLectures.add(AnswerLecture.fromModelUser(userAnswer)); diff --git a/src/main/java/com/backend/elearning/domain/review/Review.java b/src/main/java/com/backend/elearning/domain/review/Review.java index f365e0d..e60b391 100644 --- a/src/main/java/com/backend/elearning/domain/review/Review.java +++ b/src/main/java/com/backend/elearning/domain/review/Review.java @@ -24,6 +24,8 @@ public class Review { private int ratingStar; + private String reasonRefused; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "course_id") private Course course; diff --git a/src/main/java/com/backend/elearning/domain/review/ReviewController.java b/src/main/java/com/backend/elearning/domain/review/ReviewController.java index f2f8037..ebd0324 100644 --- a/src/main/java/com/backend/elearning/domain/review/ReviewController.java +++ b/src/main/java/com/backend/elearning/domain/review/ReviewController.java @@ -42,11 +42,12 @@ public ResponseEntity> getPageableCategory ( } -// @PutMapping("/admin/reviews/{id}/status/{status}") -// public ResponseEntity updateReview(@PathVariable("status") boolean status, @PathVariable("id") Long reviewId){ -// reviewService.updateStatusReview(status, reviewId); -// return ResponseEntity.noContent().build(); -// } + @PutMapping("/admin/reviews/{id}/status") + public ResponseEntity updateReview(@RequestBody ReviewStatusPostVM reviewStatusPostVM, @PathVariable("id") Long reviewId){ + reviewService.updateStatusReview(reviewStatusPostVM, reviewId); + return ResponseEntity.noContent().build(); + } + diff --git a/src/main/java/com/backend/elearning/domain/review/ReviewService.java b/src/main/java/com/backend/elearning/domain/review/ReviewService.java index 1c23b47..261099d 100644 --- a/src/main/java/com/backend/elearning/domain/review/ReviewService.java +++ b/src/main/java/com/backend/elearning/domain/review/ReviewService.java @@ -18,5 +18,5 @@ public interface ReviewService { PageableData getPageableReviews(int pageNum, int pageSize, String keyword); -// void updateStatusReview(boolean status, Long reviewId); + void updateStatusReview(ReviewStatusPostVM statusPostVM, Long reviewId); } diff --git a/src/main/java/com/backend/elearning/domain/review/ReviewServiceImpl.java b/src/main/java/com/backend/elearning/domain/review/ReviewServiceImpl.java index cd22dec..5e1e44e 100644 --- a/src/main/java/com/backend/elearning/domain/review/ReviewServiceImpl.java +++ b/src/main/java/com/backend/elearning/domain/review/ReviewServiceImpl.java @@ -3,6 +3,7 @@ import com.backend.elearning.domain.common.PageableData; import com.backend.elearning.domain.course.Course; import com.backend.elearning.domain.course.CourseRepository; +import com.backend.elearning.domain.course.CourseStatus; import com.backend.elearning.domain.student.Student; import com.backend.elearning.domain.student.StudentRepository; import com.backend.elearning.domain.user.User; @@ -147,9 +148,14 @@ public PageableData getPageableReviews(int pageNum, int pageSiz ); } -// @Override -// @Transactional -// public void updateStatusReview(boolean status, Long reviewId) { -// reviewRepository.updateStatusReview(status, reviewId); -// } + @Override + public void updateStatusReview(ReviewStatusPostVM statusPostVM, Long reviewId) { + Review review = reviewRepository.findById(reviewId).orElseThrow(); + if (statusPostVM.status().equals(ReviewStatus.UNPUBLISHED) && statusPostVM.reason() != null) { + review.setReasonRefused(statusPostVM.reason()); + } + review.setStatus(statusPostVM.status()); + reviewRepository.saveAndFlush(review); + } + } diff --git a/src/main/java/com/backend/elearning/domain/review/ReviewStatusPostVM.java b/src/main/java/com/backend/elearning/domain/review/ReviewStatusPostVM.java new file mode 100644 index 0000000..d04bfe8 --- /dev/null +++ b/src/main/java/com/backend/elearning/domain/review/ReviewStatusPostVM.java @@ -0,0 +1,7 @@ +package com.backend.elearning.domain.review; + +public record ReviewStatusPostVM( + ReviewStatus status, + String reason +) { +} diff --git a/src/main/java/com/backend/elearning/domain/statitic/StatisticController.java b/src/main/java/com/backend/elearning/domain/statitic/StatisticController.java index 6ca43ec..af0d077 100644 --- a/src/main/java/com/backend/elearning/domain/statitic/StatisticController.java +++ b/src/main/java/com/backend/elearning/domain/statitic/StatisticController.java @@ -47,19 +47,18 @@ public ResponseEntity> getStatisticProductByTime( } @PostMapping("/statistic/time/export") - public ResponseEntity exportData(@RequestParam("year") int year, - @RequestParam(value = "month", required = false) Integer month){ - byte[] datas = statisticService.export(year, month); - + public ResponseEntity exportByTime( + @RequestBody List request + ){ + byte[] datas = statisticService.export(request); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", "attachment; filename=statistics.xlsx"); return new ResponseEntity<>(datas, headers, HttpStatus.OK); } @PostMapping("/statistic/course/export") - public ResponseEntity exportData(@RequestParam("from") String from, - @RequestParam("to") String to){ - byte[] datas = statisticService.exportByCourse(from, to); + public ResponseEntity exportByCourse(@RequestBody List request){ + byte[] datas = statisticService.exportByCourse(request); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", "attachment; filename=statistics.xlsx"); return new ResponseEntity<>(datas, headers, HttpStatus.OK); diff --git a/src/main/java/com/backend/elearning/domain/statitic/StatisticService.java b/src/main/java/com/backend/elearning/domain/statitic/StatisticService.java index 2ed6aa3..7ecaf0d 100644 --- a/src/main/java/com/backend/elearning/domain/statitic/StatisticService.java +++ b/src/main/java/com/backend/elearning/domain/statitic/StatisticService.java @@ -163,17 +163,7 @@ private int extractNumber(String name) { return Integer.parseInt(numberString); // Convert the remaining string to an integer } - public byte[] export(int year, Integer month) { - List datas = new ArrayList<>(); - if (month != null) { - List statistics = findByMonth(month, year); - datas.addAll(statistics); - } else { - List statistics = findByYear(year); - datas.addAll(statistics); - } - - + public byte[] export(List datas) { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Statistics"); @@ -186,19 +176,25 @@ public byte[] export(int year, Integer month) { headerStyle.setFont(headerFont); Cell headerCell = headerRow.createCell(0); - headerCell.setCellValue("Name"); + headerCell.setCellValue("Stt"); headerCell.setCellStyle(headerStyle); headerCell = headerRow.createCell(1); + headerCell.setCellValue("Name"); + headerCell.setCellStyle(headerStyle); + + headerCell = headerRow.createCell(2); headerCell.setCellValue("Total"); headerCell.setCellStyle(headerStyle); // Populate Data Rows int rowIdx = 1; for (StatisticTime stat : datas) { - Row row = sheet.createRow(rowIdx++); - row.createCell(0).setCellValue(stat.getName()); - row.createCell(1).setCellValue(stat.getTotal()); + Row row = sheet.createRow(rowIdx); + row.createCell(0).setCellValue(rowIdx); + row.createCell(1).setCellValue(stat.getName()); + row.createCell(2).setCellValue(stat.getTotal()); + rowIdx++; } // Auto-size Columns @@ -218,8 +214,7 @@ public byte[] export(int year, Integer month) { } - public byte[] exportByCourse(String from, String to) { - List datas = getByTime(from, to); + public byte[] exportByCourse(List datas) { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Statistics"); @@ -231,25 +226,30 @@ public byte[] exportByCourse(String from, String to) { headerStyle.setFont(headerFont); Cell headerCell = headerRow.createCell(0); - headerCell.setCellValue("Name course"); + headerCell.setCellValue("Stt"); headerCell.setCellStyle(headerStyle); headerCell = headerRow.createCell(1); - headerCell.setCellValue("Quantity"); + headerCell.setCellValue("Name course"); headerCell.setCellStyle(headerStyle); headerCell = headerRow.createCell(2); + headerCell.setCellValue("Quantity"); + headerCell.setCellStyle(headerStyle); + + headerCell = headerRow.createCell(3); headerCell.setCellValue("Total"); headerCell.setCellStyle(headerStyle); // Populate Data Rows int rowIdx = 1; for (StatisticCourse stat : datas) { - Row row = sheet.createRow(rowIdx++); - row.createCell(0).setCellValue(stat.getCourse()); - row.createCell(1).setCellValue(stat.getQuantity()); - row.createCell(2).setCellValue(stat.getPrice()); - + Row row = sheet.createRow(rowIdx); + row.createCell(0).setCellValue(rowIdx); + row.createCell(1).setCellValue(stat.getCourse()); + row.createCell(2).setCellValue(stat.getQuantity()); + row.createCell(3).setCellValue(stat.getPrice()); + rowIdx++; } // Auto-size Columns diff --git a/src/main/java/com/backend/elearning/domain/user/UserGetVM.java b/src/main/java/com/backend/elearning/domain/user/UserGetVM.java index 25165ac..83e00df 100644 --- a/src/main/java/com/backend/elearning/domain/user/UserGetVM.java +++ b/src/main/java/com/backend/elearning/domain/user/UserGetVM.java @@ -7,13 +7,14 @@ public record UserGetVM( String firstName, String lastName, String email, - String photo + String photo, + String role ) { public static UserGetVM fromModel(User user) { - return new UserGetVM(user.getId(), user.getFirstName(), user.getLastName(), user.getEmail(), user.getPhoto()); + return new UserGetVM(user.getId(), user.getFirstName(), user.getLastName(), user.getEmail(), user.getPhoto(), user.getRole().name()); } public static UserGetVM fromModelStudent(Student student) { - return new UserGetVM(student.getId(), student.getFirstName(), student.getLastName(), student.getEmail(), student.getPhoto()); + return new UserGetVM(student.getId(), student.getFirstName(), student.getLastName(), student.getEmail(), student.getPhoto(), ERole.ROLE_STUDENT.name()); } }