Skip to content

Commit 369a407

Browse files
authored
Merge pull request #174 from pirogramming/frontend_admin_sj
Frontend admin sj
2 parents 3eb1ea2 + 78d51e4 commit 369a407

File tree

77 files changed

+2337
-350
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+2337
-350
lines changed
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package backend.pirocheck.Assignment.controller;
2+
3+
import backend.pirocheck.Assignment.dto.request.AssignmentCreateReq;
4+
import backend.pirocheck.Assignment.dto.request.AssignmentItemCreateReq;
5+
import backend.pirocheck.Assignment.dto.request.AssignmentItemUpdateReq;
6+
import backend.pirocheck.Assignment.dto.request.AssignmentUpdateReq;
7+
import backend.pirocheck.Assignment.dto.response.AssignmentWeekRes;
8+
import backend.pirocheck.Assignment.entity.AssignmentStatus;
9+
import backend.pirocheck.Assignment.service.AssignmentService;
10+
import io.swagger.v3.oas.annotations.Operation;
11+
import io.swagger.v3.oas.annotations.Parameter;
12+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
13+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
14+
import io.swagger.v3.oas.annotations.tags.Tag;
15+
import jakarta.validation.Valid;
16+
import lombok.RequiredArgsConstructor;
17+
import org.springframework.web.bind.annotation.*;
18+
19+
import java.util.List;
20+
21+
@RestController
22+
@RequestMapping("/api")
23+
@RequiredArgsConstructor
24+
@Tag(name = "과제관리", description = "과제 관련 API")
25+
public class AssignmentController {
26+
27+
private final AssignmentService assignmentService;
28+
29+
// 과제 결과 확인 API
30+
// 과제 주차별, 요일별 그룹화 JSON
31+
@Operation(summary = "학생별 과제 결과 확인", description = "관리자가 채점한 과제의 결과를 학생들이 확인합니다.")
32+
@ApiResponses(
33+
value = {
34+
@ApiResponse(responseCode = "200", description = "사용자별 과제 조회에 성공하였습니다."),
35+
@ApiResponse(responseCode = "400", description = "잘못된 요청입니다.")
36+
}
37+
)
38+
@GetMapping("/assignment/{userId}")
39+
public List<AssignmentWeekRes> getGroupedAssignments(
40+
@Parameter(description = "사용자 ID", example = "1")
41+
@PathVariable Long userId
42+
) {
43+
return assignmentService.search(userId);
44+
}
45+
46+
// 과제 생성 API
47+
@Operation(summary = "과제 생성 API", description = "관리자가 과제를 생성합니다.")
48+
@ApiResponses(
49+
value = {
50+
@ApiResponse(responseCode = "200", description = "과제 생성에 성공하였습니다."),
51+
@ApiResponse(responseCode = "400", description = "잘못된 요청입니다.")
52+
}
53+
)
54+
@PostMapping("/admin/assignment/signup")
55+
public String signupAssignment(
56+
@Valid
57+
@RequestBody AssignmentCreateReq assignmentCreateReq
58+
) {
59+
return assignmentService.createAssignment(assignmentCreateReq);
60+
}
61+
62+
// 과제 삭제 API
63+
@Operation(summary = "과제 삭제 API", description = "관리자가 과제를 삭제합니다.")
64+
@ApiResponses(
65+
value = {
66+
@ApiResponse(responseCode = "200", description = "과제 삭제에 성공하였습니다."),
67+
@ApiResponse(responseCode = "400", description = "잘못된 요청입니다.")
68+
}
69+
)
70+
@DeleteMapping("/admin/assignment/{assignmentId}")
71+
public String deleteAssignment(
72+
@Parameter(description = "과제 ID", example = "1")
73+
@PathVariable Long assignmentId
74+
) {
75+
return assignmentService.deleteAssignment(assignmentId);
76+
}
77+
78+
// 과제 수정 API
79+
@Operation(summary = "과제 수정 API", description = "관리자가 과제의 잘못된 부분을 수정합니다.")
80+
@ApiResponses(
81+
value = {
82+
@ApiResponse(responseCode = "200", description = "과제 수정에 성공하였습니다."),
83+
@ApiResponse(responseCode = "400", description = "잘못된 요청입니다.")
84+
}
85+
)
86+
@PutMapping("/admin/assignment/{assignmentId}")
87+
public String updateAssignment(
88+
@Parameter(description = "과제 ID", example = "1")
89+
@PathVariable("assignmentId") Long assignmentId,
90+
@RequestBody AssignmentUpdateReq assignmentUpdateReq
91+
) {
92+
return assignmentService.updateAssignment(assignmentId, assignmentUpdateReq);
93+
}
94+
95+
// 사용자별 과제 제출 결과 생성 API
96+
@Operation(summary = "관리자 과제 채점 API", description = "관리자가 사용자들의 과제를 채점한 결과 저장합니다.")
97+
@ApiResponses(
98+
value = {
99+
@ApiResponse(responseCode = "200", description = "사용자의 과제 채점 결과 저장에 성공하였습니다."),
100+
@ApiResponse(responseCode = "400", description = "잘못된 요청입니다.")
101+
}
102+
)
103+
@PostMapping("/admin/users/{userId}/assignments/{assignmentId}/submission")
104+
public AssignmentStatus submissionAssignment(
105+
@Parameter(description = "사용자 ID", example = "1")
106+
@PathVariable Long userId,
107+
@Parameter(description = "과제 ID", example = "1")
108+
@PathVariable Long assignmentId,
109+
@RequestBody AssignmentItemCreateReq req
110+
) {
111+
return assignmentService.createAssignmentItem(userId, assignmentId, req);
112+
}
113+
114+
// 사용자별 과제 제출 여부 수정 API
115+
@Operation(summary = "관리자 과제 채점 내용 수정 API", description = "관리자가 사용자의 과제 결과를 수정하여 저장합니다.")
116+
@ApiResponses(
117+
value = {
118+
@ApiResponse(responseCode = "200", description = "사용자 과제 채점 결과 수정에 성공하였습니다."),
119+
@ApiResponse(responseCode = "400", description = "잘못된 요청입니다.")
120+
}
121+
)
122+
@PutMapping("/admin/users/{userId}/assignments/{assignmentId}/submission")
123+
public AssignmentStatus updateSubmission(
124+
@Parameter(description = "사용자 ID", example = "1")
125+
@PathVariable Long userId,
126+
@Parameter(description = "과제 ID", example = "1")
127+
@PathVariable Long assignmentId,
128+
@RequestBody AssignmentItemUpdateReq req
129+
) {
130+
return assignmentService.updateAssignmentItem(userId, assignmentId, req);
131+
}
132+
133+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package backend.pirocheck.Assignment.dto.request;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.NotNull;
6+
import jakarta.validation.constraints.Positive;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Getter;
9+
10+
@Getter
11+
@AllArgsConstructor
12+
public class AssignmentCreateReq {
13+
14+
@Schema(description = "과제 주제", example = "Git/HTML/CSS")
15+
@NotNull(message = "과제 주제는 필수입니다.")
16+
private String subject;
17+
18+
@Schema(description = "과제명", example = "제로초 인강")
19+
@NotNull(message = "과제명은 필수입니다.")
20+
private String assignmentName;
21+
22+
@Schema(description = "주차", example = "1")
23+
@Positive
24+
private Long week;
25+
26+
@Schema(description = "요일", example = "화")
27+
@NotBlank(message = "요일을 입력해주세요.")
28+
private String day;
29+
30+
@Schema(description = "해당 일자 과제 numbering", example = "1")
31+
private Long orderNumber;
32+
33+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package backend.pirocheck.Assignment.dto.request;
2+
3+
import backend.pirocheck.Assignment.entity.AssignmentStatus;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import jakarta.validation.constraints.Pattern;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
@Getter
11+
@NoArgsConstructor
12+
@AllArgsConstructor
13+
public class AssignmentItemCreateReq {
14+
15+
private Long assignmentId;
16+
17+
private Long userId;
18+
19+
@Pattern(regexp = "SUCCESS/INSUFFICIENT/FAILURE", message = "status는 SUCCESS, INSUFFICIENT 혹은 FAILURE 여야 합니다.")
20+
@Schema(description = "과제 결과", example = "SUCCESS")
21+
private AssignmentStatus status;
22+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package backend.pirocheck.Assignment.dto.request;
2+
3+
import backend.pirocheck.Assignment.entity.AssignmentStatus;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import jakarta.validation.constraints.Pattern;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
@Getter
10+
@NoArgsConstructor
11+
public class AssignmentItemUpdateReq {
12+
13+
@Pattern(regexp = "SUCCESS/INSUFFICIENT/FAILURE", message = "status는 SUCCESS, INSUFFICIENT 혹은 FAILURE 여야 합니다.")
14+
@Schema(description = "과제 결과", example = "SUCCESS")
15+
private AssignmentStatus status;
16+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package backend.pirocheck.Assignment.dto.request;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.NotNull;
6+
import jakarta.validation.constraints.Positive;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Getter;
9+
10+
@Getter
11+
@AllArgsConstructor
12+
public class AssignmentUpdateReq {
13+
14+
@Schema(description = "과제 주제", example = "Git/HTML/CSS")
15+
@NotNull(message = "과제 주제는 필수입니다.")
16+
private String subject;
17+
18+
@Schema(description = "과제명", example = "제로초 인강")
19+
@NotNull(message = "과제명은 필수입니다.")
20+
private String assignmentName;
21+
22+
@Schema(description = "주차", example = "1")
23+
@Positive
24+
private Long week;
25+
26+
@Schema(description = "요일", example = "화")
27+
@NotBlank(message = "요일을 입력해주세요.")
28+
private String day;
29+
30+
@Schema(description = "해당 일자 과제 numbering", example = "1")
31+
private Long orderNumber;
32+
33+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package backend.pirocheck.assignment.dto.response;
1+
package backend.pirocheck.Assignment.dto.response;
22

33
import lombok.AllArgsConstructor;
44
import lombok.Getter;
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package backend.pirocheck.assignment.dto.response;
1+
package backend.pirocheck.Assignment.dto.response;
22

3-
import backend.pirocheck.assignment.entity.AssignmentStatus;
3+
import backend.pirocheck.Assignment.entity.AssignmentStatus;
44
import lombok.AllArgsConstructor;
55
import lombok.Getter;
66

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package backend.pirocheck.assignment.dto.response;
1+
package backend.pirocheck.Assignment.dto.response;
22

3-
import backend.pirocheck.assignment.entity.AssignmentStatus;
3+
import backend.pirocheck.Assignment.entity.AssignmentStatus;
44
import lombok.AllArgsConstructor;
55
import lombok.Getter;
66

@@ -11,7 +11,7 @@ public class AssignmentRes {
1111
// private Long userId;
1212
private String assignmentName;
1313
private Long week;
14-
private Long section;
14+
private String day;
1515
private Long orderNumber;
1616
private AssignmentStatus submitted;
1717

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package backend.pirocheck.assignment.dto.response;
1+
package backend.pirocheck.Assignment.dto.response;
22

33
import lombok.AllArgsConstructor;
44
import lombok.Getter;
@@ -9,6 +9,6 @@
99
@AllArgsConstructor
1010
public class AssignmentWeekRes {
1111
private Long week;
12-
private String title; // 각 주차 주제 (e.g, Git / HTML / CSS)
12+
private String subject; // 각 주차 주제 (e.g, Git / HTML / CSS)
1313
private List<AssignmentDayRes> days;
1414
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package backend.pirocheck.Assignment.entity;
2+
3+
import io.swagger.v3.oas.annotations.tags.Tag;
4+
import jakarta.persistence.*;
5+
import lombok.*;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
@Entity
11+
@Getter
12+
@Builder(access = AccessLevel.PRIVATE)
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
@Tag(name = "과제 관리", description = "과제 관련 API")
16+
public class Assignment {
17+
18+
@Id
19+
@GeneratedValue(strategy = GenerationType.IDENTITY)
20+
private Long id;
21+
22+
// 전체 주제
23+
private String subject;
24+
25+
// 과제명
26+
private String assignmentName;
27+
28+
// 주차
29+
private Long week;
30+
31+
// 요일
32+
private String day;
33+
34+
// 과제 번호
35+
private Long orderNumber;
36+
37+
// AssignmentItem 입장에서 "assignment" 필드의 외래 키를 가진 주인
38+
// assignment를 참조하는 assignmentitem 컬랙션을 가짐
39+
@OneToMany(mappedBy = "assignment", cascade = CascadeType.ALL, orphanRemoval = true)
40+
@Builder.Default
41+
private List<AssignmentItem> assignments = new ArrayList<>();
42+
43+
// 연관관계 편의 메서드 (양방향 시 자주 사용)
44+
public void addAssignmentItem(AssignmentItem assignmentItem) {
45+
this.assignments.add(assignmentItem);
46+
assignmentItem.setAssignment(this);
47+
}
48+
49+
// 관리자가 생성
50+
public static Assignment create(String subject, String assignmentName, Long week, String day, Long orderNumber) {
51+
return Assignment.builder()
52+
.subject(subject)
53+
.assignmentName(assignmentName)
54+
.week(week)
55+
.day(day)
56+
.orderNumber(orderNumber)
57+
.build();
58+
}
59+
60+
// 과제 내용 업데이트
61+
public void update(String subject, String assignmentName, Long week, String day, Long orderNumber) {
62+
this.subject = subject;
63+
this.assignmentName = assignmentName;
64+
this.week = week;
65+
this.day = day;
66+
this.orderNumber = orderNumber;
67+
}
68+
}

0 commit comments

Comments
 (0)