From ce457f43b01759ee0f362e31d3f84ba0319eebb7 Mon Sep 17 00:00:00 2001 From: l-wanderer01 Date: Wed, 7 May 2025 00:34:07 +0900 Subject: [PATCH] =?UTF-8?q?[feat]=20=EC=9D=BC=EB=B0=98=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=20=EA=B3=BC=EC=A0=9C=20=EC=B2=B4=ED=81=AC=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/pirocheck/User/entity/Role.java | 6 ++ .../backend/pirocheck/User/entity/User.java | 35 ++++++++ .../controller/AssignmentController.java | 36 ++++++++ .../assignment/dto/request/AssignmentReq.java | 16 ++++ .../dto/response/AssignmentDayRes.java | 13 +++ .../dto/response/AssignmentDetailRes.java | 12 +++ .../dto/response/AssignmentRes.java | 18 ++++ .../dto/response/AssignmentWeekRes.java | 14 ++++ .../assignment/entity/Assignment.java | 49 +++++++++++ .../assignment/entity/AssignmentStatus.java | 5 ++ .../repository/AssignmentRepository.java | 15 ++++ .../assignment/service/AssignmentService.java | 83 +++++++++++++++++++ .../src/main/resources/application.yml | 4 +- 13 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/User/entity/Role.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/User/entity/User.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/controller/AssignmentController.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/request/AssignmentReq.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDayRes.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDetailRes.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentRes.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentWeekRes.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/Assignment.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/AssignmentStatus.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/repository/AssignmentRepository.java create mode 100644 backend/pirocheck/src/main/java/backend/pirocheck/assignment/service/AssignmentService.java diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/Role.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/Role.java new file mode 100644 index 0000000..5bb97bb --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/Role.java @@ -0,0 +1,6 @@ +package backend.pirocheck.User.entity; + +public enum Role { + ADMIN, + MEMBER +} \ No newline at end of file diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/User.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/User.java new file mode 100644 index 0000000..ad215b0 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/entity/User.java @@ -0,0 +1,35 @@ +package backend.pirocheck.User.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Table(name="users") +@NoArgsConstructor +@AllArgsConstructor +@Builder + +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String password; // 전화번호 일부 + + private String name; + + private String email; + + private String phone; + + @Enumerated(EnumType.STRING) + private Role role; // MEMBER or ADMIN + + private Integer generation; + +} \ No newline at end of file diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/controller/AssignmentController.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/controller/AssignmentController.java new file mode 100644 index 0000000..3552b44 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/controller/AssignmentController.java @@ -0,0 +1,36 @@ +package backend.pirocheck.assignment.controller; + +import backend.pirocheck.assignment.dto.request.AssignmentReq; +import backend.pirocheck.assignment.dto.response.AssignmentRes; +import backend.pirocheck.assignment.dto.response.AssignmentWeekRes; +import backend.pirocheck.assignment.service.AssignmentService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/assignment") +@RequiredArgsConstructor +public class AssignmentController { + + private final AssignmentService assignmentService; + + // 과제 결과 확인 API +// @GetMapping("/{userId}") +// public List getAssignment(@PathVariable("userId") Long userId) { +// // 주차별 과제 제목, 요일별 과제 제목, 과제 상태 반환 +// return assignmentService.search(userId); +// } + // 과제 주차별, 요일별 그룹화 JSON + @GetMapping("/grouped/{userId}") + public List getGroupedAssignments(@PathVariable Long userId) { + return assignmentService.search(userId); + } + + // 과제 생성 API + @PostMapping("/signup") + public String signupAssignment(@RequestBody AssignmentReq assignmentReq) { + return assignmentService.create(assignmentReq); + } +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/request/AssignmentReq.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/request/AssignmentReq.java new file mode 100644 index 0000000..3d1cfd6 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/request/AssignmentReq.java @@ -0,0 +1,16 @@ +package backend.pirocheck.assignment.dto.request; + +import backend.pirocheck.assignment.entity.AssignmentStatus; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class AssignmentReq { + + private String assignmentName; + private Long week; + private Long section; + private Long orderNumber; + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDayRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDayRes.java new file mode 100644 index 0000000..be325e6 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDayRes.java @@ -0,0 +1,13 @@ +package backend.pirocheck.assignment.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; + +@Getter +@AllArgsConstructor +public class AssignmentDayRes { + private String day; // 화, 목, 토 + private List details; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDetailRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDetailRes.java new file mode 100644 index 0000000..5a40dad --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentDetailRes.java @@ -0,0 +1,12 @@ +package backend.pirocheck.assignment.dto.response; + +import backend.pirocheck.assignment.entity.AssignmentStatus; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class AssignmentDetailRes { + private String assignmentName; + private AssignmentStatus status; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentRes.java new file mode 100644 index 0000000..c924848 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentRes.java @@ -0,0 +1,18 @@ +package backend.pirocheck.assignment.dto.response; + +import backend.pirocheck.assignment.entity.AssignmentStatus; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class AssignmentRes { + +// private Long userId; + private String assignmentName; + private Long week; + private Long section; + private Long orderNumber; + private AssignmentStatus submitted; + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentWeekRes.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentWeekRes.java new file mode 100644 index 0000000..4be2d26 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/dto/response/AssignmentWeekRes.java @@ -0,0 +1,14 @@ +package backend.pirocheck.assignment.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; + +@Getter +@AllArgsConstructor +public class AssignmentWeekRes { + private Long week; + private String title; // 각 주차 주제 (e.g, Git / HTML / CSS) + private List days; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/Assignment.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/Assignment.java new file mode 100644 index 0000000..62aa724 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/Assignment.java @@ -0,0 +1,49 @@ +package backend.pirocheck.assignment.entity; + +import backend.pirocheck.User.entity.User; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Builder(access = AccessLevel.PRIVATE) +@NoArgsConstructor +@AllArgsConstructor +public class Assignment { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + // user 정보와 과제 정보를 연결해 저장 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; // user를 생성했을 때의 해당 user 엔티티 + + // 과제명 + private String assignmentName; + + // 주차 + private Long week; + + // 요일 + private Long section; + + // 과제 번호 + private Long orderNumber; + + // 과제 결과 + @Enumerated(EnumType.STRING) + @Column(length = 100) + private AssignmentStatus submitted; + + // 관리자가 생성 + public static Assignment create(String assignmentName, Long week, Long section, Long orderNumber) { + return Assignment.builder() + .assignmentName(assignmentName) + .week(week) + .section(section) + .orderNumber(orderNumber) + .build(); + } +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/AssignmentStatus.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/AssignmentStatus.java new file mode 100644 index 0000000..dcc9466 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/entity/AssignmentStatus.java @@ -0,0 +1,5 @@ +package backend.pirocheck.assignment.entity; + +public enum AssignmentStatus { + SUCCESS, INSUFFICIENT, FAILURE; +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/repository/AssignmentRepository.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/repository/AssignmentRepository.java new file mode 100644 index 0000000..04ed3f5 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/repository/AssignmentRepository.java @@ -0,0 +1,15 @@ +package backend.pirocheck.assignment.repository; + +import backend.pirocheck.assignment.entity.Assignment; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface AssignmentRepository extends JpaRepository { + + // 유저별 과제 목록 조회 + List findByUserId(Long userId); + +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/assignment/service/AssignmentService.java b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/service/AssignmentService.java new file mode 100644 index 0000000..d98b74b --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/assignment/service/AssignmentService.java @@ -0,0 +1,83 @@ +package backend.pirocheck.assignment.service; + +import backend.pirocheck.assignment.dto.request.AssignmentReq; +import backend.pirocheck.assignment.dto.response.AssignmentDayRes; +import backend.pirocheck.assignment.dto.response.AssignmentDetailRes; +import backend.pirocheck.assignment.dto.response.AssignmentRes; +import backend.pirocheck.assignment.dto.response.AssignmentWeekRes; +import backend.pirocheck.assignment.entity.Assignment; +import backend.pirocheck.assignment.repository.AssignmentRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +@Transactional +@RequiredArgsConstructor +public class AssignmentService { + + private final AssignmentRepository assignmentRepository; + + // 그룹화 되지 않은 JSON 형식 +// public List search(Long userId) { +// // 각 유저별 전체 과제 목록 조회 (userId를 어떻게 넘길 것인가?) search의 인자로 넘긴다... +// List assignments = assignmentRepository.findByUserId(userId); +// +// return assignments.stream() +// .map(assignment -> new AssignmentRes(assignment.getAssignmentName(), assignment.getWeek(), assignment.getSection(), assignment.getOrderNumber(), assignment.getSubmitted())) +// .toList(); +// } + public List search(Long userId) { + + List assignments = assignmentRepository.findByUserId(userId); + // week 기준으로 그룹화 + Map> weekGroup = assignments.stream() + .collect(Collectors.groupingBy(Assignment::getWeek)); // assignments를 week 별로 그룹핑 + + List assignmentResponses = new ArrayList<>(); + + for (Map.Entry> entry : weekGroup.entrySet()) { + Long week = entry.getKey(); + List assignmentList = entry.getValue(); + + // day를 기준으로 그룹핑 + Map> dayGroup = assignments.stream() + .collect(Collectors.groupingBy(Assignment::getSection)); + + List assignmentDayResList = new ArrayList<>(); + + for (Map.Entry> dayEntry : dayGroup.entrySet()) { + Long day = dayEntry.getKey(); + List dayAssignmentList = dayEntry.getValue(); + + // 세부 과제명과 과제 결과를 리스트 형태로 + List assignmentDetailResList = dayAssignmentList.stream() + .map(assignment -> new AssignmentDetailRes( + assignment.getAssignmentName(), + assignment.getSubmitted() + )) + .toList(); + } + } + + return assignmentResponses; + } + + public String create(AssignmentReq assignmentReq) { + + Assignment assignment = Assignment.create( + assignmentReq.getAssignmentName(), + assignmentReq.getWeek(), + assignmentReq.getSection(), + assignmentReq.getOrderNumber()); + + assignment = assignmentRepository.save(assignment); + + return assignment.getAssignmentName(); + } +} diff --git a/backend/pirocheck/src/main/resources/application.yml b/backend/pirocheck/src/main/resources/application.yml index 656f19b..1416bb4 100644 --- a/backend/pirocheck/src/main/resources/application.yml +++ b/backend/pirocheck/src/main/resources/application.yml @@ -3,10 +3,12 @@ spring: url: jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME} username: ${DB_USER} password: ${DB_PASSWORD} + driver-class-name: org.postgresql.Driver jpa: hibernate: ddl-auto: update show-sql: true properties: hibernate: - format_sql: true \ No newline at end of file + format_sql: true + open-in-view: false \ No newline at end of file