Skip to content
Closed
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
5 changes: 5 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
DB_HOST=13.125.37.4
DB_PORT=5432
DB_NAME=pirocheck
DB_USER=pirocheck
DB_PASSWORD=pirocheckdev
1 change: 1 addition & 0 deletions backend/pirocheck/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ dependencies {

// Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.6'

}

tasks.named('test') {
Expand Down
Empty file modified backend/pirocheck/gradlew
100644 → 100755
Empty file.
Original file line number Diff line number Diff line change
@@ -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.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package backend.pirocheck.attendence.dto.request;
package backend.pirocheck.Attendance.dto.request;

import lombok.Getter;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package backend.pirocheck.attendence.dto.request;
package backend.pirocheck.Attendance.dto.request;

import lombok.Getter;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package backend.pirocheck.attendence.dto.response;
package backend.pirocheck.Attendance.dto.response;

import lombok.AllArgsConstructor;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package backend.pirocheck.attendence.dto.response;
package backend.pirocheck.Attendance.dto.response;

import lombok.Getter;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package backend.pirocheck.attendence.entity;
package backend.pirocheck.Attendance.entity;

import backend.pirocheck.User.entity.User;
import jakarta.persistence.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package backend.pirocheck.attendence.entity;
package backend.pirocheck.Attendance.entity;

import jakarta.persistence.*;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -14,4 +14,7 @@ public interface AttendanceRepository extends JpaRepository<Attendance, Long> {
List<Attendance> findByUserId(Long userId);
List<Attendance> findByUserIdAndDate(Long userId, LocalDate date);
Optional<Attendance> findByUserIdAndDateAndOrder(Long userId, LocalDate date, int order);

// 출석 실패
int countByUserAndStatusFalse(User user);
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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;

}
Original file line number Diff line number Diff line change
@@ -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만원 넘어가지 않도록
}

}
Original file line number Diff line number Diff line change
@@ -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);
}
}
}


}
Original file line number Diff line number Diff line change
@@ -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, Long> {
Deposit findByUser(User user);
boolean existsByUser(User user); // 중복 방지를 위한 존재 여부 확인
}
Original file line number Diff line number Diff line change
@@ -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();

}
}
Loading