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 @@ -3,4 +3,4 @@
public enum Role {
ADMIN,
MEMBER
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,4 @@ public class User {

private Integer generation;

}
}
Original file line number Diff line number Diff line change
@@ -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<AssignmentRes> getAssignment(@PathVariable("userId") Long userId) {
// // 주차별 과제 제목, 요일별 과제 제목, 과제 상태 반환
// return assignmentService.search(userId);
// }
// 과제 주차별, 요일별 그룹화 JSON
@GetMapping("/grouped/{userId}")
public List<AssignmentWeekRes> getGroupedAssignments(@PathVariable Long userId) {
return assignmentService.search(userId);
}

// 과제 생성 API
@PostMapping("/signup")
public String signupAssignment(@RequestBody AssignmentReq assignmentReq) {
return assignmentService.create(assignmentReq);
}
}
Original file line number Diff line number Diff line change
@@ -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;

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

}
Original file line number Diff line number Diff line change
@@ -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<AssignmentDayRes> days;
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package backend.pirocheck.assignment.entity;

public enum AssignmentStatus {
SUCCESS, INSUFFICIENT, FAILURE;
}
Original file line number Diff line number Diff line change
@@ -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<Assignment, Integer> {

// 유저별 과제 목록 조회
List<Assignment> findByUserId(Long userId);

}
Original file line number Diff line number Diff line change
@@ -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<AssignmentRes> search(Long userId) {
// // 각 유저별 전체 과제 목록 조회 (userId를 어떻게 넘길 것인가?) search의 인자로 넘긴다...
// List<Assignment> assignments = assignmentRepository.findByUserId(userId);
//
// return assignments.stream()
// .map(assignment -> new AssignmentRes(assignment.getAssignmentName(), assignment.getWeek(), assignment.getSection(), assignment.getOrderNumber(), assignment.getSubmitted()))
// .toList();
// }
public List<AssignmentWeekRes> search(Long userId) {

List<Assignment> assignments = assignmentRepository.findByUserId(userId);
// week 기준으로 그룹화
Map<Long, List<Assignment>> weekGroup = assignments.stream()
.collect(Collectors.groupingBy(Assignment::getWeek)); // assignments를 week 별로 그룹핑

List<AssignmentWeekRes> assignmentResponses = new ArrayList<>();

for (Map.Entry<Long, List<Assignment>> entry : weekGroup.entrySet()) {
Long week = entry.getKey();
List<Assignment> assignmentList = entry.getValue();

// day를 기준으로 그룹핑
Map<Long, List<Assignment>> dayGroup = assignments.stream()
.collect(Collectors.groupingBy(Assignment::getSection));

List<AssignmentDayRes> assignmentDayResList = new ArrayList<>();

for (Map.Entry<Long, List<Assignment>> dayEntry : dayGroup.entrySet()) {
Long day = dayEntry.getKey();
List<Assignment> dayAssignmentList = dayEntry.getValue();

// 세부 과제명과 과제 결과를 리스트 형태로
List<AssignmentDetailRes> 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();
}
}
4 changes: 3 additions & 1 deletion backend/pirocheck/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
format_sql: true
open-in-view: false
Loading