diff --git a/src/main/java/classfit/example/classfit/category/domain/MainClass.java b/src/main/java/classfit/example/classfit/category/domain/MainClass.java index 318f13b5..cd2cfdfb 100644 --- a/src/main/java/classfit/example/classfit/category/domain/MainClass.java +++ b/src/main/java/classfit/example/classfit/category/domain/MainClass.java @@ -1,7 +1,7 @@ package classfit.example.classfit.category.domain; +import classfit.example.classfit.academy.domain.Academy; import classfit.example.classfit.common.domain.BaseEntity; -import classfit.example.classfit.member.domain.Member; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Getter; @@ -27,13 +27,13 @@ public class MainClass extends BaseEntity { private List subClasses = new ArrayList<>(); @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id", nullable = false) - private Member member; + @JoinColumn(name = "academy_id", nullable = false) + private Academy academy; - public MainClass(String mainClassName, Member member) { + public MainClass(String mainClassName, Academy academy) { this.mainClassName = mainClassName; - this.member = member; + this.academy = academy; } // 업데이트 관련 메서드 diff --git a/src/main/java/classfit/example/classfit/category/domain/SubClass.java b/src/main/java/classfit/example/classfit/category/domain/SubClass.java index fe1d22cb..52cf50b5 100644 --- a/src/main/java/classfit/example/classfit/category/domain/SubClass.java +++ b/src/main/java/classfit/example/classfit/category/domain/SubClass.java @@ -29,16 +29,12 @@ public class SubClass extends BaseEntity { @JoinColumn(name = "main_class_id", nullable = false) private MainClass mainClass; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id", nullable = false) - private Member member; @OneToMany(mappedBy = "subClass", cascade = CascadeType.ALL, orphanRemoval = true) private final List classStudents = new ArrayList<>(); - public SubClass(String subClassName, Member member, MainClass mainClass) { + public SubClass(String subClassName, MainClass mainClass) { this.subClassName = subClassName; - this.member = member; this.mainClass = mainClass; } diff --git a/src/main/java/classfit/example/classfit/category/repository/MainClassRepository.java b/src/main/java/classfit/example/classfit/category/repository/MainClassRepository.java index 63b9e08e..6d96666a 100644 --- a/src/main/java/classfit/example/classfit/category/repository/MainClassRepository.java +++ b/src/main/java/classfit/example/classfit/category/repository/MainClassRepository.java @@ -12,7 +12,8 @@ public interface MainClassRepository extends JpaRepository { List findAllByOrderByMainClassNameAsc(); - List findByMemberAcademy(Academy academy); + List findByAcademy(Academy academy); - boolean existsByMember_AcademyAndMainClassName(Academy academy, String mainClassName); + boolean existsByAcademyAndMainClassName(Academy academy, String mainClassName); } + diff --git a/src/main/java/classfit/example/classfit/category/repository/SubClassRepository.java b/src/main/java/classfit/example/classfit/category/repository/SubClassRepository.java index 066f86a9..6ec1f390 100644 --- a/src/main/java/classfit/example/classfit/category/repository/SubClassRepository.java +++ b/src/main/java/classfit/example/classfit/category/repository/SubClassRepository.java @@ -1,14 +1,21 @@ package classfit.example.classfit.category.repository; +import classfit.example.classfit.academy.domain.Academy; import classfit.example.classfit.category.domain.MainClass; import classfit.example.classfit.category.domain.SubClass; import classfit.example.classfit.member.domain.Member; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @Repository public interface SubClassRepository extends JpaRepository { - boolean existsByMemberAndSubClassNameAndMainClass(Member member, String subClassName, - MainClass mainClass); - + @Query("SELECT COUNT(s) > 0 FROM SubClass s " + + "WHERE s.mainClass = :mainClass " + + "AND s.subClassName = :subClassName " + + "AND s.mainClass.academy = :academy " + + "AND :member MEMBER OF s.mainClass.academy.members") + boolean existsByMemberAndSubClassNameAndAcademyAndMainClass( + Member member, Academy academy, String subClassName, MainClass mainClass); } + diff --git a/src/main/java/classfit/example/classfit/category/service/MainClassService.java b/src/main/java/classfit/example/classfit/category/service/MainClassService.java index be42df60..40b69200 100644 --- a/src/main/java/classfit/example/classfit/category/service/MainClassService.java +++ b/src/main/java/classfit/example/classfit/category/service/MainClassService.java @@ -26,7 +26,7 @@ public class MainClassService { private final MemberRepository memberRepository; private static void checkMemberRelationMainClass(Member findMember, MainClass findMainClass) { - if (!Objects.equals(findMember.getId(), findMainClass.getMember().getId())) { + if (!Objects.equals(findMember.getId(), findMainClass.getAcademy().getId())) { throw new ClassfitException("사용자와 클래스가 일치하지 않습니다.", HttpStatus.FORBIDDEN); } } @@ -37,13 +37,13 @@ public MainClassResponse addMainClass(@AuthMember Member findMember, MainClassRe Academy academy = findMember.getAcademy(); - boolean exists = mainClassRepository.existsByMember_AcademyAndMainClassName(academy, + boolean exists = mainClassRepository.existsByAcademyAndMainClassName(academy, req.mainClassName()); if (exists) { throw new ClassfitException("이미 같은 이름의 메인 클래스가 있어요.", HttpStatus.CONFLICT); } - MainClass mainClass = new MainClass(req.mainClassName(), findMember); + MainClass mainClass = new MainClass(req.mainClassName(), academy); mainClassRepository.save(mainClass); return new MainClassResponse(mainClass.getId(), mainClass.getMainClassName()); @@ -55,7 +55,7 @@ public List showMainClass(@AuthMember Member findMember) { Academy academy = findMember.getAcademy(); - List mainClasses = mainClassRepository.findByMemberAcademy(academy); + List mainClasses = mainClassRepository.findByAcademy(academy); return mainClasses.stream().map(mainClass -> new AllMainClassResponse(mainClass.getId(), mainClass.getMainClassName())).toList(); @@ -68,7 +68,7 @@ public void deleteMainClass(@AuthMember Member findMember, Long mainClassId) { MainClass mainClass = mainClassRepository.findById(mainClassId).orElseThrow( () -> new ClassfitException("해당 메인 클래스를 찾을 수 없습니다.", HttpStatus.NOT_FOUND)); - if (!Objects.equals(findMember.getAcademy(), mainClass.getMember().getAcademy())) { + if (!Objects.equals(findMember.getAcademy(), mainClass.getAcademy())) { throw new ClassfitException("사용자가 속한 학원 내의 클래스가 아닙니다.", HttpStatus.FORBIDDEN); } diff --git a/src/main/java/classfit/example/classfit/category/service/SubClassService.java b/src/main/java/classfit/example/classfit/category/service/SubClassService.java index 6122d4a2..a239129d 100644 --- a/src/main/java/classfit/example/classfit/category/service/SubClassService.java +++ b/src/main/java/classfit/example/classfit/category/service/SubClassService.java @@ -1,5 +1,6 @@ package classfit.example.classfit.category.service; +import classfit.example.classfit.academy.domain.Academy; import classfit.example.classfit.auth.annotation.AuthMember; import classfit.example.classfit.category.domain.MainClass; import classfit.example.classfit.category.domain.SubClass; @@ -26,34 +27,41 @@ public class SubClassService { private final MemberRepository memberRepository; private static void checkMemberRelationMainClass(Member findMember, MainClass findMainClass) { - if (!Objects.equals(findMember.getId(), findMainClass.getMember().getId())) { + if (!Objects.equals(findMember.getId(), findMainClass.getAcademy().getId())) { throw new ClassfitException("사용자와 클래스가 일치하지 않습니다.", HttpStatus.FORBIDDEN); } } private static void checkMemberRelationSubClass(Member findMember, SubClass findSubClass) { - if (!Objects.equals(findMember.getId(), findSubClass.getMember().getId())) { - throw new ClassfitException("사용자와 클래스가 일치하지 않습니다.", HttpStatus.FORBIDDEN); + Academy academy = findSubClass.getMainClass().getAcademy(); + + boolean isMemberInAcademy = academy.getMembers().stream() + .anyMatch(member -> member.getId().equals(findMember.getId())); + + if (!isMemberInAcademy) { + throw new ClassfitException("사용자가 해당 학원에 속해 있지 않습니다.", HttpStatus.FORBIDDEN); } } + @Transactional // 서브클래스 추가 public SubClassResponse addSubClass(@AuthMember Member findMember, SubClassRequest req) { + Academy findAcademy = findMember.getAcademy(); MainClass findMainClass = mainClassRepository.findById(req.mainClassId()) .orElseThrow( () -> new ClassfitException("메인 클래스를 찾을 수 없어요.", HttpStatus.NOT_FOUND)); - boolean exists = subClassRepository.existsByMemberAndSubClassNameAndMainClass( - findMember, req.subClassName(), findMainClass); + boolean exists = subClassRepository.existsByMemberAndSubClassNameAndAcademyAndMainClass( + findMember, findAcademy, req.subClassName(), findMainClass); if (exists) { throw new ClassfitException("해당 메인 클래스 내에 이미 같은 이름의 서브 클래스가 있어요.", HttpStatus.CONFLICT); } checkMemberRelationMainClass(findMember, findMainClass); - SubClass subClass = new SubClass(req.subClassName(), findMember, findMainClass); + SubClass subClass = new SubClass(req.subClassName(), findMainClass); subClassRepository.save(subClass); diff --git a/src/main/java/classfit/example/classfit/member/domain/Member.java b/src/main/java/classfit/example/classfit/member/domain/Member.java index 8c3fe963..948ac988 100644 --- a/src/main/java/classfit/example/classfit/member/domain/Member.java +++ b/src/main/java/classfit/example/classfit/member/domain/Member.java @@ -3,11 +3,9 @@ import classfit.example.classfit.academy.domain.Academy; import classfit.example.classfit.category.domain.MainClass; import classfit.example.classfit.common.domain.BaseEntity; -import classfit.example.classfit.member.dto.request.MemberUpdateInfoRequest; import jakarta.persistence.*; import lombok.*; -import java.time.LocalDate; import java.util.List; @Entity @@ -41,15 +39,6 @@ public class Member extends BaseEntity { @Column(columnDefinition = "VARCHAR(20)", nullable = false) private MemberStatus status; - @Column(length = 30) - private LocalDate birthDate; - - @Column(length = 30) - private String subject; - - @OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true) - private List mainClasses; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "academy_id") private Academy academy; @@ -65,9 +54,4 @@ public void updateRole(String admin) { public void updatePassword(String password) { this.password = password; } - - public void updateInfo(MemberUpdateInfoRequest request) { - this.birthDate = request.birth(); - this.subject = request.subject(); - } } diff --git a/src/main/java/classfit/example/classfit/scoreReport/controller/ScoreReportController.java b/src/main/java/classfit/example/classfit/scoreReport/controller/ScoreReportController.java index 3123765b..2e4eb278 100644 --- a/src/main/java/classfit/example/classfit/scoreReport/controller/ScoreReportController.java +++ b/src/main/java/classfit/example/classfit/scoreReport/controller/ScoreReportController.java @@ -47,11 +47,12 @@ public ApiResponse createReport(@AuthMember Member member, @GetMapping("/exam-list") @Operation(summary = "기간 내 시험지 조회", description = "학습 리포트 생성 시 기간 내 시험지 조회 API 입니다.") public ApiResponse> findExamList( + @AuthMember Member member, @RequestParam("startDate") LocalDate startDate, @RequestParam("endDate") LocalDate endDate, @RequestParam("mainClassId") Long mainClassId, @RequestParam("subClassId") Long subClassId) { - List exams = scoreReportService.showReportExam(startDate, endDate, mainClassId, + List exams = scoreReportService.showReportExam(member,startDate, endDate, mainClassId, subClassId); return ApiResponse.success(exams, 200, "FIND-REPORT-EXAM"); } diff --git a/src/main/java/classfit/example/classfit/scoreReport/domain/ScoreReportRepository.java b/src/main/java/classfit/example/classfit/scoreReport/domain/ScoreReportRepository.java index c75bb7af..87429404 100644 --- a/src/main/java/classfit/example/classfit/scoreReport/domain/ScoreReportRepository.java +++ b/src/main/java/classfit/example/classfit/scoreReport/domain/ScoreReportRepository.java @@ -27,25 +27,20 @@ List findExamsByCreatedAtBetween( @Param("subClassId") Long subClassId); @Query(""" - SELECT sr - FROM ScoreReport sr - WHERE sr.mainClass.id = :mainClassId - AND sr.subClass.id = :subClassId - AND sr.id IN ( - SELECT MIN(sr2.id) - FROM ScoreReport sr2 - WHERE sr2.student.id = sr.student.id - GROUP BY sr2.student.id - ) - """) - List findFirstReportByStudent(@Param("mainClassId") Long mainClassId, + SELECT sr + FROM ScoreReport sr + WHERE sr.mainClass.id = :mainClassId + AND sr.subClass.id = :subClassId +""") + List findAllReportsByMainClassAndSubClass(@Param("mainClassId") Long mainClassId, @Param("subClassId") Long subClassId); + @Query("SELECT sr FROM ScoreReport sr WHERE sr.id = :studentReportId") - Optional findById(@Param("studentReportId") Long studentReportId); + Optional findByStudentReportId(@Param("studentReportId") Long studentReportId); @Query("SELECT r FROM ScoreReport r " + - "WHERE r.mainClass.member.academy = :academy") + "WHERE r.mainClass.academy = :academy") List findAllByAcademy(@Param("academy") Academy academy); } diff --git a/src/main/java/classfit/example/classfit/scoreReport/service/ScoreReportService.java b/src/main/java/classfit/example/classfit/scoreReport/service/ScoreReportService.java index dc834a83..d63d535d 100644 --- a/src/main/java/classfit/example/classfit/scoreReport/service/ScoreReportService.java +++ b/src/main/java/classfit/example/classfit/scoreReport/service/ScoreReportService.java @@ -118,8 +118,9 @@ public CreateReportResponse createReport(@AuthMember Member member, @Transactional(readOnly = true) - public List showReportExam(LocalDate startDate, LocalDate endDate, Long mainClassId, + public List showReportExam(@AuthMember Member member, LocalDate startDate, LocalDate endDate, Long mainClassId, Long subClassId) { + validateAcademy(member,member.getAcademy().getId()); List reports = scoreReportRepository.findExamsByCreatedAtBetween(startDate, endDate, mainClassId, subClassId); return reports.stream() @@ -144,8 +145,8 @@ public List findReport(@AuthMember Member member, Long mainC SubClass subClass = subClassRepository.findById(subClassId) .orElseThrow( () -> new ClassfitException("서브 클래스를 찾을 수 없어요.", HttpStatus.NOT_FOUND)); - validateAcademy(member, mainClass.getMember().getAcademy().getId()); - List studentReports = scoreReportRepository.findFirstReportByStudent( + validateAcademy(member,mainClass.getAcademy().getId()); + List studentReports = scoreReportRepository.findAllReportsByMainClassAndSubClass( mainClassId, subClassId); return studentReports.stream() @@ -176,7 +177,7 @@ public List findAllReport(@AuthMember Member member) { report.getStudent().getId(), report.getStudent().getName(), report.getReportName(), - report.getMainClass().getMember().getName(), + report.getMainClass().getAcademy().getMembers().getFirst().getName(), report.getCreatedAt().toLocalDate() )) .collect(Collectors.toList()); @@ -185,6 +186,7 @@ public List findAllReport(@AuthMember Member member) { @Transactional public void deleteReport(@AuthMember Member member, Long studentReportId) { + validateAcademy(member,member.getAcademy().getId()); scoreReportRepository.deleteById(studentReportId); } @@ -198,7 +200,7 @@ public List findClassStudents(@AuthMember Member member, Long SubClass subClass = subClassRepository.findById(subClassId) .orElseThrow( () -> new ClassfitException("서브 클래스를 찾을 수 없어요.", HttpStatus.NOT_FOUND)); - validateAcademy(member, mainClass.getMember().getAcademy().getId()); + validateAcademy(member, member.getAcademy().getId()); List classStudents = classStudentRepository.findStudentIdsByMainClassIdAndSubClassId( mainClassId, subClassId); @@ -218,7 +220,7 @@ public List sentStudentOpinion(@AuthMember Member me ScoreReport scoreReport = scoreReportRepository.findById(request.reportId()) .orElseThrow( () -> new ClassfitException("학습리포트를 찾을 수 없어요.", HttpStatus.NOT_FOUND)); - validateAcademy(member, scoreReport.getMainClass().getMember().getAcademy().getId()); + validateAcademy(member, scoreReport.getMainClass().getAcademy().getId()); scoreReport.updateStudentOpinion(request.studentOpinion()); @@ -239,7 +241,7 @@ public ShowStudentReportResponse showStudentReport(@AuthMember Member member, Lo .orElseThrow( () -> new ClassfitException("학습리포트를 찾을 수 없어요.", HttpStatus.NOT_FOUND)); - validateAcademy(member, scoreReport.getMainClass().getMember().getAcademy().getId()); + validateAcademy(member, scoreReport.getMainClass().getAcademy().getId()); List attendanceInfoList = scoreReport.getStudent().getAttendances().stream() .collect(Collectors.groupingBy( Attendance::getStatus, diff --git a/src/main/java/classfit/example/classfit/studentExam/domain/ExamRepository.java b/src/main/java/classfit/example/classfit/studentExam/domain/ExamRepository.java index 2219796a..b38f97ea 100644 --- a/src/main/java/classfit/example/classfit/studentExam/domain/ExamRepository.java +++ b/src/main/java/classfit/example/classfit/studentExam/domain/ExamRepository.java @@ -9,11 +9,19 @@ @Repository public interface ExamRepository extends JpaRepository { - List findByMainClassMemberName(String name); + @Query("SELECT e FROM Exam e " + + "JOIN e.mainClass mc " + + "JOIN mc.academy a " + + "JOIN a.members m " + + "WHERE a.name = :academyName " + + "AND m.name = :memberName") + List findByAcademyAndMemberName(@Param("academyName") String academyName, + @Param("memberName") String memberName); + List findByExamName(String examName); - @Query("SELECT e FROM Exam e WHERE e.mainClass.member.academy.id = :academyId ORDER BY e.id ASC") + @Query("SELECT e FROM Exam e WHERE e.mainClass.academy.id = :academyId ORDER BY e.id ASC") List findAllByAcademyId(@Param("academyId") Long academyId); diff --git a/src/main/java/classfit/example/classfit/studentExam/dto/response/FindExamResponse.java b/src/main/java/classfit/example/classfit/studentExam/dto/response/FindExamResponse.java index 21d1d536..3f219c46 100644 --- a/src/main/java/classfit/example/classfit/studentExam/dto/response/FindExamResponse.java +++ b/src/main/java/classfit/example/classfit/studentExam/dto/response/FindExamResponse.java @@ -1,23 +1,31 @@ package classfit.example.classfit.studentExam.dto.response; - import classfit.example.classfit.studentExam.domain.Exam; import classfit.example.classfit.studentExam.domain.ExamPeriod; import classfit.example.classfit.studentExam.domain.Standard; +import classfit.example.classfit.member.domain.Member; import java.time.LocalDate; import java.time.LocalDateTime; import org.springframework.format.annotation.DateTimeFormat; -public record FindExamResponse(Long examId, ExamPeriod examPeriod, Long memberId, String memberName, Standard standard, String mainClassName, - String subClassName, String examName, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate createdAt +public record FindExamResponse( + Long examId, + ExamPeriod examPeriod, + Long memberId, + String memberName, + Standard standard, + String mainClassName, + String subClassName, + String examName, + @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate createdAt ) { - public static FindExamResponse from(Exam exam) { + public static FindExamResponse from(Exam exam, Member member) { return new FindExamResponse( exam.getId(), exam.getExamPeriod(), - exam.getMainClass().getMember().getId(), - exam.getMainClass().getMember().getName(), + member.getId(), + member.getName(), exam.getStandard(), exam.getMainClass().getMainClassName(), exam.getSubClass().getSubClassName(), @@ -25,7 +33,8 @@ public static FindExamResponse from(Exam exam) { convertToLocalDate(exam.getCreatedAt()) ); } -private static LocalDate convertToLocalDate(LocalDateTime dateTime) { - return dateTime.toLocalDate(); -} + + private static LocalDate convertToLocalDate(LocalDateTime dateTime) { + return dateTime.toLocalDate(); + } } diff --git a/src/main/java/classfit/example/classfit/studentExam/service/ExamService.java b/src/main/java/classfit/example/classfit/studentExam/service/ExamService.java index 4ab17ed1..2c4365c0 100644 --- a/src/main/java/classfit/example/classfit/studentExam/service/ExamService.java +++ b/src/main/java/classfit/example/classfit/studentExam/service/ExamService.java @@ -1,5 +1,7 @@ package classfit.example.classfit.studentExam.service; +import classfit.example.classfit.academy.domain.Academy; +import classfit.example.classfit.academy.repository.AcademyRepository; import classfit.example.classfit.auth.annotation.AuthMember; import classfit.example.classfit.category.domain.MainClass; import classfit.example.classfit.category.domain.SubClass; @@ -28,6 +30,7 @@ import classfit.example.classfit.studentExam.dto.response.UpdateStudentScoreResponse; import java.time.LocalDateTime; import java.util.Arrays; +import java.util.Objects; import java.util.stream.Collectors; import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -44,6 +47,21 @@ public class ExamService { private final SubClassRepository subClassRepository; private final ClassStudentRepository classStudentRepository; private final StudentExamScoreRepository studentExamScoreRepository; + private final AcademyRepository academyRepository; + + // academy에서 적절한 member찾는 메소드 + private boolean isMemberInAcademy(Member member, Academy academy) { + return academy.getMembers().stream() + .anyMatch(academyMember -> academyMember.getId().equals(member.getId())); + } + + private void validateAcademy(Member member, Long academyId) { + Academy academy = academyRepository.findById(academyId) + .orElseThrow(() -> new ClassfitException("학원을 찾을 수 없어요.", HttpStatus.NOT_FOUND)); + if (!Objects.equals(member.getAcademy().getId(), academyId)) { + throw new ClassfitException("해당 학원에 접근할 권한이 없습니다.", HttpStatus.FORBIDDEN); + } + } @Transactional public CreateExamResponse createExam(@AuthMember Member findMember, CreateExamRequest request) { @@ -52,6 +70,7 @@ public CreateExamResponse createExam(@AuthMember Member findMember, CreateExamRe MainClass findMainClass = mainClassRepository.findById(request.mainClassId()).orElseThrow( () -> new ClassfitException("메인 클래스를 찾을 수 없어요.", HttpStatus.NOT_FOUND)); + validateAcademy(findMember, findMainClass.getAcademy().getId()); Exam newExam = request.toEntity(findSubClass, findMainClass); if (request.standard() == Standard.PF) { @@ -75,7 +94,7 @@ public CreateExamResponse createExam(@AuthMember Member findMember, CreateExamRe List classStudents = classStudentRepository.findBySubClass(findSubClass); List studentExamScores = classStudents.stream().map(classStudent -> { Student student = classStudent.getStudent(); - return new StudentExamScore(student, savedExam, defaultScore, null,null); // 초기 점수는 0 + return new StudentExamScore(student, savedExam, defaultScore, null, null); // 초기 점수는 0 }).collect(Collectors.toList()); studentExamScoreRepository.saveAll(studentExamScores); @@ -86,6 +105,7 @@ public CreateExamResponse createExam(@AuthMember Member findMember, CreateExamRe public List findExamClassStudent(@AuthMember Member findMember, Long examId) { Exam findExam = examRepository.findById(examId) .orElseThrow(() -> new ClassfitException("시험지를 찾을 수 없어요.", HttpStatus.NOT_FOUND)); + validateAcademy(findMember, findMember.getAcademy().getId()); List studentExamScores = studentExamScoreRepository.findByExam(findExam); @@ -106,27 +126,41 @@ public List findExamClassStudent(@AuthMember Member findMember public List findExamList(@AuthMember Member findMember, FindExamRequest request) { + validateAcademy(findMember, findMember.getAcademy().getId()); + + List exams; + if (request.memberName() == null && request.examName() == null) { - return examRepository.findAll().stream() - .map(FindExamResponse::from) - .collect(Collectors.toList()); + exams = examRepository.findAll(); } else if (request.memberName() != null && request.examName() == null) { - - return examRepository.findByMainClassMemberName(request.memberName()).stream() - .map(FindExamResponse::from).collect(Collectors.toList()); + exams = examRepository.findByAcademyAndMemberName(findMember.getAcademy().getName(), + request.memberName()); } else if (request.memberName() == null && request.examName() != null) { - - return examRepository.findByExamName(request.examName()).stream() - .map(FindExamResponse::from).collect(Collectors.toList()); + exams = examRepository.findByExamName(request.examName()); } else { throw new ClassfitException("검색을 할 수 없습니다.", HttpStatus.BAD_REQUEST); } + + return exams.stream() + .map(exam -> { + if (exam.getMainClass() == null || + exam.getMainClass().getAcademy() == null || + !isMemberInAcademy(findMember, exam.getMainClass().getAcademy())) { + throw new ClassfitException("회원과 관련된 학원이 일치하지 않거나 필요한 정보가 없습니다.", + HttpStatus.FORBIDDEN); + } + + return FindExamResponse.from(exam, findMember); + }) + .collect(Collectors.toList()); } + @Transactional public ShowExamDetailResponse showExamDetail(@AuthMember Member findMember, Long examId) { Exam findExam = examRepository.findById(examId).orElseThrow( () -> new ClassfitException("해당 시험지를 찾을 수 없어요.", HttpStatus.NOT_FOUND)); + validateAcademy(findMember, findExam.getMainClass().getAcademy().getId()); SubClass subClass = findExam.getSubClass(); List studentScores = findExam.getStudentExamScores(); @@ -165,8 +199,8 @@ public ShowExamDetailResponse showExamDetail(@AuthMember Member findMember, Long .findFirst() .orElse(LocalDateTime.now()); - - return new ExamClassStudent(student.getId(), student.getName(), score,evaluationDetail,checkedStudent,updateAt); + return new ExamClassStudent(student.getId(), student.getName(), score, evaluationDetail, + checkedStudent, updateAt); }) .collect(Collectors.toList()); @@ -184,6 +218,7 @@ public UpdateExamResponse updateExam(@AuthMember Member findMember, Long examId, UpdateExamRequest request) { Exam findExam = examRepository.findById(examId).orElseThrow( () -> new ClassfitException("해당 시험지를 찾을 수 없어요.", HttpStatus.NOT_FOUND)); + validateAcademy(findMember, findExam.getMainClass().getAcademy().getId()); List examRangeList = request.examRange(); findExam.updateExam(request.examDate(), request.standard(), request.highestScore(), @@ -201,6 +236,7 @@ public UpdateExamResponse updateExam(@AuthMember Member findMember, Long examId, public void deleteExam(@AuthMember Member findMember, Long examId) { Exam findExam = examRepository.findById(examId).orElseThrow( () -> new ClassfitException("해당 시험지를 찾을 수 없어요.", HttpStatus.NOT_FOUND)); + validateAcademy(findMember, findExam.getMainClass().getAcademy().getId()); examRepository.delete(findExam); } @@ -209,6 +245,7 @@ public UpdateStudentScoreResponse updateStudentScore(@AuthMember Member findMemb List requests) { Exam findExam = examRepository.findById(examId).orElseThrow( () -> new ClassfitException("해당 시험지를 찾을 수 없어요.", HttpStatus.NOT_FOUND)); + validateAcademy(findMember, findExam.getMainClass().getAcademy().getId()); StudentExamScore studentExamScore = null; for (UpdateStudentScoreRequest request : requests) { @@ -244,7 +281,7 @@ public UpdateStudentScoreResponse updateStudentScore(@AuthMember Member findMemb .map(StudentExamScore::getScore) .orElse(0); String evaluationDetail = studentExamScoreRepository.findByExamAndStudentId(findExam, - student.getId()) + student.getId()) .map(StudentExamScore::getEvaluationDetail) .orElse(null); @@ -255,7 +292,7 @@ public UpdateStudentScoreResponse updateStudentScore(@AuthMember Member findMemb .orElse(false); return ExamStudent.of(student.getId(), student.getName(), score, - findExam.getHighestScore(),evaluationDetail ,checkedStudent); + findExam.getHighestScore(), evaluationDetail, checkedStudent); }).collect(Collectors.toList()); return new UpdateStudentScoreResponse(standard, findExam.getHighestScore(), examStudents);