Skip to content

Commit

Permalink
[What 135] feat : 출석 종료 시 유저별 출공결 횟수 반영 (#76)
Browse files Browse the repository at this point in the history
* 개인별 출공결 확인

* fix:checkedlistbyuser findby 네이밍수정

* feat :출석 종료시 유저별 출성 상황 반영
  • Loading branch information
dPwls0125 committed Sep 24, 2023
1 parent 2d42c88 commit 0d45bfd
Show file tree
Hide file tree
Showing 7 changed files with 81 additions and 26 deletions.
2 changes: 2 additions & 0 deletions src/main/java/gdg/whatssue/configuration/SecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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);
}
// 출석 재시작
Expand Down Expand Up @@ -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);
}


}
20 changes: 10 additions & 10 deletions src/main/java/gdg/whatssue/controller/MemberControllerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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<ClubJoinRequestListDto> 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<ClubJoinRequestListDto> joinRequestList = memberService.getJoinRequestList();
// return ResponseEntity.status(HttpStatus.OK).body(joinRequestList);
// }

@Override
@Operation(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface AttendanceByUserByScheduleRepository extends JpaRepository<AttendanceByUserBySchedule, Long> {
AttendanceByUserBySchedule findBySchedule_ScheduleIdAndMember_MemberId(Long scheduleId,Long MemberId);
Optional<AttendanceByUserBySchedule> findBySchedule_ScheduleIdAndMember_MemberId(Long scheduleId, Long MemberId);
List<AttendanceByUserBySchedule> findBySchedule_ScheduleId(Long scheduleId);
AttendanceByUserBySchedule findByMemberAndSchedule(Member member, Schedule schedule);
List<AttendanceByUserBySchedule> findBySchedule(Schedule schedule);
}
List<AttendanceByUserBySchedule> findByMember_MemberId(Long memberId);
}
59 changes: 50 additions & 9 deletions src/main/java/gdg/whatssue/service/AttendanceService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Integer> 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){
Expand All @@ -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<AttendanceByUserBySchedule> 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<ClubMemberMapping> 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<AttendanceByUserBySchedule> AScheUserList = attendanceByUserByScheduleRepository.findBySchedule_ScheduleId(scheduleId);

for(AttendanceByUserBySchedule attendance : AScheUserList){
Expand Down Expand Up @@ -135,9 +178,7 @@ public ResponseEntity<?> reflectAttendanceByUser(Long scheduleId){
}
checkedListByUserRepository.save(checkedListByUser);
});

}
return ResponseEntity.ok("출석이 반영되었습니다.");
}

}
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ spring:
init:
encoding: UTF-8


server:
port: 8090
error:
Expand Down

0 comments on commit 0d45bfd

Please sign in to comment.