From 159f0ca7d138df31213f60251c7aac674e900efa Mon Sep 17 00:00:00 2001 From: seonjuuu Date: Wed, 14 May 2025 00:03:52 +0900 Subject: [PATCH 1/4] [feat] ManageStudents --- .../Controller/ManageStudentsController.java | 26 ++++++++++++++ .../response/ManageStudentsListResDto.java | 13 +++++++ .../service/ManageStudentsService.java | 35 +++++++++++++++++++ .../User/repository/UserRepository.java | 3 ++ 4 files changed, 77 insertions(+) create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/response/ManageStudentsListResDto.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java new file mode 100644 index 0000000..3712f45 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java @@ -0,0 +1,26 @@ +package backend.pirocheck.ManageStudents.Controller; + +import backend.pirocheck.ManageStudents.dto.response.ManageStudentsListResDto; +import backend.pirocheck.ManageStudents.service.ManageStudentsService; +import backend.pirocheck.User.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api/admin/managestudent") +@RequiredArgsConstructor +public class ManageStudentsController { + + private final ManageStudentsService manageStudentsService; + + @GetMapping + public List getStudents(@RequestParam(required = false) String name) { + return manageStudentsService.searchStudents(name); + } + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/response/ManageStudentsListResDto.java b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/response/ManageStudentsListResDto.java new file mode 100644 index 0000000..d5e028f --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/response/ManageStudentsListResDto.java @@ -0,0 +1,13 @@ +package backend.pirocheck.ManageStudents.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class ManageStudentsListResDto { + + private Long id; + private String name; + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java new file mode 100644 index 0000000..826d726 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java @@ -0,0 +1,35 @@ +package backend.pirocheck.ManageStudents.service; + +import backend.pirocheck.ManageStudents.dto.response.ManageStudentsListResDto; +import backend.pirocheck.User.entity.Role; +import backend.pirocheck.User.entity.User; +import backend.pirocheck.User.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class ManageStudentsService { + + private final UserRepository userRepository; + + public List searchStudents(String name) { + List users; + + if(name == null || name.isBlank()) { + // 검색어가 없으면 맴버 전체 조회 + users = userRepository.findByRole(Role.MEMBER); + } + else { + // 이름 검색 + users = userRepository.findByNameContainingAndRole(name, Role.MEMBER); + } + + return users.stream() + .map(user -> new ManageStudentsListResDto(user.getId(), user.getName())) + .collect(Collectors.toList()); + } +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/repository/UserRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/repository/UserRepository.java index 9f80d25..8859494 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/User/repository/UserRepository.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/repository/UserRepository.java @@ -12,4 +12,7 @@ public interface UserRepository extends JpaRepository { Optional findByName(String name); List findByRole(Role role); + + // 학생 이름으로 검색기능 + List findByNameContainingAndRole(String name, Role role); } From 2add8f958165da833d0ffbd67820e2954f6b2c34 Mon Sep 17 00:00:00 2001 From: seonjuuu Date: Thu, 15 May 2025 02:58:43 +0900 Subject: [PATCH 2/4] [feat] ManageStudents_StudentDetail --- .../Controller/ManageStudentsController.java | 17 ++++---- .../dto/request/ShieldUpdateReqDto.java | 11 +++++ .../response/ManageStudentDetailResDto.java | 16 ++++++++ .../service/ManageStudentsService.java | 40 ++++++++++++++++++- .../exception/GlobalExceptionHandler.java | 8 ++++ 5 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/request/ShieldUpdateReqDto.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/response/ManageStudentDetailResDto.java diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java index 3712f45..1ccf09e 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java @@ -1,13 +1,10 @@ package backend.pirocheck.ManageStudents.Controller; +import backend.pirocheck.ManageStudents.dto.response.ManageStudentDetailResDto; import backend.pirocheck.ManageStudents.dto.response.ManageStudentsListResDto; import backend.pirocheck.ManageStudents.service.ManageStudentsService; -import backend.pirocheck.User.repository.UserRepository; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -18,9 +15,15 @@ public class ManageStudentsController { private final ManageStudentsService manageStudentsService; - @GetMapping + // 수강생 리스트 조회 + @GetMapping("") public List getStudents(@RequestParam(required = false) String name) { - return manageStudentsService.searchStudents(name); + return manageStudentsService.searchMembers(name); } + // 수강생 상세 조회 + @GetMapping("/{studentId}") + public ManageStudentDetailResDto getStudentDetail(@PathVariable Long studentId) { + return manageStudentsService.getMemberDetail(studentId); + } } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/request/ShieldUpdateReqDto.java b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/request/ShieldUpdateReqDto.java new file mode 100644 index 0000000..98418e1 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/request/ShieldUpdateReqDto.java @@ -0,0 +1,11 @@ +package backend.pirocheck.ManageStudents.dto.request; + + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ShieldUpdateReqDto { + private int shield; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/response/ManageStudentDetailResDto.java b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/response/ManageStudentDetailResDto.java new file mode 100644 index 0000000..d1eb325 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/response/ManageStudentDetailResDto.java @@ -0,0 +1,16 @@ +package backend.pirocheck.ManageStudents.dto.response; + +import lombok.Builder; +import lombok.Getter; + +import java.util.List; + +@Getter +@Builder +public class ManageStudentDetailResDto { + + private String name; + private int deposit; + private int shield; // 방어권 + private List assignmentTitles; // 과제 제목 리스트 +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java index 826d726..0fb2377 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java @@ -1,9 +1,14 @@ package backend.pirocheck.ManageStudents.service; +import backend.pirocheck.Deposit.entity.Deposit; +import backend.pirocheck.Deposit.repository.DepositRepository; +import backend.pirocheck.ManageStudents.dto.response.ManageStudentDetailResDto; import backend.pirocheck.ManageStudents.dto.response.ManageStudentsListResDto; import backend.pirocheck.User.entity.Role; import backend.pirocheck.User.entity.User; import backend.pirocheck.User.repository.UserRepository; +import backend.pirocheck.assignment.entity.Assignment; +import backend.pirocheck.assignment.repository.AssignmentRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -15,8 +20,11 @@ public class ManageStudentsService { private final UserRepository userRepository; + private final DepositRepository depositRepository; + private final AssignmentRepository assignmentRepository; - public List searchStudents(String name) { + // 수강생 조회 + public List searchMembers(String name) { List users; if(name == null || name.isBlank()) { @@ -32,4 +40,34 @@ public List searchStudents(String name) { .map(user -> new ManageStudentsListResDto(user.getId(), user.getName())) .collect(Collectors.toList()); } + + // 수강생 상세 조회 + public ManageStudentDetailResDto getMemberDetail(Long studentId) { + // User 조회 + User user = userRepository.findById(studentId) + .orElseThrow(() -> new RuntimeException("해당 맴버가 존재하지 않습니다.")); + + // deposit 조회 + Deposit deposit = depositRepository.findByUser(user); + if (deposit == null) { + throw new RuntimeException("해당 수강생의 보증금 정보가 없습니다."); + } + + // Assignment 리스트 조회 + List assignments = assignmentRepository.findByUserId(studentId); + + // 과제 제목만 리스트로 변환 + List assignmentTitles = assignments.stream() + .map(Assignment::getAssignmentName) + .toList(); + + // ManageStudentDetailResDto 조립 + return ManageStudentDetailResDto.builder() + .name(user.getName()) + .deposit(deposit.getAmount()) + .shield(deposit.getAscentDefence()) + .assignmentTitles(assignmentTitles) + .build(); + + } } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/exception/GlobalExceptionHandler.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/exception/GlobalExceptionHandler.java index 4fd3755..f26232f 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/User/exception/GlobalExceptionHandler.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/exception/GlobalExceptionHandler.java @@ -16,4 +16,12 @@ public ResponseEntity> handleInvalidLoginException(InvalidLoginEx .status(HttpStatus.UNAUTHORIZED) // 401 상태 코드 .body(ApiResponse.error(e.getMessage())); // 에러 메시지 전달 } + + // RuntimeException (유저관리 상세페이지) + @ExceptionHandler(RuntimeException.class) + public ResponseEntity> handleRuntimeException(RuntimeException ex) { + return ResponseEntity + .status(HttpStatus.BAD_REQUEST) // 404 + .body(ApiResponse.error(ex.getMessage())); + } } From 5e5d952a469e09360cd77bb683bbf190e8b0516b Mon Sep 17 00:00:00 2001 From: seonjuuu Date: Thu, 15 May 2025 03:52:30 +0900 Subject: [PATCH 3/4] [feat] ManageStudents_updateShield --- .../pirocheck/Deposit/entity/Deposit.java | 6 ++---- .../Controller/ManageStudentsController.java | 8 ++++++++ .../service/ManageStudentsService.java | 17 +++++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/entity/Deposit.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/entity/Deposit.java index 139e385..958e9b3 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/entity/Deposit.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/entity/Deposit.java @@ -2,13 +2,11 @@ import backend.pirocheck.User.entity.User; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; @Entity @Getter +@Setter @NoArgsConstructor @AllArgsConstructor @Builder diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java index 1ccf09e..b9fb79a 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java @@ -1,5 +1,6 @@ package backend.pirocheck.ManageStudents.Controller; +import backend.pirocheck.ManageStudents.dto.request.ShieldUpdateReqDto; import backend.pirocheck.ManageStudents.dto.response.ManageStudentDetailResDto; import backend.pirocheck.ManageStudents.dto.response.ManageStudentsListResDto; import backend.pirocheck.ManageStudents.service.ManageStudentsService; @@ -26,4 +27,11 @@ public List getStudents(@RequestParam(required = false public ManageStudentDetailResDto getStudentDetail(@PathVariable Long studentId) { return manageStudentsService.getMemberDetail(studentId); } + + // 방어권 업데이트 + @PatchMapping("/{studentId}/shield") + public void updateShield(@PathVariable Long studentId, @RequestBody ShieldUpdateReqDto req) { + manageStudentsService.updateShield(studentId, req.getShield()); + } + } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java index 0fb2377..4e4cb5a 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java @@ -68,6 +68,23 @@ public ManageStudentDetailResDto getMemberDetail(Long studentId) { .shield(deposit.getAscentDefence()) .assignmentTitles(assignmentTitles) .build(); + } + + // 방어권 업데이트 + public void updateShield(Long studentId, int shield) { + User user = userRepository.findById(studentId) + .orElseThrow(() -> new RuntimeException("해당 수강생의 보증금 정보가 없습니다.")); + Deposit deposit = depositRepository.findByUser(user); + + // 업데이트 + deposit.updateAmounts( + deposit.getDescentAssignment(), + deposit.getDescentAssignment(), + shield // 수정한 방어권 + ); + + // 저장 + depositRepository.save(deposit); } } From 82b109cb120fb033a79c89d1a8a89e65b1d1e3d4 Mon Sep 17 00:00:00 2001 From: seonjuuu Date: Thu, 15 May 2025 04:20:54 +0900 Subject: [PATCH 4/4] [fix] updateDefence --- .../java/backend/pirocheck/Deposit/entity/Deposit.java | 8 ++++++++ .../Controller/ManageStudentsController.java | 8 ++++---- ...hieldUpdateReqDto.java => DefenceUpdateReqDto.java} | 4 ++-- .../dto/response/ManageStudentDetailResDto.java | 2 +- .../ManageStudents/service/ManageStudentsService.java | 10 +++------- 5 files changed, 18 insertions(+), 14 deletions(-) rename backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/request/{ShieldUpdateReqDto.java => DefenceUpdateReqDto.java} (66%) diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/entity/Deposit.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/entity/Deposit.java index 958e9b3..a0431e6 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/entity/Deposit.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/entity/Deposit.java @@ -35,4 +35,12 @@ public void updateAmounts(int descentAssignment, int descentAttendance, int asce this.amount = Math.min(calculateAmount, 120000); // 12만원 넘어가지 않도록 } + // 방어권 업데이트 + public void updateDefence(int newAscentDefence) { + this.ascentDefence = newAscentDefence; + int calculateAmount = 120000 - this.descentAssignment - this.descentAttendance + newAscentDefence; + this.amount = Math.min(calculateAmount, 120000); + + } + } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java index b9fb79a..043b571 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/Controller/ManageStudentsController.java @@ -1,6 +1,6 @@ package backend.pirocheck.ManageStudents.Controller; -import backend.pirocheck.ManageStudents.dto.request.ShieldUpdateReqDto; +import backend.pirocheck.ManageStudents.dto.request.DefenceUpdateReqDto; import backend.pirocheck.ManageStudents.dto.response.ManageStudentDetailResDto; import backend.pirocheck.ManageStudents.dto.response.ManageStudentsListResDto; import backend.pirocheck.ManageStudents.service.ManageStudentsService; @@ -29,9 +29,9 @@ public ManageStudentDetailResDto getStudentDetail(@PathVariable Long studentId) } // 방어권 업데이트 - @PatchMapping("/{studentId}/shield") - public void updateShield(@PathVariable Long studentId, @RequestBody ShieldUpdateReqDto req) { - manageStudentsService.updateShield(studentId, req.getShield()); + @PatchMapping("/{studentId}/defence") + public void updateDefence(@PathVariable Long studentId, @RequestBody DefenceUpdateReqDto req) { + manageStudentsService.updateDefence(studentId, req.getDefence()); } } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/request/ShieldUpdateReqDto.java b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/request/DefenceUpdateReqDto.java similarity index 66% rename from backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/request/ShieldUpdateReqDto.java rename to backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/request/DefenceUpdateReqDto.java index 98418e1..78e39f7 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/request/ShieldUpdateReqDto.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/request/DefenceUpdateReqDto.java @@ -6,6 +6,6 @@ @Getter @Setter -public class ShieldUpdateReqDto { - private int shield; +public class DefenceUpdateReqDto { + private int defence; } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/response/ManageStudentDetailResDto.java b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/response/ManageStudentDetailResDto.java index d1eb325..e5206fc 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/response/ManageStudentDetailResDto.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/dto/response/ManageStudentDetailResDto.java @@ -11,6 +11,6 @@ public class ManageStudentDetailResDto { private String name; private int deposit; - private int shield; // 방어권 + private int defence; // 방어권 private List assignmentTitles; // 과제 제목 리스트 } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java index 4e4cb5a..e28c409 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/ManageStudents/service/ManageStudentsService.java @@ -65,23 +65,19 @@ public ManageStudentDetailResDto getMemberDetail(Long studentId) { return ManageStudentDetailResDto.builder() .name(user.getName()) .deposit(deposit.getAmount()) - .shield(deposit.getAscentDefence()) + .defence(deposit.getAscentDefence()) .assignmentTitles(assignmentTitles) .build(); } // 방어권 업데이트 - public void updateShield(Long studentId, int shield) { + public void updateDefence(Long studentId, int defence) { User user = userRepository.findById(studentId) .orElseThrow(() -> new RuntimeException("해당 수강생의 보증금 정보가 없습니다.")); Deposit deposit = depositRepository.findByUser(user); // 업데이트 - deposit.updateAmounts( - deposit.getDescentAssignment(), - deposit.getDescentAssignment(), - shield // 수정한 방어권 - ); + deposit.updateDefence(defence); // 저장 depositRepository.save(deposit);