From cfab55d12bb769097ce2db50b5648af27972ea4a Mon Sep 17 00:00:00 2001 From: vibha1019 Date: Wed, 19 Aug 2026 21:40:07 -0700 Subject: [PATCH 1/2] Add AI summary field and related functionality to assignment submissions --- .../mvc/assignments/AssignmentSubmission.java | 3 ++ .../AssignmentSubmissionAPIController.java | 38 ++++++++++++++++++- .../AssignmentSubmissionReturnDto.java | 2 + .../AssignmentSubmissionViewController.java | 7 +++- 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmission.java b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmission.java index 08b7c875..939d2f2c 100644 --- a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmission.java +++ b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmission.java @@ -63,6 +63,9 @@ public class AssignmentSubmission { private Double grade; private String feedback; + @Column(columnDefinition = "text") + private String aiSummary; + private String comment; private Long assignmentid; diff --git a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionAPIController.java b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionAPIController.java index d49653bc..45aeb2a5 100644 --- a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionAPIController.java +++ b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionAPIController.java @@ -300,10 +300,11 @@ public ResponseEntity updateSubmission( submission.setComment(comment == null ? "" : comment); submission.setIsLate(Boolean.TRUE.equals(isLate)); - // Only clear grade/feedback when the submission content actually changed + // Only clear grade/feedback/AI summary when the submission content actually changed if (contentChanged) { submission.setGrade(null); submission.setFeedback(null); + submission.setAiSummary(null); } AssignmentSubmission savedSubmission = submissionRepo.save(submission); @@ -350,6 +351,41 @@ public ResponseEntity gradeSubmission( return ResponseEntity.ok(new AssignmentSubmissionReturnDto(savedSubmission)); } + /** + * Persist an AI-generated summary for a submission (admin/teacher only). + * + * @param submissionId the ID of the submission being summarized + * @param summary the generated summary text + * @return a ResponseEntity indicating success or an error if the submission is not found + */ + @PostMapping("/summary/{submissionId}") + @Transactional + public ResponseEntity saveSubmissionSummary( + @PathVariable Long submissionId, + @AuthenticationPrincipal UserDetails userDetails, + @RequestParam String summary + ) { + Person currentUser = getAuthenticatedPerson(userDetails); + if (currentUser == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED) + .body(Map.of("error", "Authentication required")); + } + if (!canGradeOrDeleteSubmission(currentUser)) { + return ResponseEntity.status(HttpStatus.FORBIDDEN) + .body(Map.of("error", "Admin or teacher access required")); + } + + AssignmentSubmission submission = submissionRepo.findById(submissionId).orElse(null); + if (submission == null) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Map.of("error", "Submission not found")); + } + + submission.setAiSummary(summary); + AssignmentSubmission savedSubmission = submissionRepo.save(submission); + return ResponseEntity.ok(new AssignmentSubmissionReturnDto(savedSubmission)); + } + /** * Delete an existing assignment submission. * diff --git a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionReturnDto.java b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionReturnDto.java index a3e02107..cb1fec54 100644 --- a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionReturnDto.java +++ b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionReturnDto.java @@ -21,6 +21,7 @@ public class AssignmentSubmissionReturnDto { public Double grade; public String feedback; public Boolean isLate; + public String aiSummary; public AssignmentSubmissionReturnDto(AssignmentSubmission submission) { this.id = submission.getId(); @@ -32,5 +33,6 @@ public AssignmentSubmissionReturnDto(AssignmentSubmission submission) { this.grade = submission.getGrade(); this.feedback = submission.getFeedback(); this.isLate = submission.getIsLate(); + this.aiSummary = submission.getAiSummary(); } } \ No newline at end of file diff --git a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionViewController.java b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionViewController.java index da726930..d86f576a 100644 --- a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionViewController.java +++ b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionViewController.java @@ -153,6 +153,7 @@ public static class SubmissionListDTO { private String feedback; private Boolean isLate; private Boolean isGroup; + private String aiSummary; // Private constructor for factory use private SubmissionListDTO() {} @@ -211,14 +212,16 @@ public static SubmissionListDTO from(AssignmentSubmission submission) { dto.grade = submission.getGrade(); dto.feedback = submission.getFeedback() != null ? submission.getFeedback() : ""; dto.isLate = submission.getIsLate() != null ? submission.getIsLate() : false; + dto.aiSummary = submission.getAiSummary(); } catch (Exception e) { dto.content = null; dto.comment = ""; dto.grade = null; dto.feedback = ""; dto.isLate = false; + dto.aiSummary = null; } - + return dto; } @@ -239,6 +242,7 @@ public static SubmissionListDTO createFallback(AssignmentSubmission submission) dto.grade = null; dto.feedback = ""; dto.isLate = false; + dto.aiSummary = null; } catch (Exception e) { logger.error("Error in SubmissionListDTO.createFallback()", e); } @@ -257,6 +261,7 @@ public static SubmissionListDTO createFallback(AssignmentSubmission submission) public String getFeedback() { return feedback; } public Boolean getIsLate() { return isLate; } public Boolean getIsGroup() { return isGroup; } + public String getAiSummary() { return aiSummary; } } /** From 03748c27cace522082be79c73f13a93de7b9936e Mon Sep 17 00:00:00 2001 From: vibha1019 Date: Fri, 21 Aug 2026 17:51:32 -0700 Subject: [PATCH 2/2] Add quality score field and update related functionality in assignment submissions --- .../spring/mvc/assignments/AssignmentSubmission.java | 2 ++ .../assignments/AssignmentSubmissionAPIController.java | 9 +++++++-- .../mvc/assignments/AssignmentSubmissionReturnDto.java | 2 ++ .../assignments/AssignmentSubmissionViewController.java | 5 +++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmission.java b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmission.java index 939d2f2c..cada5e9f 100644 --- a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmission.java +++ b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmission.java @@ -66,6 +66,8 @@ public class AssignmentSubmission { @Column(columnDefinition = "text") private String aiSummary; + private Integer qualityScore; + private String comment; private Long assignmentid; diff --git a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionAPIController.java b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionAPIController.java index 45aeb2a5..172bdc1b 100644 --- a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionAPIController.java +++ b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionAPIController.java @@ -300,11 +300,12 @@ public ResponseEntity updateSubmission( submission.setComment(comment == null ? "" : comment); submission.setIsLate(Boolean.TRUE.equals(isLate)); - // Only clear grade/feedback/AI summary when the submission content actually changed + // Only clear grade/feedback/AI summary/quality score when the content actually changed if (contentChanged) { submission.setGrade(null); submission.setFeedback(null); submission.setAiSummary(null); + submission.setQualityScore(null); } AssignmentSubmission savedSubmission = submissionRepo.save(submission); @@ -363,7 +364,8 @@ public ResponseEntity gradeSubmission( public ResponseEntity saveSubmissionSummary( @PathVariable Long submissionId, @AuthenticationPrincipal UserDetails userDetails, - @RequestParam String summary + @RequestParam String summary, + @RequestParam(required = false) Integer qualityScore ) { Person currentUser = getAuthenticatedPerson(userDetails); if (currentUser == null) { @@ -382,6 +384,9 @@ public ResponseEntity saveSubmissionSummary( } submission.setAiSummary(summary); + if (qualityScore != null && qualityScore >= 1 && qualityScore <= 5) { + submission.setQualityScore(qualityScore); + } AssignmentSubmission savedSubmission = submissionRepo.save(submission); return ResponseEntity.ok(new AssignmentSubmissionReturnDto(savedSubmission)); } diff --git a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionReturnDto.java b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionReturnDto.java index cb1fec54..d7177d39 100644 --- a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionReturnDto.java +++ b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionReturnDto.java @@ -22,6 +22,7 @@ public class AssignmentSubmissionReturnDto { public String feedback; public Boolean isLate; public String aiSummary; + public Integer qualityScore; public AssignmentSubmissionReturnDto(AssignmentSubmission submission) { this.id = submission.getId(); @@ -34,5 +35,6 @@ public AssignmentSubmissionReturnDto(AssignmentSubmission submission) { this.feedback = submission.getFeedback(); this.isLate = submission.getIsLate(); this.aiSummary = submission.getAiSummary(); + this.qualityScore = submission.getQualityScore(); } } \ No newline at end of file diff --git a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionViewController.java b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionViewController.java index d86f576a..3b34cf1c 100644 --- a/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionViewController.java +++ b/src/main/java/com/open/spring/mvc/assignments/AssignmentSubmissionViewController.java @@ -154,6 +154,7 @@ public static class SubmissionListDTO { private Boolean isLate; private Boolean isGroup; private String aiSummary; + private Integer qualityScore; // Private constructor for factory use private SubmissionListDTO() {} @@ -213,6 +214,7 @@ public static SubmissionListDTO from(AssignmentSubmission submission) { dto.feedback = submission.getFeedback() != null ? submission.getFeedback() : ""; dto.isLate = submission.getIsLate() != null ? submission.getIsLate() : false; dto.aiSummary = submission.getAiSummary(); + dto.qualityScore = submission.getQualityScore(); } catch (Exception e) { dto.content = null; dto.comment = ""; @@ -220,6 +222,7 @@ public static SubmissionListDTO from(AssignmentSubmission submission) { dto.feedback = ""; dto.isLate = false; dto.aiSummary = null; + dto.qualityScore = null; } return dto; @@ -243,6 +246,7 @@ public static SubmissionListDTO createFallback(AssignmentSubmission submission) dto.feedback = ""; dto.isLate = false; dto.aiSummary = null; + dto.qualityScore = null; } catch (Exception e) { logger.error("Error in SubmissionListDTO.createFallback()", e); } @@ -262,6 +266,7 @@ public static SubmissionListDTO createFallback(AssignmentSubmission submission) public Boolean getIsLate() { return isLate; } public Boolean getIsGroup() { return isGroup; } public String getAiSummary() { return aiSummary; } + public Integer getQualityScore() { return qualityScore; } } /**