Skip to content
Snippets Groups Projects
Verified Commit 3c7e60c7 authored by El Hassan Jamaly's avatar El Hassan Jamaly Committed by Hamza Remmal
Browse files

feat(API) : Add mod_assignsubmission_get_feedback

parent df38cc65
No related branches found
No related tags found
1 merge request!321Add mod_assignsubmission_get_grade (API)
Pipeline #256169 failed
<?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'),
])
);
}
}
......@@ -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,
......
......@@ -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();
}*/
}
}
/**
......
......@@ -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;
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment