diff --git a/.env b/.env new file mode 100644 index 0000000..3644943 --- /dev/null +++ b/.env @@ -0,0 +1,5 @@ +DB_HOST=13.125.37.4 +DB_PORT=5432 +DB_NAME=pirocheck +DB_USER=pirocheck +DB_PASSWORD=pirocheckdev \ No newline at end of file diff --git a/backend/pirocheck/build.gradle b/backend/pirocheck/build.gradle index db75dba..e46195c 100644 --- a/backend/pirocheck/build.gradle +++ b/backend/pirocheck/build.gradle @@ -44,6 +44,7 @@ dependencies { // Swagger implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.6' + } tasks.named('test') { diff --git a/backend/pirocheck/gradlew b/backend/pirocheck/gradlew old mode 100644 new mode 100755 diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/controller/AttendanceController.java similarity index 78% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/controller/AttendanceController.java index ac5847a..83db03b 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/controller/AttendanceController.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/controller/AttendanceController.java @@ -1,11 +1,10 @@ -package backend.pirocheck.attendence.controller; - -import backend.pirocheck.attendence.dto.request.GetAttendanceByDateReq; -import backend.pirocheck.attendence.dto.request.MarkAttendanceReq; -import backend.pirocheck.attendence.dto.response.AttendanceSlotRes; -import backend.pirocheck.attendence.dto.response.AttendanceStatusRes; -import backend.pirocheck.attendence.entity.AttendanceCode; -import backend.pirocheck.attendence.service.AttendanceService; +package backend.pirocheck.Attendance.controller; + +import backend.pirocheck.Attendance.dto.request.MarkAttendanceReq; +import backend.pirocheck.Attendance.dto.response.AttendanceSlotRes; +import backend.pirocheck.Attendance.dto.response.AttendanceStatusRes; +import backend.pirocheck.Attendance.entity.AttendanceCode; +import backend.pirocheck.Attendance.service.AttendanceService; import lombok.RequiredArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.*; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/GetAttendanceByDateReq.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/request/GetAttendanceByDateReq.java similarity index 75% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/GetAttendanceByDateReq.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/request/GetAttendanceByDateReq.java index d731fb4..456f384 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/GetAttendanceByDateReq.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/request/GetAttendanceByDateReq.java @@ -1,4 +1,4 @@ -package backend.pirocheck.attendence.dto.request; +package backend.pirocheck.Attendance.dto.request; import lombok.Getter; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/MarkAttendanceReq.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/request/MarkAttendanceReq.java similarity index 70% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/MarkAttendanceReq.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/request/MarkAttendanceReq.java index a6aad92..779ead3 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/request/MarkAttendanceReq.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/request/MarkAttendanceReq.java @@ -1,4 +1,4 @@ -package backend.pirocheck.attendence.dto.request; +package backend.pirocheck.Attendance.dto.request; import lombok.Getter; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceSlotRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceSlotRes.java similarity index 79% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceSlotRes.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceSlotRes.java index 81f0bbf..aa1a5cc 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceSlotRes.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceSlotRes.java @@ -1,4 +1,4 @@ -package backend.pirocheck.attendence.dto.response; +package backend.pirocheck.Attendance.dto.response; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceStatusRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceStatusRes.java similarity index 72% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceStatusRes.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceStatusRes.java index 2a965ac..7a0cfa4 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/AttendanceStatusRes.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/AttendanceStatusRes.java @@ -1,6 +1,5 @@ -package backend.pirocheck.attendence.dto.response; +package backend.pirocheck.Attendance.dto.response; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/GetAttendanceByUserIdRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/GetAttendanceByUserIdRes.java similarity index 80% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/GetAttendanceByUserIdRes.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/GetAttendanceByUserIdRes.java index 50fd6a4..7c4a1fa 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/dto/response/GetAttendanceByUserIdRes.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/dto/response/GetAttendanceByUserIdRes.java @@ -1,4 +1,4 @@ -package backend.pirocheck.attendence.dto.response; +package backend.pirocheck.Attendance.dto.response; import lombok.Getter; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/entity/Attendance.java similarity index 93% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/entity/Attendance.java index af9ce56..6c63eb7 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/Attendance.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/entity/Attendance.java @@ -1,4 +1,4 @@ -package backend.pirocheck.attendence.entity; +package backend.pirocheck.Attendance.entity; import backend.pirocheck.User.entity.User; import jakarta.persistence.*; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendanceCode.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/entity/AttendanceCode.java similarity index 90% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendanceCode.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/entity/AttendanceCode.java index 358bf29..92812eb 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/entity/AttendanceCode.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/entity/AttendanceCode.java @@ -1,4 +1,4 @@ -package backend.pirocheck.attendence.entity; +package backend.pirocheck.Attendance.entity; import jakarta.persistence.*; import lombok.Getter; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceCodeRepository.java similarity index 78% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceCodeRepository.java index 2c30b55..5b070b3 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceCodeRepository.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceCodeRepository.java @@ -1,6 +1,6 @@ -package backend.pirocheck.attendence.repository; +package backend.pirocheck.Attendance.repository; -import backend.pirocheck.attendence.entity.AttendanceCode; +import backend.pirocheck.Attendance.entity.AttendanceCode; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceRepository.java similarity index 69% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceRepository.java index 445f157..e06f6e9 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/repository/AttendanceRepository.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/repository/AttendanceRepository.java @@ -1,7 +1,7 @@ -package backend.pirocheck.attendence.repository; +package backend.pirocheck.Attendance.repository; -import backend.pirocheck.attendence.entity.Attendance; -import backend.pirocheck.attendence.entity.AttendanceCode; +import backend.pirocheck.User.entity.User; +import backend.pirocheck.Attendance.entity.Attendance; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -14,4 +14,7 @@ public interface AttendanceRepository extends JpaRepository { List findByUserId(Long userId); List findByUserIdAndDate(Long userId, LocalDate date); Optional findByUserIdAndDateAndOrder(Long userId, LocalDate date, int order); + + // 출석 실패 + int countByUserAndStatusFalse(User user); } diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/service/AttendanceService.java similarity index 92% rename from backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java rename to backend/pirocheck/src/main/java/backend/pirocheck/Attendance/service/AttendanceService.java index 42ffe8f..c1bcfb0 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/attendence/service/AttendanceService.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Attendance/service/AttendanceService.java @@ -1,14 +1,14 @@ -package backend.pirocheck.attendence.service; +package backend.pirocheck.Attendance.service; import backend.pirocheck.User.entity.Role; import backend.pirocheck.User.entity.User; import backend.pirocheck.User.repository.UserRepository; -import backend.pirocheck.attendence.dto.response.AttendanceSlotRes; -import backend.pirocheck.attendence.dto.response.AttendanceStatusRes; -import backend.pirocheck.attendence.entity.Attendance; -import backend.pirocheck.attendence.entity.AttendanceCode; -import backend.pirocheck.attendence.repository.AttendanceCodeRepository; -import backend.pirocheck.attendence.repository.AttendanceRepository; +import backend.pirocheck.Attendance.dto.response.AttendanceSlotRes; +import backend.pirocheck.Attendance.dto.response.AttendanceStatusRes; +import backend.pirocheck.Attendance.entity.Attendance; +import backend.pirocheck.Attendance.entity.AttendanceCode; +import backend.pirocheck.Attendance.repository.AttendanceCodeRepository; +import backend.pirocheck.Attendance.repository.AttendanceRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/controller/DepositController.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/controller/DepositController.java new file mode 100644 index 0000000..bb441a4 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/controller/DepositController.java @@ -0,0 +1,24 @@ +package backend.pirocheck.Deposit.controller; + + +import backend.pirocheck.Deposit.dto.DepositResDto; +import backend.pirocheck.Deposit.service.DepositService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.security.core.annotation.AuthenticationPrincipal; + +@RestController +@RequestMapping("/api/deposit") +@RequiredArgsConstructor +public class DepositController { + + private final DepositService depositService; + + @GetMapping("/{userId}") + public DepositResDto getDeposit(@PathVariable Long userId) { + return depositService.getDeposit(userId); + } +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/dto/DepositResDto.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/dto/DepositResDto.java new file mode 100644 index 0000000..d05dcdc --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/dto/DepositResDto.java @@ -0,0 +1,19 @@ +package backend.pirocheck.Deposit.dto; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DepositResDto { + private int amount; + private int descentAssignment; + private int descentAttendance; + private int ascentDefence; + +} 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 new file mode 100644 index 0000000..139e385 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/entity/Deposit.java @@ -0,0 +1,40 @@ +package backend.pirocheck.Deposit.entity; + +import backend.pirocheck.User.entity.User; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class Deposit { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", unique = true) + private User user; + + private int amount; // 현재 보증금 + private int descentAssignment; // 과제 차감 총합 + private int descentAttendance; // 출석 차감 총합 + private int ascentDefence; // 방어권 + + // 보증금 계산 + public void updateAmounts(int descentAssignment, int descentAttendance, int ascentDefence) { + this.descentAssignment = descentAssignment; + this.descentAttendance = descentAttendance; + this.ascentDefence = ascentDefence; + + int calculateAmount = 120000 - descentAssignment - descentAttendance + ascentDefence; + this.amount = Math.min(calculateAmount, 120000); // 12만원 넘어가지 않도록 + } + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/init/DepositInitRunner.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/init/DepositInitRunner.java new file mode 100644 index 0000000..f077db6 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/init/DepositInitRunner.java @@ -0,0 +1,37 @@ +package backend.pirocheck.Deposit.init; + +import backend.pirocheck.Deposit.entity.Deposit; +import backend.pirocheck.Deposit.repository.DepositRepository; +import backend.pirocheck.User.entity.User; +import backend.pirocheck.User.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class DepositInitRunner implements CommandLineRunner { + + private final DepositRepository depositRepository; + private final UserRepository userRepository; + + @Override + public void run(String... args) { + for (User user : userRepository.findAll()) { + if (!depositRepository.existsByUser(user)) { + // 보증금 레코드가 없으면 새로 생성 + Deposit deposit = Deposit.builder() + .user(user) + .amount(120000) + .descentAssignment(0) + .descentAttendance(0) + .ascentDefence(0) + .build(); + + depositRepository.save(deposit); + } + } + } + + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/repository/DepositRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/repository/DepositRepository.java new file mode 100644 index 0000000..d487b03 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/repository/DepositRepository.java @@ -0,0 +1,12 @@ +package backend.pirocheck.Deposit.repository; + +import backend.pirocheck.Deposit.entity.Deposit; +import backend.pirocheck.User.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface DepositRepository extends JpaRepository { + Deposit findByUser(User user); + boolean existsByUser(User user); // 중복 방지를 위한 존재 여부 확인 +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java new file mode 100644 index 0000000..d0c7927 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java @@ -0,0 +1,53 @@ +package backend.pirocheck.Deposit.service; + +import backend.pirocheck.Deposit.dto.DepositResDto; +import backend.pirocheck.Deposit.entity.Deposit; +import backend.pirocheck.Deposit.repository.DepositRepository; +import backend.pirocheck.User.entity.User; +import backend.pirocheck.User.repository.UserRepository; +import backend.pirocheck.Attendance.repository.AttendanceRepository; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class DepositService { + + private final DepositRepository depositRepository; + private final UserRepository userRepository; + private final AttendanceRepository attendanceRepository; + private final AssignmentRepository assignmentRepository; // 확인 + + @Transactional + public DepositResDto getDeposit(Long userId) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 유저입니다.")); + + Deposit deposit = depositRepository.findByUser(user); + + // 출석 실패 + int failAttendanceCount = attendanceRepository.countByUserAndStatusFalse(user); + int descentAttendance = failAttendanceCount * 10000; + + // 과제 실패 + int failAssignmentCount = assignmentRepository.countByUserAndSubmitted(user, SubmitStatus.FAIL); // 확인 + int weakAssignmentCount = assignmentRepository.countByUserAndSubmitted(user, SubmitStatus.WEAK); // 확인 + int descentAssignment = failAssignmentCount * 10_000 + weakAssignmentCount * 5_000; + + // 방어권 + int ascentDefence = deposit.getAscentDefence(); + + // 보증금 업데이트 + deposit.updateAmounts(descentAssignment, descentAttendance, ascentDefence); + depositRepository.save(deposit); + + return DepositResDto.builder() + .amount(deposit.getAmount()) + .descentAssignment(deposit.getDescentAssignment()) + .descentAttendance(deposit.getDescentAttendance()) + .ascentDefence(deposit.getAscentDefence()) + .build(); + + } +}