Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
package com.example.Piroin.project.domain.assignment.controller;

import com.example.Piroin.project.domain.assignment.dto.CreateAssignmentRequest;
import com.example.Piroin.project.domain.assignment.dto.CreateAssignmentResponse;
import com.example.Piroin.project.domain.assignment.dto.ModifyAssignmentRequest;
import com.example.Piroin.project.domain.assignment.dto.ModifyAssignmentResponse;
import com.example.Piroin.project.domain.assignment.dto.*;
import com.example.Piroin.project.domain.assignment.entity.DeleteAssignmentResponse;
import com.example.Piroin.project.domain.assignment.service.AssignmentService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;


@RestController
@RequiredArgsConstructor
@RequestMapping("/assignments")
@RequestMapping("/api/assignments")
@Tag(name = "피로체크 과제 관리", description = "피로체크 과제 관리 API")
public class AssignmentController {

Expand Down Expand Up @@ -54,5 +52,19 @@ public DeleteAssignmentResponse deleteAssignment(
return assignmentService.deleteAssignment(assignmentId);
}

// 4. 나의 과제 상태 조회 (부원)
@Operation(summary = "나의 과제 조회", description = "부원이 본인의 과제 상태를 조회합니다.")
@GetMapping("/me/{week}")
public GetMyAssignmentsResponse getMyAssignments(
@PathVariable String week,
Authentication authentication
) {

Long userId = Long.valueOf(authentication.getName());

return assignmentService.getMyAssignments(userId, week);
}


}

Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.Piroin.project.domain.assignment.dto;

