From 511aafaf6b951640f4ed164a4dd5ad41ba3efb2e Mon Sep 17 00:00:00 2001 From: sunninz Date: Sat, 13 Sep 2025 10:42:34 +0900 Subject: [PATCH 1/2] =?UTF-8?q?:sparkles:=20(#307)=20lectureId=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=20className=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lecture/controller/LectureController.java | 8 +++++++- .../dto/response/ClassNameResponseDTO.java | 15 +++++++++++++++ .../domain/lecture/service/LectureService.java | 3 +++ .../lecture/service/LectureServiceImpl.java | 13 +++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/org/example/backend/domain/lecture/dto/response/ClassNameResponseDTO.java diff --git a/backend/src/main/java/org/example/backend/domain/lecture/controller/LectureController.java b/backend/src/main/java/org/example/backend/domain/lecture/controller/LectureController.java index 76a1e231..cf53df4c 100644 --- a/backend/src/main/java/org/example/backend/domain/lecture/controller/LectureController.java +++ b/backend/src/main/java/org/example/backend/domain/lecture/controller/LectureController.java @@ -101,4 +101,10 @@ public ApiResponse getStudentLectures(@RequestPa return ApiResponse.onSuccess(result); } -} + // lecture id로 class id 조회 + @GetMapping("/classes/{lectureId}") + public ApiResponse getClassId(@PathVariable("lectureId") UUID lectureId) { + ClassNameResponseDTO result = lectureService.getClassId(lectureId); + return ApiResponse.onSuccess(result); + } +} \ No newline at end of file diff --git a/backend/src/main/java/org/example/backend/domain/lecture/dto/response/ClassNameResponseDTO.java b/backend/src/main/java/org/example/backend/domain/lecture/dto/response/ClassNameResponseDTO.java new file mode 100644 index 00000000..363bd7b3 --- /dev/null +++ b/backend/src/main/java/org/example/backend/domain/lecture/dto/response/ClassNameResponseDTO.java @@ -0,0 +1,15 @@ +package org.example.backend.domain.lecture.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ClassNameResponseDTO { + private String className; +} diff --git a/backend/src/main/java/org/example/backend/domain/lecture/service/LectureService.java b/backend/src/main/java/org/example/backend/domain/lecture/service/LectureService.java index a513b30d..b5203a51 100644 --- a/backend/src/main/java/org/example/backend/domain/lecture/service/LectureService.java +++ b/backend/src/main/java/org/example/backend/domain/lecture/service/LectureService.java @@ -1,6 +1,7 @@ package org.example.backend.domain.lecture.service; import org.example.backend.domain.lecture.dto.request.LectureRequestDTO; +import org.example.backend.domain.lecture.dto.response.ClassNameResponseDTO; import org.example.backend.domain.lecture.dto.response.LectureRecordingResponseDTO; import org.example.backend.domain.lecture.dto.response.LectureResponseDTO; import org.example.backend.domain.lecture.dto.response.TodayLectureResponseDTO; @@ -27,4 +28,6 @@ public interface LectureService { List mapNotes(UUID lectureId, List lectureNoteIds); List getClassListByProfessor(LocalDate date); + + ClassNameResponseDTO getClassId(UUID lectureId); } diff --git a/backend/src/main/java/org/example/backend/domain/lecture/service/LectureServiceImpl.java b/backend/src/main/java/org/example/backend/domain/lecture/service/LectureServiceImpl.java index 84333b6b..341b33ed 100644 --- a/backend/src/main/java/org/example/backend/domain/lecture/service/LectureServiceImpl.java +++ b/backend/src/main/java/org/example/backend/domain/lecture/service/LectureServiceImpl.java @@ -6,6 +6,7 @@ import org.example.backend.domain.classroom.repository.ClassroomRepository; import org.example.backend.domain.lecture.converter.LectureConverter; import org.example.backend.domain.lecture.dto.request.LectureRequestDTO; +import org.example.backend.domain.lecture.dto.response.ClassNameResponseDTO; import org.example.backend.domain.lecture.dto.response.LectureRecordingResponseDTO; import org.example.backend.domain.lecture.dto.response.LectureResponseDTO; import org.example.backend.domain.lecture.dto.response.TodayLectureResponseDTO; @@ -303,5 +304,17 @@ public void updateLectureSessions(UUID classId) { lectureRepository.saveAll(lectures); } + // 강의 id 기반 클래스 id 조회 + @Override + public ClassNameResponseDTO getClassId(UUID lectureId) { + // 1. 강의 조회 + Lecture lecture = lectureRepository.findById(lectureId) + .orElseThrow(() -> new LectureException(LectureErrorCode.LECTURE_NOT_FOUND)); + // 2. 클래스 조회 + Classroom classroom = lecture.getClassroom(); + return ClassNameResponseDTO.builder() + .className(classroom.getClassName()) + .build(); + } } From a3edde037bcda78a9475bd18f5f216afa2e91c4d Mon Sep 17 00:00:00 2001 From: Haemin Kim Date: Mon, 15 Sep 2025 10:35:09 +0900 Subject: [PATCH 2/2] =?UTF-8?q?:sparkles:=20(#309)=20=ED=95=99=EC=83=9D?= =?UTF-8?q?=EC=9A=A9=20=EA=B0=95=EC=9D=98=20=EC=A1=B0=ED=9A=8C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lecture/controller/LectureController.java | 7 ++ .../service/LectureStudentService.java | 3 + .../service/LectureStudentServiceImpl.java | 83 +++++++++++++++++-- .../quiz/repository/QuizRepository.java | 1 + 4 files changed, 85 insertions(+), 9 deletions(-) diff --git a/backend/src/main/java/org/example/backend/domain/lecture/controller/LectureController.java b/backend/src/main/java/org/example/backend/domain/lecture/controller/LectureController.java index cf53df4c..55586474 100644 --- a/backend/src/main/java/org/example/backend/domain/lecture/controller/LectureController.java +++ b/backend/src/main/java/org/example/backend/domain/lecture/controller/LectureController.java @@ -107,4 +107,11 @@ public ApiResponse getClassId(@PathVariable("lectureId") U ClassNameResponseDTO result = lectureService.getClassId(lectureId); return ApiResponse.onSuccess(result); } + + // 학생용 강의 조회 + @GetMapping("/student/{lectureId}") + public ApiResponse getStudnetLecture(@PathVariable("lectureId") UUID lectureId) { + LectureResponseDTO result = lectureStudentService.getLecture(lectureId); + return ApiResponse.onSuccess(result); + } } \ No newline at end of file diff --git a/backend/src/main/java/org/example/backend/domain/lecture/service/LectureStudentService.java b/backend/src/main/java/org/example/backend/domain/lecture/service/LectureStudentService.java index 5dfb0b9b..ac9108ca 100644 --- a/backend/src/main/java/org/example/backend/domain/lecture/service/LectureStudentService.java +++ b/backend/src/main/java/org/example/backend/domain/lecture/service/LectureStudentService.java @@ -1,10 +1,13 @@ package org.example.backend.domain.lecture.service; +import org.example.backend.domain.lecture.dto.response.LectureResponseDTO; import org.example.backend.domain.lecture.dto.response.StudentTodayLectureResponseDTO; import java.time.LocalDate; +import java.util.UUID; public interface LectureStudentService { StudentTodayLectureResponseDTO getClassListByStudent(LocalDate date); + LectureResponseDTO getLecture(UUID lectureId); } diff --git a/backend/src/main/java/org/example/backend/domain/lecture/service/LectureStudentServiceImpl.java b/backend/src/main/java/org/example/backend/domain/lecture/service/LectureStudentServiceImpl.java index 15251a7f..855bafce 100644 --- a/backend/src/main/java/org/example/backend/domain/lecture/service/LectureStudentServiceImpl.java +++ b/backend/src/main/java/org/example/backend/domain/lecture/service/LectureStudentServiceImpl.java @@ -4,23 +4,27 @@ import org.example.backend.domain.classroom.entity.Classroom; import org.example.backend.domain.classroom.repository.ClassroomRepository; import org.example.backend.domain.lecture.converter.LectureStudentConverter; +import org.example.backend.domain.lecture.dto.response.LectureResponseDTO; import org.example.backend.domain.lecture.dto.response.StudentTodayLectureResponseDTO; import org.example.backend.domain.lecture.entity.Lecture; +import org.example.backend.domain.lecture.exception.LectureErrorCode; +import org.example.backend.domain.lecture.exception.LectureException; import org.example.backend.domain.lecture.repository.LectureRepository; +import org.example.backend.domain.quiz.entity.Quiz; +import org.example.backend.domain.quiz.exception.QuizErrorCode; +import org.example.backend.domain.quiz.exception.QuizException; +import org.example.backend.domain.quiz.repository.QuizRepository; +import org.example.backend.domain.quizAnswer.repository.QuizAnswerRepository; import org.example.backend.domain.studentClass.repository.StudentClassRepository; +import org.example.backend.domain.user.entity.Role; +import org.example.backend.global.security.auth.CustomSecurityUtil; import org.example.backend.global.security.auth.CustomUserDetails; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; -import java.time.LocalDate; -import java.time.LocalTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.UUID; -import java.util.Collections; +import java.time.*; +import java.time.format.TextStyle; +import java.util.*; @Service @RequiredArgsConstructor @@ -30,6 +34,9 @@ public class LectureStudentServiceImpl implements LectureStudentService { private final LectureRepository lectureRepository; private final ClassroomRepository classroomRepository; private final LectureStudentConverter lectureStudentConverter; + private final QuizRepository quizRepository; + private final QuizAnswerRepository quizAnswerRepository; + private final CustomSecurityUtil customSecurityUtil; // 오늘의 강의 목록 @Override @@ -70,4 +77,62 @@ public StudentTodayLectureResponseDTO getClassListByStudent(LocalDate date) { return lectureStudentConverter.toStudentLectureListDTO(dtoList, done); } + + // lecture 조회 + @Override + public LectureResponseDTO getLecture(UUID lectureId) { + + Lecture lecture = lectureRepository.findById(lectureId) + .orElseThrow(() -> new LectureException(LectureErrorCode.LECTURE_NOT_FOUND)); + + UUID userId = customSecurityUtil.getUserId(); + + // 서울 시간 기준 now + ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Seoul")); + + ZonedDateTime startDateTime = ZonedDateTime.of( + LocalDateTime.of(lecture.getLectureDate(), lecture.getStartTime()), + ZoneId.of("Asia/Seoul") + ); + + ZonedDateTime endDateTime = ZonedDateTime.of( + LocalDateTime.of(lecture.getLectureDate(), lecture.getEndTime()), + ZoneId.of("Asia/Seoul") + ); + + String status; + + if (now.isBefore(startDateTime)) { + status = "beforeLecture"; + } else if (!now.isBefore(startDateTime) && now.isBefore(endDateTime)) { + status = "onLecture"; + } else { + boolean hasQuiz = quizRepository.existsByLectureId(lecture.getId()); + if (!hasQuiz) { + status = "afterLectureBeforeQuiz"; + } else{ + List quizzes = quizRepository.findByLectureId(lecture.getId()); + + boolean allSubmitted = quizzes.stream() + .allMatch(q -> quizAnswerRepository.existsByUserIdAndQuizId(userId, q.getId())); + status = allSubmitted ? "viewMyQuizResult" : "quizReadyForSubmission"; + } + } + + String weekDay = lecture.getLectureDate() + .getDayOfWeek() + .getDisplayName(TextStyle.SHORT, Locale.KOREAN); + + return LectureResponseDTO.builder() + .lectureId(lecture.getId()) + .classId(lecture.getClassroom().getId().toString()) + .lectureName(lecture.getLectureName()) + .lectureDate(lecture.getLectureDate()) + .weekDay(weekDay) + .session(lecture.getSession()) + .startTime(lecture.getStartTime()) + .endTime(lecture.getEndTime()) + .status(status) + .build(); + } } diff --git a/backend/src/main/java/org/example/backend/domain/quiz/repository/QuizRepository.java b/backend/src/main/java/org/example/backend/domain/quiz/repository/QuizRepository.java index b12365f8..3e283187 100644 --- a/backend/src/main/java/org/example/backend/domain/quiz/repository/QuizRepository.java +++ b/backend/src/main/java/org/example/backend/domain/quiz/repository/QuizRepository.java @@ -11,4 +11,5 @@ public interface QuizRepository extends JpaRepository { List findByLectureId(UUID lectureId); Optional findByLectureIdAndQuizOrder(UUID lectureId, int quizOrder); boolean existsByLectureId(UUID lectureId); + }