Skip to content

Commit ed879c8

Browse files
authored
Merge pull request #84 from MJSEC-MJU/feat/AssignStatus
Feat/assign status
2 parents 213f8f5 + 201cf26 commit ed879c8

12 files changed

Lines changed: 350 additions & 24 deletions

src/main/java/com/mjsec/lms/controller/AssignmentController.java

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.mjsec.lms.service.AssignmentSubmissionService;
77
import com.mjsec.lms.service.PlanService;
88
import com.mjsec.lms.type.ResponseMessage;
9+
import com.mjsec.lms.type.SubmissionStatus;
910
import com.mjsec.lms.util.IpUtils;
1011
import com.mjsec.lms.util.ValidationUtils;
1112
import jakarta.servlet.http.HttpServletRequest;
@@ -291,7 +292,7 @@ public ResponseEntity<SuccessResponse<Void>> leaveFeedback(
291292
@PathVariable Long groupId,
292293
@PathVariable Long planId,
293294
@PathVariable Long submitId,
294-
@RequestBody SubmissionFeedbackDto dto,
295+
@Valid @RequestBody SubmissionFeedbackDto dto,
295296
Authentication authentication){
296297

297298
// JwtFilter에서 설정한 studentNumber를 가져옴
@@ -313,7 +314,7 @@ public ResponseEntity<SuccessResponse<SubmissionFeedbackDto>> updateFeedback(
313314
@PathVariable Long groupId,
314315
@PathVariable Long planId,
315316
@PathVariable Long submitId,
316-
@RequestBody SubmissionFeedbackDto dto,
317+
@Valid @RequestBody SubmissionFeedbackDto dto,
317318
Authentication authentication){
318319

319320
// JwtFilter에서 설정한 studentNumber를 가져옴
@@ -323,7 +324,8 @@ public ResponseEntity<SuccessResponse<SubmissionFeedbackDto>> updateFeedback(
323324

324325
return ResponseEntity.ok(
325326
SuccessResponse.of(
326-
ResponseMessage.FEEDBACK_UPDATE_SUCCESS
327+
ResponseMessage.FEEDBACK_UPDATE_SUCCESS,
328+
submissionFeedbackDto
327329
)
328330
);
329331
}
@@ -347,4 +349,67 @@ public ResponseEntity<SuccessResponse<Void>> deleteFeedback(
347349
)
348350
);
349351
}
352+
353+
//과제 상태별 조회 API
354+
@GetMapping("/{groupId}/assignment/submit/{planId}/status/{status}")
355+
public ResponseEntity<SuccessResponse<List<SubmissionResponse>>> getSubmissionsByStatus(
356+
@PathVariable Long groupId,
357+
@PathVariable Long planId,
358+
@PathVariable SubmissionStatus status,
359+
Authentication authentication) {
360+
361+
Long currentUserStudentNumber = (Long) authentication.getPrincipal();
362+
363+
List<SubmissionResponse> submissionResponseList = assignmentSubmissionService.getSubmissionsByStatus(
364+
groupId, planId, status, currentUserStudentNumber);
365+
366+
return ResponseEntity.ok(
367+
SuccessResponse.of(
368+
ResponseMessage.ASSIGNMENT_SUBMIT_CHECK_SUCCESS,
369+
submissionResponseList
370+
)
371+
);
372+
}
373+
374+
// 멘티용 수정 필요한 과제 조회 API <- 필요할까 싶기도 함 일단 추가함.
375+
@GetMapping("/{groupId}/assignment/submit/{planId}/revision-required")
376+
public ResponseEntity<SuccessResponse<List<SubmissionResponse>>> getRevisionRequiredSubmissions(
377+
@PathVariable Long groupId,
378+
@PathVariable Long planId,
379+
Authentication authentication) {
380+
381+
Long currentUserStudentNumber = (Long) authentication.getPrincipal();
382+
383+
// REVISION_REQUIRED 상태인 과제들 조회
384+
List<SubmissionResponse> submissionResponseList = assignmentSubmissionService.getSubmissionsByStatus(
385+
groupId, planId, SubmissionStatus.REVISION_REQUIRED, currentUserStudentNumber);
386+
387+
return ResponseEntity.ok(
388+
SuccessResponse.of(
389+
ResponseMessage.REVISION_REQUIRED_SUBMISSIONS_SUCCESS,
390+
submissionResponseList
391+
)
392+
);
393+
}
394+
395+
// 과제 상태 통계 조회 API (멘토용)
396+
@GetMapping("/{groupId}/assignment/submit/{planId}/statistics")
397+
public ResponseEntity<SuccessResponse<SubmissionStatisticsResponse>> getSubmissionStatistics(
398+
@PathVariable Long groupId,
399+
@PathVariable Long planId,
400+
Authentication authentication) {
401+
402+
// JwtFilter에서 설정한 studentNumber를 가져옴
403+
Long currentUserStudentNumber = (Long) authentication.getPrincipal();
404+
405+
SubmissionStatisticsResponse statistics = assignmentSubmissionService.getSubmissionStatistics(
406+
groupId, planId, currentUserStudentNumber);
407+
408+
return ResponseEntity.ok(
409+
SuccessResponse.of(
410+
ResponseMessage.SUBMISSION_STATISTICS_SUCCESS,
411+
statistics
412+
)
413+
);
414+
}
350415
}

