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 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..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 @@ -1,6 +1,9 @@ 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.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; @@ -16,7 +19,9 @@ public class DepositController { private final DepositService depositService; - @Operation(summary = "나의 보증금 조회", description = "사용자가 본인의 남은 보증금, 차감된 보증금, 방어권을 조회합니다.") + + // 1. 나의 보증금 조회 + @Operation(summary = "(부원) 나의 보증금 조회", description = "사용자가 본인의 남은 보증금, 차감된 보증금, 방어권을 조회합니다.") @GetMapping("/me") public DepositResponse getMyDeposit( Authentication authentication @@ -26,4 +31,24 @@ 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); + } + + // 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/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/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/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..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 @@ -1,7 +1,10 @@ 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.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; @@ -54,4 +57,43 @@ 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(); + } + + // 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() + ); + } }