diff --git a/autograde-plugins/assignsubmission_autograde/src/classes/external/autograde_get_feedback.php b/autograde-plugins/assignsubmission_autograde/src/classes/external/autograde_get_feedback.php new file mode 100644 index 0000000000000000000000000000000000000000..eb5f379448966e6ced31177ef5aab06a3e40c232 --- /dev/null +++ b/autograde-plugins/assignsubmission_autograde/src/classes/external/autograde_get_feedback.php @@ -0,0 +1,92 @@ +<?php + +namespace assignsubmission_autograde\external; + +defined('MOODLE_INTERNAL') || die(); + +use external_api; +use external_function_parameters; +use external_single_structure; +use external_multiple_structure; +use external_value; +use context_course; +use moodle_exception; +use moodle_url; +use stdClass; +use context_module; +use assign; +use assign_submission; +use function assignsubmission_autograde\utils\assignsubmission_autograde_get_assignment; + +require_once($CFG->dirroot . '/mod/assign/locallib.php'); + +final class autograde_get_feedback extends external_api { + + /** + * Define the function parameters + * @return external_function_parameters + */ + public static function get_feedback_parameters(): external_function_parameters { + return new external_function_parameters([ + 'submissionid' => new external_value(PARAM_INT, 'The ID of the submission'), + ]); + } + + /** + * Retrieve the feedback files for a submission + * @param int $submissionid + * @return array + * @throws moodle_exception + */ + public static function get_feedback($submissionid): array { + global $DB, $USER; + + self::validate_parameters(self::get_feedback_parameters(), ['submissionid' => $submissionid]); + + $assignment_id = $DB->get_field('assign_submission', 'assignment', array('id' => $submissionid)); + $course_id = $DB->get_field('assign', 'course', array('id' => $assignment_id)); + + require_capability('mod/assign:viewgrades', context_course::instance($course_id), $USER->id, false); + + $fs = get_file_storage(); + $context = context_module::instance($assignment_id); + $files = $fs->get_area_files($context->id, 'assignfeedback_comments', 'feedback_files', $submissionid); + + if (empty($files)) { + throw new moodle_exception('No feedback files found'); + } + + $result = []; + foreach ($files as $file) { + if ($file->get_filename() === '.') { + continue; + } + $entry = new stdClass(); + $entry->filename = $file->get_filename(); + $entry->url = moodle_url::make_pluginfile_url( + $file->get_contextid(), + $file->get_component(), + $file->get_filearea(), + $file->get_itemid(), + $file->get_filepath(), + $file->get_filename() + )->out(false); + $result[] = $entry; + } + + return $result; + } + + /** + * Define the return structure + * @return external_multiple_structure + */ + public static function get_feedback_returns(): external_multiple_structure { + return new external_multiple_structure( + new external_single_structure([ + 'filename' => new external_value(PARAM_TEXT, 'The name of the feedback file'), + 'url' => new external_value(PARAM_URL, 'The URL to download the feedback file'), + ]) + ); + } +} diff --git a/autograde-plugins/assignsubmission_autograde/src/db/services.php b/autograde-plugins/assignsubmission_autograde/src/db/services.php index 2ad3cf68f6171f85eac35665f00f84ed296a15a0..7fee82fba28f08e7dec88c57bd34aacce1a1f2ec 100644 --- a/autograde-plugins/assignsubmission_autograde/src/db/services.php +++ b/autograde-plugins/assignsubmission_autograde/src/db/services.php @@ -64,6 +64,12 @@ $functions = [ 'description' => 'Retrieve the grade for a given submission', 'capabilities' => 'mod/assign:grade', + ], + 'mod_assignsubmission_autograde_get_feedback' => [ + 'classname' => 'assignsubmission_autograde\external\autograde_get_feedback', + 'methodname' => 'get_feedback', + 'description' => 'Retrieve feedback files for a given submission', + 'capabilities' => 'mod/assign:viewgrades', ] ]; @@ -76,6 +82,7 @@ $services = [ 'mod_assignsubmission_autograde_submission_info', 'mod_assignsubmission_autograde_download_all_submissions', 'mod_assignsubmission_autograde_get_grade', + 'mod_assignsubmission_get_feedback', ], 'restrictedusers' => 1, 'enabled' => 1, diff --git a/autograde-service/src/main/java/ch/epfl/autograde/controller/api/v1/SubmissionController.java b/autograde-service/src/main/java/ch/epfl/autograde/controller/api/v1/SubmissionController.java index 05d0bb5bbd03128f22879611058ced195eb10de0..e4be43406b5f008520de2c04f5e2e2d0426c96e2 100644 --- a/autograde-service/src/main/java/ch/epfl/autograde/controller/api/v1/SubmissionController.java +++ b/autograde-service/src/main/java/ch/epfl/autograde/controller/api/v1/SubmissionController.java @@ -182,11 +182,10 @@ public final class SubmissionController { */ @GetMapping(value = "/{id}/feedback/files", consumes = MediaType.ALL_VALUE, produces = "application/zip") public ResponseEntity<?> getFeedbackFiles(final @PathVariable int id) { - /* log.info("Processing request to retrieve feedback files for submission {}", id); + log.info("Processing request to retrieve feedback files for submission {}", id); try { - // Assuming moodle.getFeedbackFiles(id) returns a zip InputStream - InputStream feedbackFiles = moodle.upload_feedback() + InputStream feedbackFiles = moodle.get_feedback(id) ; if (feedbackFiles == null) { return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); @@ -200,7 +199,7 @@ public final class SubmissionController { } catch (Exception e) { log.error("Failed to retrieve feedback files for submission {}: {}", id, e.getMessage()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - }*/ + } } /** diff --git a/autograde-service/src/main/java/ch/epfl/autograde/service/MoodleWebService.java b/autograde-service/src/main/java/ch/epfl/autograde/service/MoodleWebService.java index edd11cb098c7f483ad415b01b10c1b9e1c48fc45..e8f427abaeaabe22b03e7a94f8fd1f085b7ffff1 100644 --- a/autograde-service/src/main/java/ch/epfl/autograde/service/MoodleWebService.java +++ b/autograde-service/src/main/java/ch/epfl/autograde/service/MoodleWebService.java @@ -251,8 +251,33 @@ public final class MoodleWebService { throw new RuntimeException(e); } } + public InputStream get_feedback(int submissionId) { + log.info("Fetching feedback files for submission {}", submissionId); -} + final var FUNCTION_NAME = "mod_assignsubmission_autograde_get_feedback"; + + final var params = Map.of( + "submissionid", submissionId + ); + try { + // Call Moodle API + var response = call(FUNCTION_NAME, params, ofInputStream()); + + // Check HTTP response status + if (response.statusCode() != HttpStatus.OK.value()) { + log.error("Failed to fetch feedback files for submission {}", submissionId); + return null; + } + + return response.body(); + } catch (Exception e) { + log.error("Error fetching feedback files for submission {}: {}", submissionId, e.getMessage()); + return null; + } + } } + + +