src/main/java/com/mjsec/lms/domain/AssignmentSubmission.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.mjsec.lms.domain;
22

3+
import com.mjsec.lms.type.SubmissionStatus;
34
import jakarta.persistence.*;
45
import lombok.*;
56
import lombok.experimental.SuperBuilder;
@@ -36,6 +37,11 @@ public class AssignmentSubmission extends BaseEntity {
3637
@Column(name = "feedback", columnDefinition = "TEXT")
3738
private String feedback;
3839

40+
@Enumerated(EnumType.STRING)
41+
@Column(name = "status", nullable = false, length = 20)
42+
@Builder.Default
43+
private SubmissionStatus status = SubmissionStatus.SUBMITTED;
44+
3945
// 연관관계 매핑
4046
@ManyToOne(fetch = FetchType.LAZY)
4147
@JoinColumn(name = "user_id")

src/main/java/com/mjsec/lms/dto/DetailSubmissionResponse.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.mjsec.lms.dto;
22

3+
import com.mjsec.lms.type.SubmissionStatus;
34
import lombok.Builder;
45
import lombok.Data;
56

@@ -19,6 +20,8 @@ public class DetailSubmissionResponse {
1920

2021
private String feedback;
2122

23+
private SubmissionStatus status;
24+
2225
private LocalDateTime createdAt;
2326

2427
private LocalDateTime updatedAt;

src/main/java/com/mjsec/lms/dto/SubmissionFeedbackDto.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.mjsec.lms.dto;
22

3+
import com.mjsec.lms.type.SubmissionStatus;
4+
import jakarta.validation.constraints.NotNull;
35
import lombok.AllArgsConstructor;
46
import lombok.Builder;
57
import lombok.Data;
@@ -12,5 +14,7 @@
1214
public class SubmissionFeedbackDto {
1315

1416
private String feedback;
15-
17+
18+
@NotNull(message = "과제 상태는 필수입니다.")
19+
private SubmissionStatus status;
1620
}

src/main/java/com/mjsec/lms/dto/SubmissionResponse.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.mjsec.lms.dto;
22

3+
import com.mjsec.lms.type.SubmissionStatus;
34
import lombok.Builder;
45
import lombok.Data;
56

@@ -16,5 +17,7 @@ public class SubmissionResponse {
1617

1718
private String creatorName;
1819

20+
private SubmissionStatus status;
21+
1922
private LocalDateTime createdAt;
2023
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.mjsec.lms.dto;
2+
3+
import lombok.Builder;
4+
import lombok.Data;
5+
6+
@Data
7+
@Builder
8+
public class SubmissionStatisticsResponse {
9+
10+
private int totalMentees; // 전체 멘티 수
11+
private int submittedCount; // 제출 완료 상태
12+
private int completedCount; // 과제 완료 상태
13+
private int revisionRequiredCount; // 수정 필요 상태
14+
private int notSubmittedCount; // 미제출 수
15+
16+
}

src/main/java/com/mjsec/lms/repository/SubmissionRepository.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.mjsec.lms.repository;
22

33
import com.mjsec.lms.domain.AssignmentSubmission;
4-
import com.mjsec.lms.domain.StudyGroup;
54
import com.mjsec.lms.domain.User;
5+
import com.mjsec.lms.type.SubmissionStatus;
66
import org.springframework.data.jpa.repository.JpaRepository;
77
import org.springframework.data.jpa.repository.Modifying;
88
import org.springframework.data.jpa.repository.Query;
@@ -37,4 +37,17 @@ public interface SubmissionRepository extends JpaRepository<AssignmentSubmission
3737
"WHERE a.submitter.userId = :userId " +
3838
"AND a.plan.studyGroup.studyId = :studyId")
3939
List<Long> findIdsByUserIdAndStudyGroupId(@Param("userId") Long userId, @Param("studyId") Long studyId);
40+
41+
// 특정 과제의 특정 상태 제출물들 조회
42+
List<AssignmentSubmission> findByPlanPlanIdAndStatus(Long planId, SubmissionStatus status);
43+
44+
// 특정 사용자의 특정 과제의 특정 상태 제출물들 조회
45+
List<AssignmentSubmission> findByPlanPlanIdAndSubmitterUserIdAndStatus(Long planId, Long submitterUserId, SubmissionStatus status);
46+
47+
int countByPlanPlanIdAndStatus(Long planId, SubmissionStatus status);
48+
49+
// 특정 과제에 제출한 고유 제출자 수 조회 (미제출자 계산용)
50+
@Query("SELECT COUNT(DISTINCT a.submitter.userId) FROM AssignmentSubmission a WHERE a.plan.planId = :planId")
51+
int countDistinctSubmittersByPlanId(@Param("planId") Long planId);
52+
4053
}

0 commit comments

Comments
 (0)