import com.example.Piroin.project.domain.assignment.enums.AssignmentStatus;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class AssignmentInfoResponse {

private Integer assignmentId;

private String title;

private String week;

private String sessionDate;

private String day;

private AssignmentStatus submitted;
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.Piroin.project.domain.assignment.dto;

import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.Builder;
import lombok.Getter;

import java.util.List;

@Getter
@Builder
@JsonPropertyOrder({"week", "assignments"})
public class GetMyAssignmentsResponse {

private String week;

private List<AssignmentInfoResponse> assignments;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import com.example.Piroin.project.domain.assignment.entity.AssignmentItem;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface AssignmentItemRepository extends JpaRepository<AssignmentItem, Integer> {

void deleteAllByAssignmentId(Integer assignmentId);


Optional<AssignmentItem> findByUserIdAndAssignmentId(Long userId, Integer assignmentId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,9 @@
import com.example.Piroin.project.domain.assignment.entity.Assignment;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface AssignmentRepository extends JpaRepository<Assignment, Integer> {

List<Assignment> findByWeekOrderBySessionDateAsc(String week);
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.example.Piroin.project.domain.assignment.service;

import com.example.Piroin.project.domain.assignment.dto.CreateAssignmentRequest;
import com.example.Piroin.project.domain.assignment.dto.CreateAssignmentResponse;
import com.example.Piroin.project.domain.assignment.dto.ModifyAssignmentRequest;
import com.example.Piroin.project.domain.assignment.dto.ModifyAssignmentResponse;
import com.example.Piroin.project.domain.assignment.dto.*;
import com.example.Piroin.project.domain.assignment.entity.Assignment;
import com.example.Piroin.project.domain.assignment.entity.AssignmentItem;
import com.example.Piroin.project.domain.assignment.entity.DeleteAssignmentResponse;
Expand All @@ -18,6 +15,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.DayOfWeek;
import java.util.List;

@Service
Expand Down Expand Up @@ -94,4 +92,59 @@ public DeleteAssignmentResponse deleteAssignment(Integer assignmentId) {
return new DeleteAssignmentResponse(assignmentId);
}

// 4-1. 나의 과제 조회 (부원)
public GetMyAssignmentsResponse getMyAssignments(
Long userId,
String week
) {

List<Assignment> assignments =
assignmentRepository.findByWeekOrderBySessionDateAsc(week);

List<AssignmentInfoResponse> responses =
assignments.stream()
.map(assignment -> {

AssignmentStatus submittedStatus =
assignmentItemRepository
.findByUserIdAndAssignmentId(
userId,
assignment.getId()
)
.map(AssignmentItem::getSubmitted)
.orElse(AssignmentStatus.PENDING);

return AssignmentInfoResponse.builder()
.assignmentId(assignment.getId())
.title(assignment.getTitle())
.week(assignment.getWeek())
.sessionDate(assignment.getSessionDate().toString())
.day(convertDay(
assignment.getSessionDate().getDayOfWeek()
))
.submitted(submittedStatus)
.build();
})
.toList();

return GetMyAssignmentsResponse.builder()
.week(week)
.assignments(responses)
.build();
}

// 4-2. 날짜를 요일로 전환 함수
private String convertDay(DayOfWeek dayOfWeek) {

return switch (dayOfWeek) {
case MONDAY -> "MONDAY";
case TUESDAY -> "TUESDAY";
case WEDNESDAY -> "WEDNESDAY";
case THURSDAY -> "THURSDAY";
case FRIDAY -> "FRIDAY";
case SATURDAY -> "SATURDAY";
case SUNDAY -> "SUNDAY";
};
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public class AttendanceController {

// 1. 출석코드 비교
@PostMapping("/mark")
@Operation(summary = "출석코드 입력", description = "부원이 운영진이 알려준 출석코드를 입력하여 출석을 합니다.")
public ApiResponse<AttendanceMarkResponse> markAttendance(
@RequestBody MarkAttendanceReq req,
Authentication authentication
Expand Down Expand Up @@ -63,7 +64,7 @@ public ApiResponse<AttendanceMarkResponse> markAttendance(


// 2. 특정 유저의 출석 정보
@Operation(summary = "사용자 출석 정보 조회", description = "특정 사용자의 전체 출석 정보를 조회합니다.")
@Operation(summary = "사용자 전체 출석 정보 조회", description = "특정 사용자의 전체 출석 정보를 조회합니다.")
@ApiResponses({
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "조회 성공"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "잘못된 요청"),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,29 @@
package com.example.Piroin.project.domain.deposit.controller;

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;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/deposit")
@Tag(name = "보증금", description = "보증금 관련 API")
public class DepositController {
}

private final DepositService depositService;

@Operation(summary = "나의 보증금 조회", description = "사용자가 본인의 남은 보증금, 차감된 보증금, 방어권을 조회합니다.")
@GetMapping("/me")
public DepositResponse getMyDeposit(
Authentication authentication
) {

Long userId = Long.valueOf(authentication.getName());

return depositService.getMyDeposit(userId);
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.example.Piroin.project.domain.deposit.dto;

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class DepositResponse {

// 현재 남은 보증금
private Integer amount;

// 과제 차감 누적
private Integer descentAssignment;

// 출석 차감 누적
private Integer descentAttendance;

// 방어권 누적
private Integer ascentDefence;
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package com.example.Piroin.project.domain.deposit.exception;

import com.example.Piroin.project.domain.deposit.exception.code.DepositErrorCode;
import lombok.Getter;

@Getter
public class DepositException extends RuntimeException {
public DepositException(String message) {
super(message);

private final DepositErrorCode errorCode;

public DepositException(DepositErrorCode errorCode) {
super(errorCode.getMessage());
this.errorCode = errorCode;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
package com.example.Piroin.project.domain.deposit.exception.code;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;

@Getter
@RequiredArgsConstructor
public enum DepositErrorCode {
}

DEPOSIT_NOT_FOUND(
HttpStatus.BAD_REQUEST,
"DEPOSIT4001",
"보증금 정보가 존재하지 않습니다."
);

private final HttpStatus status;
private final String code;
private final String message;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@

public interface DepositRepository extends JpaRepository<Deposit, Long> {
Optional<Deposit> findByUser(User user);

Optional<Deposit> findByUserId(Long userId);
}
Original file line number Diff line number Diff line change
@@ -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.DepositResponse;
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;
import com.example.Piroin.project.domain.deposit.repository.DepositRepository;
import com.example.Piroin.project.domain.user.entity.User;
import com.example.Piroin.project.domain.user.repository.UserRepository;
Expand All @@ -19,6 +22,7 @@ public class DepositService {
private final UserRepository userRepository;
private final AttendanceRepository attendanceRepository;

// 보증금 재계산 로직 (운영진이 출석/과제 여부 수정 시)
@Transactional
public void recalculateDeposit(Long userId) {
User user = userRepository.findById(userId)
Expand All @@ -32,4 +36,22 @@ public void recalculateDeposit(Long userId) {

deposit.updateAttendanceAmount(descentAttendance);
}

// 보증금 조회 로직
public DepositResponse getMyDeposit(Long userId) {

Deposit deposit = depositRepository.findByUserId(userId)
.orElseThrow(() ->
new DepositException(
DepositErrorCode.DEPOSIT_NOT_FOUND
)
);

return DepositResponse.builder()
.amount(deposit.getAmount())
.descentAssignment(deposit.getDescentAssignment())
.descentAttendance(deposit.getDescentAttendance())
.ascentDefence(deposit.getAscentDefence())
.build();
}
}
Loading
Loading