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
Expand Up @@ -2,13 +2,11 @@

import backend.pirocheck.User.entity.User;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.*;

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
Expand Down Expand Up @@ -37,4 +35,12 @@ public void updateAmounts(int descentAssignment, int descentAttendance, int asce
this.amount = Math.min(calculateAmount, 120000); // 12만원 넘어가지 않도록
}

// 방어권 업데이트
public void updateDefence(int newAscentDefence) {
this.ascentDefence = newAscentDefence;
int calculateAmount = 120000 - this.descentAssignment - this.descentAttendance + newAscentDefence;
this.amount = Math.min(calculateAmount, 120000);

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package backend.pirocheck.ManageStudents.Controller;

import backend.pirocheck.ManageStudents.dto.request.DefenceUpdateReqDto;
import backend.pirocheck.ManageStudents.dto.response.ManageStudentDetailResDto;
import backend.pirocheck.ManageStudents.dto.response.ManageStudentsListResDto;
import backend.pirocheck.ManageStudents.service.ManageStudentsService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/admin/managestudent")
@RequiredArgsConstructor
public class ManageStudentsController {

private final ManageStudentsService manageStudentsService;

// 수강생 리스트 조회
@GetMapping("")
public List<ManageStudentsListResDto> getStudents(@RequestParam(required = false) String name) {
return manageStudentsService.searchMembers(name);
}

// 수강생 상세 조회
@GetMapping("/{studentId}")
public ManageStudentDetailResDto getStudentDetail(@PathVariable Long studentId) {
return manageStudentsService.getMemberDetail(studentId);
}

// 방어권 업데이트
@PatchMapping("/{studentId}/defence")
public void updateDefence(@PathVariable Long studentId, @RequestBody DefenceUpdateReqDto req) {
manageStudentsService.updateDefence(studentId, req.getDefence());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package backend.pirocheck.ManageStudents.dto.request;


import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class DefenceUpdateReqDto {
private int defence;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package backend.pirocheck.ManageStudents.dto.response;

import lombok.Builder;
import lombok.Getter;

import java.util.List;

@Getter
@Builder
public class ManageStudentDetailResDto {

private String name;
private int deposit;
private int defence; // 방어권
private List<String> assignmentTitles; // 과제 제목 리스트
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package backend.pirocheck.ManageStudents.dto.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class ManageStudentsListResDto {

private Long id;
private String name;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package backend.pirocheck.ManageStudents.service;

import backend.pirocheck.Deposit.entity.Deposit;
import backend.pirocheck.Deposit.repository.DepositRepository;
import backend.pirocheck.ManageStudents.dto.response.ManageStudentDetailResDto;
import backend.pirocheck.ManageStudents.dto.response.ManageStudentsListResDto;
import backend.pirocheck.User.entity.Role;
import backend.pirocheck.User.entity.User;
import backend.pirocheck.User.repository.UserRepository;
import backend.pirocheck.assignment.entity.Assignment;
import backend.pirocheck.assignment.repository.AssignmentRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class ManageStudentsService {

private final UserRepository userRepository;
private final DepositRepository depositRepository;
private final AssignmentRepository assignmentRepository;

// 수강생 조회
public List<ManageStudentsListResDto> searchMembers(String name) {
List<User> users;

if(name == null || name.isBlank()) {
// 검색어가 없으면 맴버 전체 조회
users = userRepository.findByRole(Role.MEMBER);
}
else {
// 이름 검색
users = userRepository.findByNameContainingAndRole(name, Role.MEMBER);
}

return users.stream()
.map(user -> new ManageStudentsListResDto(user.getId(), user.getName()))
.collect(Collectors.toList());
}

// 수강생 상세 조회
public ManageStudentDetailResDto getMemberDetail(Long studentId) {
// User 조회
User user = userRepository.findById(studentId)
.orElseThrow(() -> new RuntimeException("해당 맴버가 존재하지 않습니다."));

// deposit 조회
Deposit deposit = depositRepository.findByUser(user);
if (deposit == null) {
throw new RuntimeException("해당 수강생의 보증금 정보가 없습니다.");
}

// Assignment 리스트 조회
List<Assignment> assignments = assignmentRepository.findByUserId(studentId);

// 과제 제목만 리스트로 변환
List<String> assignmentTitles = assignments.stream()
.map(Assignment::getAssignmentName)
.toList();

// ManageStudentDetailResDto 조립
return ManageStudentDetailResDto.builder()
.name(user.getName())
.deposit(deposit.getAmount())
.defence(deposit.getAscentDefence())
.assignmentTitles(assignmentTitles)
.build();
}

// 방어권 업데이트
public void updateDefence(Long studentId, int defence) {
User user = userRepository.findById(studentId)
.orElseThrow(() -> new RuntimeException("해당 수강생의 보증금 정보가 없습니다."));
Deposit deposit = depositRepository.findByUser(user);

// 업데이트
deposit.updateDefence(defence);

// 저장
depositRepository.save(deposit);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,12 @@ public ResponseEntity<ApiResponse<?>> handleInvalidLoginException(InvalidLoginEx
.status(HttpStatus.UNAUTHORIZED) // 401 상태 코드
.body(ApiResponse.error(e.getMessage())); // 에러 메시지 전달
}

// RuntimeException (유저관리 상세페이지)
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<ApiResponse<?>> handleRuntimeException(RuntimeException ex) {
return ResponseEntity
.status(HttpStatus.BAD_REQUEST) // 404
.body(ApiResponse.error(ex.getMessage()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,7 @@ public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByName(String name);

List<User> findByRole(Role role);

// 학생 이름으로 검색기능
List<User> findByNameContainingAndRole(String name, Role role);
}