From 0d45bfdaeb1c8b0c374a7640ae8ad0351b562ca7 Mon Sep 17 00:00:00 2001 From: kim ye jin <108534554+dPwls0125@users.noreply.github.com> Date: Mon, 25 Sep 2023 02:42:05 +0900 Subject: [PATCH] =?UTF-8?q?[What=20135]=20feat=20:=20=EC=B6=9C=EC=84=9D=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=20=EC=8B=9C=20=EC=9C=A0=EC=A0=80=EB=B3=84=20?= =?UTF-8?q?=EC=B6=9C=EA=B3=B5=EA=B2=B0=20=ED=9A=9F=EC=88=98=20=EB=B0=98?= =?UTF-8?q?=EC=98=81=20(#76)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 개인별 출공결 확인 * fix:checkedlistbyuser findby 네이밍수정 * feat :출석 종료시 유저별 출성 상황 반영 --- .../configuration/SecurityConfig.java | 2 + .../controller/AttendanceControllerImpl.java | 11 +++- .../controller/MemberControllerImpl.java | 20 +++---- .../controller/inter/MemberController.java | 8 +-- .../AttendanceByUserByScheduleRepository.java | 6 +- .../whatssue/service/AttendanceService.java | 59 ++++++++++++++++--- src/main/resources/application.yml | 1 + 7 files changed, 81 insertions(+), 26 deletions(-) diff --git a/src/main/java/gdg/whatssue/configuration/SecurityConfig.java b/src/main/java/gdg/whatssue/configuration/SecurityConfig.java index a98ed8b..c9e28af 100644 --- a/src/main/java/gdg/whatssue/configuration/SecurityConfig.java +++ b/src/main/java/gdg/whatssue/configuration/SecurityConfig.java @@ -34,7 +34,9 @@ public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws "/api/user/**", "/v3/api-docs/**", "/swagger-ui/**").permitAll() +// .anyRequest().permitAll()) .requestMatchers("/api/**").authenticated()) //전부 권한 필요 + .addFilterBefore(new JwtTokenFilter(userService, secretKey), UsernamePasswordAuthenticationFilter.class) .build(); } diff --git a/src/main/java/gdg/whatssue/controller/AttendanceControllerImpl.java b/src/main/java/gdg/whatssue/controller/AttendanceControllerImpl.java index a21b4c5..ea7eb3c 100644 --- a/src/main/java/gdg/whatssue/controller/AttendanceControllerImpl.java +++ b/src/main/java/gdg/whatssue/controller/AttendanceControllerImpl.java @@ -1,6 +1,7 @@ package gdg.whatssue.controller; import gdg.whatssue.controller.inter.AttendanceController; +import gdg.whatssue.entity.CheckedListByUser; import gdg.whatssue.service.AttendanceService; import gdg.whatssue.service.dto.CheckNumDto; import io.swagger.v3.oas.annotations.Operation; @@ -34,7 +35,6 @@ public ResponseEntity startAttendance(@PathVariable(name = "scheduleId") Long description = "관리자가 출석을 종료") @DeleteMapping("/{scheduleId}/attendance") public ResponseEntity finishAttendance(Long scheduleId) throws NotImplementedException { - attendanceService.reflectAttendanceByUser(scheduleId); return attendanceService.finishAttendance(scheduleId); } // 출석 재시작 @@ -73,4 +73,13 @@ public ResponseEntity openAttendance(@PathVariable(name = "scheduleId") Long sch public ResponseEntity doAttendance(@PathVariable Long scheduleId, @RequestBody CheckNumDto dto) throws Exception { return attendanceService.doAttendance(scheduleId, dto.getNumber()); } + @Operation( + summary = "유저별 출공결 횟수", + description = "유저별로 출석, 공결, 결석 횟수 반환") + @GetMapping("/attendance/check/memeber") + public ResponseEntity getAttendanceByUser(Long memberId) throws Exception { + return attendanceService.attendanceByUser(memberId); + } + + } \ No newline at end of file diff --git a/src/main/java/gdg/whatssue/controller/MemberControllerImpl.java b/src/main/java/gdg/whatssue/controller/MemberControllerImpl.java index f3d607d..7ef796c 100644 --- a/src/main/java/gdg/whatssue/controller/MemberControllerImpl.java +++ b/src/main/java/gdg/whatssue/controller/MemberControllerImpl.java @@ -13,7 +13,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.Authentication; +//import org.springframework.security.core.Authentication; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RestController; @@ -70,15 +70,15 @@ public ResponseEntity refuseJoinRequest(Long joinId) { return ResponseEntity.status(HttpStatus.OK).body("가입요청 거절 완료"); } - @Override - @Operation( - summary = "멤버 클럽 가입 요청 조회 api", - description = "멤버 클럽 가입 요청 조회") - public ResponseEntity getJoinRequestList(Authentication auth) { - System.out.println(auth.getName()); - List joinRequestList = memberService.getJoinRequestList(); - return ResponseEntity.status(HttpStatus.OK).body(joinRequestList); - } +// @Override +// @Operation( +// summary = "멤버 클럽 가입 요청 조회 api", +// description = "멤버 클럽 가입 요청 조회") +// public ResponseEntity getJoinRequestList(Authentication auth) { +// System.out.println(auth.getName()); +// List joinRequestList = memberService.getJoinRequestList(); +// return ResponseEntity.status(HttpStatus.OK).body(joinRequestList); +// } @Override @Operation( diff --git a/src/main/java/gdg/whatssue/controller/inter/MemberController.java b/src/main/java/gdg/whatssue/controller/inter/MemberController.java index 91eeb13..d743f5c 100644 --- a/src/main/java/gdg/whatssue/controller/inter/MemberController.java +++ b/src/main/java/gdg/whatssue/controller/inter/MemberController.java @@ -3,7 +3,7 @@ import io.swagger.v3.oas.annotations.Operation; import jdk.jshell.spi.ExecutionControl.NotImplementedException; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.Authentication; +//import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; @CrossOrigin @@ -21,9 +21,9 @@ public interface MemberController { @PostMapping("/join-refuse/{joinId}") ResponseEntity refuseJoinRequest(@PathVariable Long joinId) throws NotImplementedException; - //멤버 가입요청 리스트 조회 - @GetMapping("/join-list") - ResponseEntity getJoinRequestList(Authentication auth) throws NotImplementedException; +// //멤버 가입요청 리스트 조회 +// @GetMapping("/join-list") +// ResponseEntity getJoinRequestList(Authentication auth) throws NotImplementedException; //멤버 목록 조회 @GetMapping("/manage") diff --git a/src/main/java/gdg/whatssue/repository/AttendanceByUserByScheduleRepository.java b/src/main/java/gdg/whatssue/repository/AttendanceByUserByScheduleRepository.java index 77229c0..e91feae 100644 --- a/src/main/java/gdg/whatssue/repository/AttendanceByUserByScheduleRepository.java +++ b/src/main/java/gdg/whatssue/repository/AttendanceByUserByScheduleRepository.java @@ -7,11 +7,13 @@ import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository public interface AttendanceByUserByScheduleRepository extends JpaRepository { - AttendanceByUserBySchedule findBySchedule_ScheduleIdAndMember_MemberId(Long scheduleId,Long MemberId); + Optional findBySchedule_ScheduleIdAndMember_MemberId(Long scheduleId, Long MemberId); List findBySchedule_ScheduleId(Long scheduleId); AttendanceByUserBySchedule findByMemberAndSchedule(Member member, Schedule schedule); List findBySchedule(Schedule schedule); -} + List findByMember_MemberId(Long memberId); +} \ No newline at end of file diff --git a/src/main/java/gdg/whatssue/service/AttendanceService.java b/src/main/java/gdg/whatssue/service/AttendanceService.java index 509ec0c..6258e94 100644 --- a/src/main/java/gdg/whatssue/service/AttendanceService.java +++ b/src/main/java/gdg/whatssue/service/AttendanceService.java @@ -64,28 +64,32 @@ public ResponseEntity getAttendanceResult(Long scheduleId) throws Exception { .collect(Collectors.toList()); return ResponseEntity.ok(AttendanceStateBySheduleList); } - // 출석 하기 public ResponseEntity doAttendance(Long scheduleId, Integer num) throws Exception { //어떤 클럽의 schedule을 찾을 것인지 모르니 일단 임시로 1번 user가 속한 클럽의 스케줄을 조회 Long memberId = 1L; + Optional checkNum = Optional.ofNullable(checkNumMap.get(scheduleId)); + if(checkNum.isEmpty()){ + return new ResponseEntity("해당 일정에 대한 출석이 시작되지 않았습니다.", null, 404); + } // 이미 해당 스케줄에 대하여 해당 멤버가 출석을 했는지 확인-> 만약 출석을 한 적이 있다면 예외 처리 - if(attendanceByUserByScheduleRepository.findBySchedule_ScheduleIdAndMember_MemberId(scheduleId, memberId) != null) { - throw new ResponseStatusException(BAD_REQUEST, "이미 출석을 하셨습니다."); //404 + AttendanceByUserBySchedule attendance = attendanceByUserByScheduleRepository.findBySchedule_ScheduleIdAndMember_MemberId(scheduleId,memberId).orElseThrow( + () -> new ResponseStatusException(BAD_REQUEST, "해당 스케줄에 대한 출석 정보가 없습니다.")); + if (attendance.getAttendanceType().equals("출석")) { + throw new ResponseStatusException(BAD_REQUEST, "이미 출석을 하셨습니다."); } + //출석 번호가 일치하는지 확인 if (checkNumMap.get(scheduleId).equals(num)) { // AttendanceByUserBySchedule attendance = AttendanceByUserBySchedule.builder() // .attendanceType("출석") // .member(memberRepository.findById(memberId).get()) // .schedule(scheduleRepository.findById(scheduleId).get()) // .build(); - AttendanceByUserBySchedule attendance = attendanceByUserByScheduleRepository.findBySchedule_ScheduleIdAndMember_MemberId(scheduleId,memberId); attendance.setAttendanceType("출석"); attendanceByUserByScheduleRepository.save(attendance); - }else return new ResponseEntity("출석 번호가 일치하지 않습니다.", null, 404); + } else return new ResponseEntity("출석 번호가 일치하지 않습니다.", null, 404); return ResponseEntity.ok("출석 완료."); - } // 출석 열기 (출석 시도) public ResponseEntity openAttendance(Long scheduleId){ @@ -99,11 +103,50 @@ public ResponseEntity finishAttendance(Long scheduleId){ Schedule schedule = scheduleRepository.findById(scheduleId).get(); schedule.setIsChecked(true); scheduleRepository.save(schedule); + reflectAttendanceByUser(scheduleId); // 출석 내용 멤버별 출석 사항에 반영 return ResponseEntity.ok("출석이 종료되었습니다."); }else return new ResponseEntity("출석이 종료되지 않았습니다.", null, 404); } + public ResponseEntity attendanceByUser(Long ScheduleId) { + List attendanceByUser = attendanceByUserByScheduleRepository.findBySchedule_ScheduleId(ScheduleId); + Long memberId = 1L; + int checkedCount = 0; + int absentCount = 0; + int officialAbsentCount = 0; + for(AttendanceByUserBySchedule attendance : attendanceByUser){ + if(attendance.getAttendanceType().equals("출석")){ + checkedCount++; + }else if(attendance.getAttendanceType().equals("결석")){ + absentCount++; + }else if(attendance.getAttendanceType().equals("공결")){ + officialAbsentCount++; + } + } + Optional clubMemberMappingOptional = Optional.ofNullable(clubMemberMappingRepository.findByMember_MemberId(memberId)); + ClubMemberMapping clubMemberMapping = clubMemberMappingOptional.orElseGet(() -> { + // 값이 없는 경우 ClubMemberMapping을 빌드하여 생성 + ClubMemberMapping newClubMemberMapping = ClubMemberMapping.builder() + .member(memberRepository.findById(memberId).get()) + .club(memberRepository.findById(memberId).get().getClub()) + .build(); + + // 생성한 ClubMemberMapping 저장 + clubMemberMappingRepository.save(newClubMemberMapping); + return newClubMemberMapping; + }); + + CheckedListByUser checkedListByUser = CheckedListByUser.builder() + .checkedCount(checkedCount) + .absentCount(absentCount) + .officialAbsentCount(officialAbsentCount) + .clubMemberMapping(clubMemberMapping) + .build(); + + checkedListByUserRepository.save(checkedListByUser); + return ResponseEntity.ok("해당 유저의 출석이 반영되었습니다."); + } - public ResponseEntity reflectAttendanceByUser(Long scheduleId){ + public void reflectAttendanceByUser(Long scheduleId){ List AScheUserList = attendanceByUserByScheduleRepository.findBySchedule_ScheduleId(scheduleId); for(AttendanceByUserBySchedule attendance : AScheUserList){ @@ -135,9 +178,7 @@ public ResponseEntity reflectAttendanceByUser(Long scheduleId){ } checkedListByUserRepository.save(checkedListByUser); }); - } - return ResponseEntity.ok("출석이 반영되었습니다."); } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 13a6a62..517002f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -15,6 +15,7 @@ spring: init: encoding: UTF-8 + server: port: 8090 error: