From 7e811eb3f717e4a7e543e234e939b9746a745931 Mon Sep 17 00:00:00 2001 From: christopherjohnson Date: Thu, 20 Nov 2025 13:46:28 +0000 Subject: [PATCH 1/4] AB#107743 add submission create method --- .../java/edu/ksu/canvas/impl/BaseImpl.java | 4 ++ .../edu/ksu/canvas/impl/SubmissionImpl.java | 8 +++ .../canvas/interfaces/SubmissionWriter.java | 12 +++++ .../requestOptions/SubmissionOptions.java | 50 +++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 src/main/java/edu/ksu/canvas/requestOptions/SubmissionOptions.java diff --git a/src/main/java/edu/ksu/canvas/impl/BaseImpl.java b/src/main/java/edu/ksu/canvas/impl/BaseImpl.java index 2d8a21c2..fb6e31d8 100644 --- a/src/main/java/edu/ksu/canvas/impl/BaseImpl.java +++ b/src/main/java/edu/ksu/canvas/impl/BaseImpl.java @@ -125,6 +125,10 @@ protected String encode(String value) { return UrlEscapers.urlPathSegmentEscaper().escape(value); } + protected String buildCanvasUrl(String canvasMethod) { + return buildCanvasUrl(canvasMethod, Collections.emptyMap()); + } + protected String buildCanvasUrl(String canvasMethod, Map> parameters) { Map> allParameters = new HashMap<>(); allParameters.putAll(parameters); diff --git a/src/main/java/edu/ksu/canvas/impl/SubmissionImpl.java b/src/main/java/edu/ksu/canvas/impl/SubmissionImpl.java index d38d36de..8f1d8f8a 100644 --- a/src/main/java/edu/ksu/canvas/impl/SubmissionImpl.java +++ b/src/main/java/edu/ksu/canvas/impl/SubmissionImpl.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Optional; +import edu.ksu.canvas.requestOptions.SubmissionOptions; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -141,4 +142,11 @@ protected Class objectType() { return Submission.class; } + @Override + public Response submitAssignment(SubmissionOptions options) throws IOException { + String url = buildCanvasUrl("courses/" + options.getCourseId() + "/assignments/" + options.getAssignmentId() + "/submissions"); + + LOG.debug(String.format("Submitting assignment: POST %s", url)); + return canvasMessenger.sendToCanvas(oauthToken, url, options.getOptionsMap()); + } } diff --git a/src/main/java/edu/ksu/canvas/interfaces/SubmissionWriter.java b/src/main/java/edu/ksu/canvas/interfaces/SubmissionWriter.java index c661e1fa..8f9f6e59 100644 --- a/src/main/java/edu/ksu/canvas/interfaces/SubmissionWriter.java +++ b/src/main/java/edu/ksu/canvas/interfaces/SubmissionWriter.java @@ -3,7 +3,9 @@ import edu.ksu.canvas.model.Progress; import edu.ksu.canvas.model.assignment.Submission; +import edu.ksu.canvas.net.Response; import edu.ksu.canvas.requestOptions.MultipleSubmissionsOptions; +import edu.ksu.canvas.requestOptions.SubmissionOptions; import java.io.IOException; import java.util.Optional; @@ -29,4 +31,14 @@ public interface SubmissionWriter extends CanvasWriter gradeMultipleSubmissionsByCourse(MultipleSubmissionsOptions options) throws IOException; + + /** + * Submit an assignment on behalf of a student. + * + * @param options Parameters object containing parameters such as: course_id, assignment_id, + * submission_type, file_ids, body, url, etc. + * @return The response from Canvas + * @throws IOException If there is an error talking to Canvas + */ + Response submitAssignment(SubmissionOptions options) throws IOException; } diff --git a/src/main/java/edu/ksu/canvas/requestOptions/SubmissionOptions.java b/src/main/java/edu/ksu/canvas/requestOptions/SubmissionOptions.java new file mode 100644 index 00000000..0ff83de7 --- /dev/null +++ b/src/main/java/edu/ksu/canvas/requestOptions/SubmissionOptions.java @@ -0,0 +1,50 @@ +package edu.ksu.canvas.requestOptions; + +import org.apache.commons.lang3.StringUtils; + +/** + * Submission options to submit an assignment on behalf of a user. + *

+ * See Submit an Assignment + * for more details. + */ +public final class SubmissionOptions extends BaseOptions { + private final String courseId; + private final String assignmentId; + + public SubmissionOptions(String courseId, String assignmentId) { + this.courseId = courseId; + this.assignmentId = assignmentId; + } + + public SubmissionOptions userId(String parameter) { + addSingleItem("submission[user_id]", parameter); + return this; + } + + public SubmissionOptions url(String parameter) { + addSingleItem("submission[url]", parameter); + return this; + } + + public SubmissionOptions textComment(String parameter) { + addSingleItem("comment[text_comment]", parameter); + return this; + } + + public SubmissionOptions submissionType(String parameter) { + addSingleItem("submission[submission_type]", parameter); + return this; + } + + public String getCourseId() { return courseId; } + public String getAssignmentId() { return assignmentId; } + + public SubmissionOptions useAssignmentLaunchUrl(String canvasBaseUrl) { + if (canvasBaseUrl == null || StringUtils.isBlank(canvasBaseUrl)) { + throw new IllegalArgumentException("canvasBaseUrl must not be blank"); + } + String launchUrl = canvasBaseUrl + "/courses/" + courseId + "/assignments/" + assignmentId; + return this.url(launchUrl); + } +} \ No newline at end of file From 8d6de910a8945f60b54a02901cc9eee59dfe246e Mon Sep 17 00:00:00 2001 From: sebastianchristopher <40264653+sebastianchristopher@users.noreply.github.com> Date: Thu, 20 Nov 2025 17:36:25 +0000 Subject: [PATCH 2/4] Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/edu/ksu/canvas/interfaces/SubmissionWriter.java | 3 +-- .../edu/ksu/canvas/requestOptions/SubmissionOptions.java | 8 +++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/ksu/canvas/interfaces/SubmissionWriter.java b/src/main/java/edu/ksu/canvas/interfaces/SubmissionWriter.java index 8f9f6e59..b3b935d5 100644 --- a/src/main/java/edu/ksu/canvas/interfaces/SubmissionWriter.java +++ b/src/main/java/edu/ksu/canvas/interfaces/SubmissionWriter.java @@ -35,8 +35,7 @@ public interface SubmissionWriter extends CanvasWriterSubmit an Assignment * for more details. */ -public final class SubmissionOptions extends BaseOptions { +public class SubmissionOptions extends BaseOptions { private final String courseId; private final String assignmentId; public SubmissionOptions(String courseId, String assignmentId) { + if (StringUtils.isBlank(courseId)) { + throw new IllegalArgumentException("courseId must not be null or blank"); + } + if (StringUtils.isBlank(assignmentId)) { + throw new IllegalArgumentException("assignmentId must not be null or blank"); + } this.courseId = courseId; this.assignmentId = assignmentId; } From 9747836d59b5b1c84119b016fc97fa0a8b387d58 Mon Sep 17 00:00:00 2001 From: christopherjohnson Date: Mon, 24 Nov 2025 09:57:15 +0000 Subject: [PATCH 3/4] AB#107743 clarify javadoc --- .../edu/ksu/canvas/interfaces/SubmissionWriter.java | 2 +- .../ksu/canvas/requestOptions/SubmissionOptions.java | 12 +----------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/main/java/edu/ksu/canvas/interfaces/SubmissionWriter.java b/src/main/java/edu/ksu/canvas/interfaces/SubmissionWriter.java index 8f9f6e59..a0ed86b7 100644 --- a/src/main/java/edu/ksu/canvas/interfaces/SubmissionWriter.java +++ b/src/main/java/edu/ksu/canvas/interfaces/SubmissionWriter.java @@ -33,7 +33,7 @@ public interface SubmissionWriter extends CanvasWriter gradeMultipleSubmissionsByCourse(MultipleSubmissionsOptions options) throws IOException; /** - * Submit an assignment on behalf of a student. + * Submit an assignment * * @param options Parameters object containing parameters such as: course_id, assignment_id, * submission_type, file_ids, body, url, etc. diff --git a/src/main/java/edu/ksu/canvas/requestOptions/SubmissionOptions.java b/src/main/java/edu/ksu/canvas/requestOptions/SubmissionOptions.java index 0ff83de7..260a5245 100644 --- a/src/main/java/edu/ksu/canvas/requestOptions/SubmissionOptions.java +++ b/src/main/java/edu/ksu/canvas/requestOptions/SubmissionOptions.java @@ -1,9 +1,7 @@ package edu.ksu.canvas.requestOptions; -import org.apache.commons.lang3.StringUtils; - /** - * Submission options to submit an assignment on behalf of a user. + * Submission options to submit an assignment *

* See Submit an Assignment * for more details. @@ -39,12 +37,4 @@ public SubmissionOptions submissionType(String parameter) { public String getCourseId() { return courseId; } public String getAssignmentId() { return assignmentId; } - - public SubmissionOptions useAssignmentLaunchUrl(String canvasBaseUrl) { - if (canvasBaseUrl == null || StringUtils.isBlank(canvasBaseUrl)) { - throw new IllegalArgumentException("canvasBaseUrl must not be blank"); - } - String launchUrl = canvasBaseUrl + "/courses/" + courseId + "/assignments/" + assignmentId; - return this.url(launchUrl); - } } \ No newline at end of file From f957dd582b8d8d91f3b2e5cbc4a685a50fbc35e4 Mon Sep 17 00:00:00 2001 From: christopherjohnson Date: Mon, 24 Nov 2025 10:36:54 +0000 Subject: [PATCH 4/4] AB#107743 add correct import --- .../java/edu/ksu/canvas/requestOptions/SubmissionOptions.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/edu/ksu/canvas/requestOptions/SubmissionOptions.java b/src/main/java/edu/ksu/canvas/requestOptions/SubmissionOptions.java index 5e32c991..7e42ff4b 100644 --- a/src/main/java/edu/ksu/canvas/requestOptions/SubmissionOptions.java +++ b/src/main/java/edu/ksu/canvas/requestOptions/SubmissionOptions.java @@ -1,5 +1,7 @@ package edu.ksu.canvas.requestOptions; +import org.apache.commons.lang3.StringUtils; + /** * Submission options to submit an assignment *