From c787ee6abc30bbbae4db96b85076452a9143350d Mon Sep 17 00:00:00 2001 From: lilyyang0077 Date: Sun, 24 May 2026 12:30:34 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=EA=B3=BC=EC=A0=9C=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AssignmentController.java | 9 +++++ .../dto/AssignmentWeekViewResponse.java | 35 ++++++++++++++++ .../repository/AssignmentRepository.java | 2 + .../assignment/service/AssignmentService.java | 40 +++++++++++++++++++ .../repository/CurriculumRepository.java | 2 + 5 files changed, 88 insertions(+) create mode 100644 backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/AssignmentWeekViewResponse.java diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/controller/AssignmentController.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/controller/AssignmentController.java index 0ab1b60..ec90cfa 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/controller/AssignmentController.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/controller/AssignmentController.java @@ -64,6 +64,15 @@ public GetMyAssignmentsResponse getMyAssignments( return assignmentService.getMyAssignments(userId, week); } + // 5. 생성한 과제 조회 (운영진) + @Operation(summary = "과제 목록 조회", description = "주차별로 화/목/토 과제 목록을 조회합니다.") + @GetMapping("/{week}/view") + public AssignmentWeekViewResponse getAssignmentView( + @PathVariable String week + ) { + return assignmentService.getAssignmentView(week); + } + } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/AssignmentWeekViewResponse.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/AssignmentWeekViewResponse.java new file mode 100644 index 0000000..cf4754c --- /dev/null +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/AssignmentWeekViewResponse.java @@ -0,0 +1,35 @@ +package com.example.Piroin.project.domain.assignment.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDate; +import java.util.List; + +@Getter +@Builder +@AllArgsConstructor +public class AssignmentWeekViewResponse { + + private String week; + + private List days; + + @Getter + @Builder + @AllArgsConstructor + public static class DayAssignmentResponse { + private String day; + private LocalDate sessionDate; + private List assignments; + } + + @Getter + @Builder + @AllArgsConstructor + public static class AssignmentInfo { + private Integer assignmentId; + private String title; + } +} diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/repository/AssignmentRepository.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/repository/AssignmentRepository.java index 19f69bc..3f98cd5 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/repository/AssignmentRepository.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/repository/AssignmentRepository.java @@ -11,4 +11,6 @@ public interface AssignmentRepository extends JpaRepository List findByWeekOrderBySessionDateAsc(String week); List findBySessionDate(LocalDate sessionDate); + + List findBySessionDateOrderByIdAsc(LocalDate sessionDate); } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java index 6c0af51..73fe0c5 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java @@ -338,4 +338,44 @@ public StudentWeeklyStatusResponse getStudentWeeklyStatus( .days(dayResponses) .build(); } + + + // 6. 생성한 과제 조회 + @Transactional(readOnly = true) + public AssignmentWeekViewResponse getAssignmentView(String week) { + + Long weekValue = Long.valueOf(week); + + List sessions = + curriculumRepository.findByWeekOrderBySessionDateAsc(weekValue); + + List days = + sessions.stream() + .map(session -> { + LocalDate sessionDate = session.getSessionDate(); + + List assignments = + assignmentRepository.findBySessionDateOrderByIdAsc(sessionDate) + .stream() + .map(assignment -> + AssignmentWeekViewResponse.AssignmentInfo.builder() + .assignmentId(assignment.getId()) + .title(assignment.getTitle()) + .build() + ) + .toList(); + + return AssignmentWeekViewResponse.DayAssignmentResponse.builder() + .day(sessionDate.getDayOfWeek().toString()) + .sessionDate(sessionDate) + .assignments(assignments) + .build(); + }) + .toList(); + + return AssignmentWeekViewResponse.builder() + .week(week) + .days(days) + .build(); + } } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/curriculum/repository/CurriculumRepository.java b/backend/src/main/java/com/example/Piroin/project/domain/curriculum/repository/CurriculumRepository.java index 03c3e1e..35719a8 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/curriculum/repository/CurriculumRepository.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/curriculum/repository/CurriculumRepository.java @@ -23,6 +23,8 @@ public interface CurriculumRepository extends JpaRepository List findAllByOrderBySessionDateAscDayPartAsc(); + List findByWeekOrderBySessionDateAsc(Long week); + // @Query(""" // SELECT s // FROM StudySession s From e6065b7a9dc4b02bf06e6208d0bbf1aab7aa6d5f Mon Sep 17 00:00:00 2001 From: lilyyang0077 Date: Sun, 24 May 2026 15:45:17 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=EC=9A=B4=EC=98=81=EC=A7=84?= =?UTF-8?q?=EC=9D=B4=20=ED=8A=B9=EC=A0=95=20=EB=B6=80=EC=9B=90=EC=9D=98=20?= =?UTF-8?q?=EB=B3=B4=EC=A6=9D=EA=B8=88=20=EC=A1=B0=ED=9A=8C=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deposit/controller/DepositController.java | 13 ++++++++++++ .../deposit/dto/AdminDepositViewResponse.java | 21 +++++++++++++++++++ .../deposit/repository/DepositRepository.java | 1 + .../deposit/service/DepositService.java | 19 +++++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 backend/src/main/java/com/example/Piroin/project/domain/deposit/dto/AdminDepositViewResponse.java diff --git a/backend/src/main/java/com/example/Piroin/project/domain/deposit/controller/DepositController.java b/backend/src/main/java/com/example/Piroin/project/domain/deposit/controller/DepositController.java index 24e38e5..fae18b6 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/deposit/controller/DepositController.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/deposit/controller/DepositController.java @@ -1,5 +1,6 @@ package com.example.Piroin.project.domain.deposit.controller; +import com.example.Piroin.project.domain.deposit.dto.AdminDepositViewResponse; import com.example.Piroin.project.domain.deposit.dto.DepositResponse; import com.example.Piroin.project.domain.deposit.service.DepositService; import io.swagger.v3.oas.annotations.Operation; @@ -16,6 +17,8 @@ public class DepositController { private final DepositService depositService; + + // 1. 나의 보증금 조회 @Operation(summary = "나의 보증금 조회", description = "사용자가 본인의 남은 보증금, 차감된 보증금, 방어권을 조회합니다.") @GetMapping("/me") public DepositResponse getMyDeposit( @@ -26,4 +29,14 @@ public DepositResponse getMyDeposit( return depositService.getMyDeposit(userId); } + + + // 2. 운영진이 특정 부원의 보증금을 조회 + @Operation(summary = "특정 부원 보증금 조회", description = "운영진이 특정 부원의 보증금 상태를 조회합니다.") + @GetMapping("/{userId}/deposit/view") + public AdminDepositViewResponse getUserDeposit( + @PathVariable Long userId + ) { + return depositService.getUserDeposit(userId); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/example/Piroin/project/domain/deposit/dto/AdminDepositViewResponse.java b/backend/src/main/java/com/example/Piroin/project/domain/deposit/dto/AdminDepositViewResponse.java new file mode 100644 index 0000000..1e6e41b --- /dev/null +++ b/backend/src/main/java/com/example/Piroin/project/domain/deposit/dto/AdminDepositViewResponse.java @@ -0,0 +1,21 @@ +package com.example.Piroin.project.domain.deposit.dto; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class AdminDepositViewResponse { + + private Long userId; + + private String name; + + private Integer amount; + + private Integer descentAssignment; + + private Integer descentAttendance; + + private Integer ascentDefence; +} diff --git a/backend/src/main/java/com/example/Piroin/project/domain/deposit/repository/DepositRepository.java b/backend/src/main/java/com/example/Piroin/project/domain/deposit/repository/DepositRepository.java index be077ad..f3836bc 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/deposit/repository/DepositRepository.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/deposit/repository/DepositRepository.java @@ -10,4 +10,5 @@ public interface DepositRepository extends JpaRepository { Optional findByUser(User user); Optional findByUserId(Long userId); + } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/deposit/service/DepositService.java b/backend/src/main/java/com/example/Piroin/project/domain/deposit/service/DepositService.java index b620b11..b252644 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/deposit/service/DepositService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/deposit/service/DepositService.java @@ -1,6 +1,7 @@ package com.example.Piroin.project.domain.deposit.service; import com.example.Piroin.project.domain.attendance.repository.AttendanceRepository; +import com.example.Piroin.project.domain.deposit.dto.AdminDepositViewResponse; import com.example.Piroin.project.domain.deposit.dto.DepositResponse; import com.example.Piroin.project.domain.deposit.entity.Deposit; import com.example.Piroin.project.domain.deposit.exception.DepositException; @@ -54,4 +55,22 @@ public DepositResponse getMyDeposit(Long userId) { .ascentDefence(deposit.getAscentDefence()) .build(); } + + + // 3. 운영진이 특정 부원의 보증금 조회 로직 + @Transactional(readOnly = true) + public AdminDepositViewResponse getUserDeposit(Long userId) { + + Deposit deposit = depositRepository.findByUserId(userId) + .orElseThrow(() -> new RuntimeException("보증금 정보가 존재하지 않습니다.")); + + return AdminDepositViewResponse.builder() + .userId(deposit.getUser().getId()) + .name(deposit.getUser().getName()) + .amount(deposit.getAmount()) + .descentAssignment(deposit.getDescentAssignment()) + .descentAttendance(deposit.getDescentAttendance()) + .ascentDefence(deposit.getAscentDefence()) + .build(); + } } From 70839b0125759ead9cbb59fa52179606f08fbc85 Mon Sep 17 00:00:00 2001 From: lilyyang0077 Date: Sun, 24 May 2026 15:51:48 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=ED=8A=B9=EC=A0=95=20=EB=B6=80?= =?UTF-8?q?=EC=9B=90=EC=9D=98=20=EB=B3=B4=EC=A6=9D=EA=B8=88=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deposit/controller/DepositController.java | 16 +++++++++++-- .../deposit/dto/UpdateDefenceRequest.java | 11 +++++++++ .../deposit/dto/UpdateDefenceResponse.java | 15 ++++++++++++ .../domain/deposit/entity/Deposit.java | 12 ++++++++++ .../deposit/service/DepositService.java | 23 +++++++++++++++++++ 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/com/example/Piroin/project/domain/deposit/dto/UpdateDefenceRequest.java create mode 100644 backend/src/main/java/com/example/Piroin/project/domain/deposit/dto/UpdateDefenceResponse.java diff --git a/backend/src/main/java/com/example/Piroin/project/domain/deposit/controller/DepositController.java b/backend/src/main/java/com/example/Piroin/project/domain/deposit/controller/DepositController.java index fae18b6..61e7ca5 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/deposit/controller/DepositController.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/deposit/controller/DepositController.java @@ -2,6 +2,8 @@ import com.example.Piroin.project.domain.deposit.dto.AdminDepositViewResponse; import com.example.Piroin.project.domain.deposit.dto.DepositResponse; +import com.example.Piroin.project.domain.deposit.dto.UpdateDefenceRequest; +import com.example.Piroin.project.domain.deposit.dto.UpdateDefenceResponse; import com.example.Piroin.project.domain.deposit.service.DepositService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -19,7 +21,7 @@ public class DepositController { // 1. 나의 보증금 조회 - @Operation(summary = "나의 보증금 조회", description = "사용자가 본인의 남은 보증금, 차감된 보증금, 방어권을 조회합니다.") + @Operation(summary = "(부원) 나의 보증금 조회", description = "사용자가 본인의 남은 보증금, 차감된 보증금, 방어권을 조회합니다.") @GetMapping("/me") public DepositResponse getMyDeposit( Authentication authentication @@ -32,11 +34,21 @@ public DepositResponse getMyDeposit( // 2. 운영진이 특정 부원의 보증금을 조회 - @Operation(summary = "특정 부원 보증금 조회", description = "운영진이 특정 부원의 보증금 상태를 조회합니다.") + @Operation(summary = "(운영진) 특정 부원 보증금 조회", description = "운영진이 특정 부원의 보증금 상태를 조회합니다.") @GetMapping("/{userId}/deposit/view") public AdminDepositViewResponse getUserDeposit( @PathVariable Long userId ) { return depositService.getUserDeposit(userId); } + + // 3. 운영진이 특정 부원의 보증금 정보를 수정 + @Operation(summary = "(운영진) 특정 부원 보증금 방어권 수정", description = "운영진이 특정 부원의 보증금 방어권 금액을 수정합니다.") + @PatchMapping("/{userId}/deposit/defence") + public UpdateDefenceResponse updateUserDefence( + @PathVariable Long userId, + @RequestBody UpdateDefenceRequest request + ) { + return depositService.updateUserDefence(userId, request); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/example/Piroin/project/domain/deposit/dto/UpdateDefenceRequest.java b/backend/src/main/java/com/example/Piroin/project/domain/deposit/dto/UpdateDefenceRequest.java new file mode 100644 index 0000000..b63c63d --- /dev/null +++ b/backend/src/main/java/com/example/Piroin/project/domain/deposit/dto/UpdateDefenceRequest.java @@ -0,0 +1,11 @@ +package com.example.Piroin.project.domain.deposit.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class UpdateDefenceRequest { + + private Integer ascentDefence; +} diff --git a/backend/src/main/java/com/example/Piroin/project/domain/deposit/dto/UpdateDefenceResponse.java b/backend/src/main/java/com/example/Piroin/project/domain/deposit/dto/UpdateDefenceResponse.java new file mode 100644 index 0000000..bcf32d2 --- /dev/null +++ b/backend/src/main/java/com/example/Piroin/project/domain/deposit/dto/UpdateDefenceResponse.java @@ -0,0 +1,15 @@ +package com.example.Piroin.project.domain.deposit.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class UpdateDefenceResponse { + + private Long userId; + + private Integer amount; + + private Integer ascentDefence; +} diff --git a/backend/src/main/java/com/example/Piroin/project/domain/deposit/entity/Deposit.java b/backend/src/main/java/com/example/Piroin/project/domain/deposit/entity/Deposit.java index 38a958d..a921f42 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/deposit/entity/Deposit.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/deposit/entity/Deposit.java @@ -68,6 +68,18 @@ public void updateDepositAmount( + this.ascentDefence; } + // 보증금 계산 + public void updateDefenceAmount(Integer ascentDefence) { + this.ascentDefence = ascentDefence; + + int baseAmount = 100_000; + + this.amount = baseAmount + - this.descentAssignment + - this.descentAttendance + + this.ascentDefence; + } + } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/deposit/service/DepositService.java b/backend/src/main/java/com/example/Piroin/project/domain/deposit/service/DepositService.java index b252644..de461cd 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/deposit/service/DepositService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/deposit/service/DepositService.java @@ -3,6 +3,8 @@ import com.example.Piroin.project.domain.attendance.repository.AttendanceRepository; import com.example.Piroin.project.domain.deposit.dto.AdminDepositViewResponse; import com.example.Piroin.project.domain.deposit.dto.DepositResponse; +import com.example.Piroin.project.domain.deposit.dto.UpdateDefenceRequest; +import com.example.Piroin.project.domain.deposit.dto.UpdateDefenceResponse; import com.example.Piroin.project.domain.deposit.entity.Deposit; import com.example.Piroin.project.domain.deposit.exception.DepositException; import com.example.Piroin.project.domain.deposit.exception.code.DepositErrorCode; @@ -73,4 +75,25 @@ public AdminDepositViewResponse getUserDeposit(Long userId) { .ascentDefence(deposit.getAscentDefence()) .build(); } + + // 4. 운영진이 특정 부원의 보증금을 수정 + @Transactional + public UpdateDefenceResponse updateUserDefence( + Long userId, + UpdateDefenceRequest request + ) { + + Deposit deposit = depositRepository.findByUserId(userId) + .orElseThrow(() -> new RuntimeException("보증금 정보가 존재하지 않습니다.")); + + if (request.getAscentDefence() != null) { + deposit.updateDefenceAmount(request.getAscentDefence()); + } + + return new UpdateDefenceResponse( + deposit.getUser().getId(), + deposit.getAmount(), + deposit.getAscentDefence() + ); + } }