Skip to content

Commit c0ea2a7

Browse files
authored
Merge pull request #219 from ITA-OneByte/fix/177
[Fix] 로그인한 멤버 데이터 조회
2 parents 69c8fa6 + 59eb249 commit c0ea2a7

File tree

12 files changed

+183
-56
lines changed

12 files changed

+183
-56
lines changed

src/main/java/classfit/example/classfit/attendance/controller/AttendanceController.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import classfit.example.classfit.attendance.dto.response.StudentAttendanceResponse;
55
import classfit.example.classfit.attendance.service.AttendanceService;
66
import classfit.example.classfit.attendance.service.AttendanceUpdateService;
7+
import classfit.example.classfit.auth.annotation.AuthMember;
78
import classfit.example.classfit.classStudent.domain.ClassStudent;
89
import classfit.example.classfit.common.ApiResponse;
10+
import classfit.example.classfit.member.domain.Member;
911
import classfit.example.classfit.student.domain.Student;
1012
import io.swagger.v3.oas.annotations.Operation;
1113
import io.swagger.v3.oas.annotations.Parameter;
@@ -28,35 +30,42 @@ public class AttendanceController {
2830
@GetMapping("/")
2931
@Operation(summary = "전체 출결 관리 조회", description = "전체 학생을 클릭 시 조회되는 출결 api 입니다.")
3032
public ApiResponse<List<StudentAttendanceResponse>> getAttendance(
33+
@AuthMember Member member,
3134
@Parameter(description = "이전 또는 이후 출결 조회 시 필요한 값으로, 현재는 0(디폴트), 이전 주는 음수로, 다음 주는 양수로 표시합니다. 4주 전부터 2주 후까지(-4 ~ +2) 조회 가능합니다.")
3235
@RequestParam(value = "weekOffset", defaultValue = "0") int weekOffset,
3336
@Parameter(description = "조회할 페이지 번호로, 기본값은 0이며, 페이지는 0부터 시작합니다.")
34-
@RequestParam(value = "page", defaultValue = "0") int page) {
37+
@RequestParam(value = "page", defaultValue = "0") int page
38+
) {
3539
List<LocalDate> weekRange = attendanceService.getWeeklyAttendanceRange(weekOffset);
36-
Page<Student> students = attendanceService.getAllStudents(page);
40+
Page<Student> students = attendanceService.getAllStudents(page, member);
3741
List<StudentAttendanceResponse> studentAttendances = attendanceService.getStudentAttendance(students.getContent(), weekRange);
3842
return ApiResponse.success(studentAttendances, 200, "SUCCESS");
3943
}
4044

4145
@GetMapping("/{mainClassId}/{subClassId}")
4246
@Operation(summary = "특정 클래스 출결 관리 조회", description = "특정 클래스를 클릭 시 조회되는 출결 api 입니다.")
4347
public ApiResponse<List<StudentAttendanceResponse>> getClassAttendance(
48+
@AuthMember Member member,
4449
@Parameter(description = "이전 또는 이후 출결 조회 시 필요한 값으로, 현재는 0(디폴트), 이전 주는 음수로, 다음 주는 양수로 표시합니다. 4주 전부터 2주 후까지(-4 ~ +2) 조회 가능합니다.")
4550
@RequestParam(value = "weekOffset", defaultValue = "0") int weekOffset,
4651
@Parameter(description = "조회할 페이지 번호로, 기본값은 0이며, 페이지는 0부터 시작합니다.")
4752
@RequestParam(value = "page", defaultValue = "0") int page,
4853
@PathVariable("mainClassId") Long mainClassId,
49-
@PathVariable("subClassId") Long subClassId) {
54+
@PathVariable("subClassId") Long subClassId
55+
) {
5056
List<LocalDate> weekRange = attendanceService.getWeeklyAttendanceRange(weekOffset);
51-
Page<ClassStudent> students = attendanceService.getClassStudentsByMainClassAndSubClass(mainClassId, subClassId, page);
57+
Page<ClassStudent> students = attendanceService.getClassStudentsByMainClassAndSubClass(mainClassId, subClassId, page, member);
5258
List<StudentAttendanceResponse> studentAttendances = attendanceService.getStudentAttendance(students.getContent(), weekRange);
5359
return ApiResponse.success(studentAttendances, 200, "SUCCESS");
5460
}
5561

5662
@PatchMapping("/")
5763
@Operation(summary = "클래스 출결 수정", description = "학생 출결을 수정할 때 사용되는 api 입니다.")
58-
public ApiResponse<List<StudentAttendanceResponse>> updateAttendance(@RequestBody List<StudentAttendanceUpdateRequest> requestDTO) {
59-
List<StudentAttendanceResponse> updatedStudents = attendanceUpdateService.updateStudentAttendances(requestDTO);
64+
public ApiResponse<List<StudentAttendanceResponse>> updateAttendance(
65+
@AuthMember Member member,
66+
@RequestBody List<StudentAttendanceUpdateRequest> requestDTO
67+
) {
68+
List<StudentAttendanceResponse> updatedStudents = attendanceUpdateService.updateStudentAttendances(requestDTO, member);
6069
return ApiResponse.success(updatedStudents, 200, "UPDATED");
6170
}
6271
}

src/main/java/classfit/example/classfit/attendance/controller/AttendanceExportController.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import classfit.example.classfit.attendance.dto.response.StudentAttendanceResponse;
44
import classfit.example.classfit.attendance.service.AttendanceExportService;
5+
import classfit.example.classfit.auth.annotation.AuthMember;
56
import classfit.example.classfit.common.ApiResponse;
7+
import classfit.example.classfit.member.domain.Member;
68
import io.swagger.v3.oas.annotations.Operation;
79
import io.swagger.v3.oas.annotations.Parameter;
810
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -23,11 +25,12 @@ public class AttendanceExportController {
2325
@GetMapping("/excel/download")
2426
@Operation(summary = "엑셀 다운로드", description = "월별 출결 데이터 엑셀 다운로드 api 입니다.")
2527
public ApiResponse<List<StudentAttendanceResponse>> exportAttendance(
28+
@AuthMember Member member,
2629
@Parameter(description = "다운로드 받을 달 (1~12 사이의 값)")
2730
@RequestParam("month") int month,
2831
@Parameter(description = "서브 클래스 아이디 (필수 아님)")
2932
@RequestParam(required = false) Long subClassId) {
30-
List<StudentAttendanceResponse> attendanceData = attendanceExportService.getAttendanceData(month, subClassId);
33+
List<StudentAttendanceResponse> attendanceData = attendanceExportService.getAttendanceData(month, subClassId, member);
3134
return ApiResponse.success(attendanceData, 200, "SUCCESS");
3235
}
3336
}

src/main/java/classfit/example/classfit/attendance/controller/AttendanceStatisticsController.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import classfit.example.classfit.attendance.dto.response.StatisticsDateResponse;
55
import classfit.example.classfit.attendance.dto.response.StatisticsMemberResponse;
66
import classfit.example.classfit.attendance.service.AttendanceStatisticsService;
7+
import classfit.example.classfit.auth.annotation.AuthMember;
78
import classfit.example.classfit.common.ApiResponse;
9+
import classfit.example.classfit.member.domain.Member;
810
import io.swagger.v3.oas.annotations.Operation;
911
import io.swagger.v3.oas.annotations.Parameter;
1012
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -24,54 +26,58 @@ public class AttendanceStatisticsController {
2426
@GetMapping("/date")
2527
@Operation(summary = "클래스 날짜별 통계", description = "날짜별 출결 통계 조회 시 사용되는 api 입니다.")
2628
public ApiResponse<List<StatisticsDateResponse>> getAttendanceStaticsByDate(
29+
@AuthMember Member member,
2730
@Parameter(description = "조회 시작 기간")
2831
@RequestParam(value = "startDate") LocalDate startDate,
2932
@Parameter(description = "조회 끝 기간")
3033
@RequestParam(value = "endDate") LocalDate endDate,
3134
@Parameter(description = "조회하려는 서브 클래스 ID")
32-
@RequestParam(value = "subClassId") Long subClassId) {
33-
34-
List<StatisticsDateResponse> statisticsDate = attendanceStatisticsService.getAttendanceStatisticsByDate(startDate, endDate, subClassId);
35+
@RequestParam(value = "subClassId") Long subClassId
36+
) {
37+
List<StatisticsDateResponse> statisticsDate = attendanceStatisticsService.getAttendanceStatisticsByDate(startDate, endDate, subClassId, member);
3538
return ApiResponse.success(statisticsDate, 200, "SUCCESS");
3639
}
3740

3841
@GetMapping("/date/details")
3942
@Operation(summary = "클래스 날짜별 통계 세부 조회", description = "날짜별 출결 통계에서 세부 정보 조회 시 사용되는 api 입니다.")
4043
public ApiResponse<List<String>> getAttendanceDetailsByDateAndStatus(
44+
@AuthMember Member member,
4145
@Parameter(description = "조회 날짜")
4246
@RequestParam(value = "date") LocalDate date,
4347
@Parameter(description = "조회하려는 서브 클래스 ID")
4448
@RequestParam(value = "subClassId") Long subClassId,
4549
@Parameter(description = "조회하려는 출결 상태")
4650
@RequestParam(value = "status") AttendanceStatus status
4751
) {
48-
List<String> studentDetails = attendanceStatisticsService.getAttendanceDetailsByDateAndStatus(date, subClassId, status);
52+
List<String> studentDetails = attendanceStatisticsService.getAttendanceDetailsByDateAndStatus(date, subClassId, status, member);
4953
return ApiResponse.success(studentDetails, 200, "SUCCESS");
5054
}
5155

5256
@GetMapping("/member")
5357
@Operation(summary = "클래스 구성원별 통계", description = "구성원별 출결 통계 조회 시 사용되는 api 입니다.")
5458
public ApiResponse getAttendanceStaticsByMember(
59+
@AuthMember Member member,
5560
@Parameter(description = "조회 시작 기간")
5661
@RequestParam(value = "startDate") LocalDate startDate,
5762
@Parameter(description = "조회 끝 기간")
58-
@RequestParam(value = "endDate") LocalDate endDate) {
59-
60-
List<StatisticsMemberResponse> statisticsDate = attendanceStatisticsService.getAttendanceStatisticsByMember(startDate, endDate);
63+
@RequestParam(value = "endDate") LocalDate endDate
64+
) {
65+
List<StatisticsMemberResponse> statisticsDate = attendanceStatisticsService.getAttendanceStatisticsByMember(startDate, endDate, member);
6166
return ApiResponse.success(statisticsDate, 200, "SUCCESS");
6267
}
6368

6469
@GetMapping("/member/details")
6570
@Operation(summary = "클래스 구성원별 통계 세부 조회", description = "구성원별 출결 통계에서 세부 정보 조회 시 사용되는 api 입니다.")
6671
public ApiResponse<List<String>> getAttendanceDetailsByMemberAndStatus(
72+
@AuthMember Member member,
6773
@Parameter(description = "조회 학생")
6874
@RequestParam(value = "studentId") Long studentId,
6975
@Parameter(description = "조회하려는 달")
7076
@RequestParam(value = "month") int month,
7177
@Parameter(description = "조회하려는 출결 상태")
7278
@RequestParam(value = "status") AttendanceStatus status
7379
) {
74-
List<String> studentDetails = attendanceStatisticsService.getAttendanceDetailsByMemberAndStatus(studentId, month, status);
80+
List<String> studentDetails = attendanceStatisticsService.getAttendanceDetailsByMemberAndStatus(studentId, month, status, member);
7581
return ApiResponse.success(studentDetails, 200, "SUCCESS");
7682
}
7783
}

src/main/java/classfit/example/classfit/attendance/repository/AttendanceRepository.java

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.time.LocalDate;
1010
import java.util.List;
1111
import java.util.Optional;
12+
import org.springframework.data.repository.query.Param;
1213

1314
public interface AttendanceRepository extends JpaRepository<Attendance, Long> {
1415

@@ -17,22 +18,54 @@ public interface AttendanceRepository extends JpaRepository<Attendance, Long> {
1718
@Query("SELECT MAX(a.date) FROM Attendance a")
1819
Optional<LocalDate> findLastGeneratedDate();
1920

20-
@Query("SELECT a FROM Attendance a WHERE a.student IN (SELECT cs.student FROM ClassStudent cs WHERE cs.subClass.id = :subClassId) AND FUNCTION('MONTH', a.date) = :month")
21-
List<Attendance> findBySubClassIdAndMonth(Long subClassId, int month);
21+
@Query("SELECT a FROM Attendance a WHERE a.student IN " +
22+
"(SELECT cs.student FROM ClassStudent cs WHERE cs.subClass.id = :subClassId AND cs.subClass.member.academy.id =:academyId) " +
23+
"AND FUNCTION('MONTH', a.date) = :month")
24+
List<Attendance> findByAcademyIdAndSubClassIdAndMonth(
25+
@Param("academyId") Long academyId,
26+
@Param("subClassId") Long subClassId,
27+
@Param("month") int month);
2228

23-
@Query("SELECT a FROM Attendance a WHERE FUNCTION('MONTH', a.date) = :month")
24-
List<Attendance> findByMonth(int month);
29+
@Query("SELECT a FROM Attendance a WHERE a.student IN " +
30+
"(SELECT cs.student FROM ClassStudent cs WHERE cs.subClass.member.academy.id =:academyId) " +
31+
"AND FUNCTION('MONTH', a.date) = :month")
32+
List<Attendance> findByAcademyIdAndMonth(
33+
@Param("academyId") Long academyId,
34+
@Param("month") int month);
2535

26-
@Query("SELECT a FROM Attendance a JOIN a.classStudent cs WHERE cs.subClass.id = :subClassId AND a.date BETWEEN :startDate AND :endDate")
27-
List<Attendance> findByDateBetweenAndSubClassId(LocalDate startDate, LocalDate endDate,
28-
Long subClassId);
36+
@Query("SELECT a FROM Attendance a JOIN a.classStudent cs " +
37+
"WHERE cs.subClass.id = :subClassId " +
38+
"AND cs.subClass.member.academy.id = :academyId " +
39+
"AND a.date BETWEEN :startDate AND :endDate")
40+
List<Attendance> findByDateBetweenAndSubClassIdAndAcademyId(
41+
@Param("startDate") LocalDate startDate,
42+
@Param("endDate") LocalDate endDate,
43+
@Param("subClassId") Long subClassId,
44+
@Param("academyId") Long academyId);
2945

30-
@Query("SELECT a FROM Attendance a JOIN a.classStudent cs WHERE cs.subClass.id = :subClassId AND a.date = :date AND a.status = :status")
31-
List<Attendance> findByDateAndSubClassIdAndStatus(LocalDate date, Long subClassId, AttendanceStatus status);
46+
47+
@Query("SELECT a FROM Attendance a JOIN a.classStudent cs " +
48+
"WHERE cs.subClass.id = :subClassId " +
49+
"AND cs.subClass.member.academy.id = :academyId " +
50+
"AND a.date = :date " +
51+
"AND a.status = :status")
52+
List<Attendance> findByDateAndSubClassIdAndStatusAndAcademyId(
53+
@Param("date") LocalDate date,
54+
@Param("subClassId") Long subClassId,
55+
@Param("status") AttendanceStatus status,
56+
@Param("academyId") Long academyId);
3257

3358
List<Attendance> findByStudentIdAndDateBetween(Long studentId, LocalDate startDate,
3459
LocalDate endDate);
3560

36-
@Query("SELECT a FROM Attendance a WHERE a.student.id = :studentId AND FUNCTION('MONTH', a.date) = :month AND a.status = :status")
37-
List<Attendance> findByStudentIdAndMonthAndStatus(Long studentId, int month, AttendanceStatus status);
61+
@Query("SELECT a FROM Attendance a JOIN a.classStudent cs " +
62+
"WHERE a.student.id = :studentId " +
63+
"AND FUNCTION('MONTH', a.date) = :month " +
64+
"AND a.status = :status " +
65+
"AND cs.subClass.member.academy.id = :academyId ")
66+
List<Attendance> findByAcademyIdAndStudentIdAndMonthAndStatus(
67+
@Param("studentId") Long studentId,
68+
@Param("month") int month,
69+
@Param("status") AttendanceStatus status,
70+
@Param("academyId") Long academyId);
3871
}

src/main/java/classfit/example/classfit/attendance/service/AttendanceExportService.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import classfit.example.classfit.attendance.dto.response.AttendanceResponse;
55
import classfit.example.classfit.attendance.dto.response.StudentAttendanceResponse;
66
import classfit.example.classfit.attendance.repository.AttendanceRepository;
7+
import classfit.example.classfit.member.domain.Member;
78
import classfit.example.classfit.student.domain.Student;
89
import lombok.RequiredArgsConstructor;
910
import org.springframework.stereotype.Service;
@@ -20,8 +21,13 @@ public class AttendanceExportService {
2021
private final AttendanceRepository attendanceRepository;
2122

2223
@Transactional
23-
public List<StudentAttendanceResponse> getAttendanceData(int month, Long subClassId) {
24-
List<Attendance> attendances = findAttendancesBySubClassIdAndMonth(subClassId, month);
24+
public List<StudentAttendanceResponse> getAttendanceData(
25+
int month,
26+
Long subClassId,
27+
Member member
28+
) {
29+
Long academyId = member.getAcademy().getId();
30+
List<Attendance> attendances = findAttendancesByAcademyAndSubClassAndMonth(academyId, subClassId, month);
2531

2632
return attendances.stream()
2733
.collect(Collectors.groupingBy(Attendance::getStudent))
@@ -31,13 +37,13 @@ public List<StudentAttendanceResponse> getAttendanceData(int month, Long subClas
3137
.collect(Collectors.toList());
3238
}
3339

34-
private List<Attendance> findAttendancesBySubClassIdAndMonth(Long subClassId, int month) {
40+
private List<Attendance> findAttendancesByAcademyAndSubClassAndMonth(Long academyId, Long subClassId, int month) {
3541
List<Attendance> attendances;
3642

3743
if (subClassId != null) {
38-
attendances = attendanceRepository.findBySubClassIdAndMonth(subClassId, month);
44+
attendances = attendanceRepository.findByAcademyIdAndSubClassIdAndMonth(academyId, subClassId, month);
3945
} else {
40-
attendances = attendanceRepository.findByMonth(month);
46+
attendances = attendanceRepository.findByAcademyIdAndMonth(academyId, month);
4147
}
4248
return attendances;
4349
}

src/main/java/classfit/example/classfit/attendance/service/AttendanceService.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import classfit.example.classfit.classStudent.domain.ClassStudent;
66
import classfit.example.classfit.classStudent.repository.ClassStudentRepository;
77
import classfit.example.classfit.common.util.DateRangeUtil;
8+
import classfit.example.classfit.member.domain.Member;
89
import classfit.example.classfit.student.domain.Student;
910
import classfit.example.classfit.student.repository.StudentRepository;
1011
import lombok.RequiredArgsConstructor;
@@ -28,14 +29,17 @@ public class AttendanceService {
2829
private final StudentRepository studentRepository;
2930
private final ClassStudentRepository classStudentRepository;
3031

31-
public Page<Student> getAllStudents(int page) {
32+
public Page<Student> getAllStudents(int page, Member loggedInMember) {
33+
Long academyId = loggedInMember.getAcademy().getId();
3234
Pageable pageable = PageRequest.of(page, 50);
33-
return studentRepository.findAll(pageable);
35+
return studentRepository.findAllByAcademyId(academyId, pageable);
3436
}
3537

36-
public Page<ClassStudent> getClassStudentsByMainClassAndSubClass(Long mainClassId, Long subClassId, int page) {
38+
public Page<ClassStudent> getClassStudentsByMainClassAndSubClass(Long mainClassId, Long subClassId, int page, Member loggedInMember) {
39+
Long academyId = loggedInMember.getAcademy().getId();
3740
Pageable pageable = PageRequest.of(page, 50);
38-
return classStudentRepository.findBySubClass_MainClass_IdAndSubClass_Id(mainClassId, subClassId, pageable);
41+
return classStudentRepository.findAllByMainClassAndSubClass(
42+
mainClassId, subClassId, academyId, pageable);
3943
}
4044

4145
public List<StudentAttendanceResponse> getStudentAttendance(List<?> students, List<LocalDate> weekRange) {

0 commit comments

Comments
 (0)