-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsave.php
More file actions
99 lines (87 loc) · 3.29 KB
/
Copy pathsave.php
File metadata and controls
99 lines (87 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php
/**
* Tiny instructor endpoint: save exercise JSON into lti_link.json.
* Body: application/json exercise object, or form field "exercise".
*/
require_once "../config.php";
require_once "exercise.php";
use \Tsugi\Core\LTIX;
header('Content-Type: application/json');
$LAUNCH = LTIX::requireData();
if (!$USER->instructor) {
http_response_code(403);
echo json_encode(array('status' => 'failure', 'detail' => 'Instructor role required'));
return;
}
$raw = file_get_contents('php://input');
$exercise = null;
if ($raw && strlen($raw) > 0) {
$exercise = json_decode($raw, true);
}
if (!$exercise && isset($_POST['exercise'])) {
$exercise = json_decode($_POST['exercise'], true);
}
if (!is_array($exercise)) {
http_response_code(400);
echo json_encode(array('status' => 'failure', 'detail' => 'Expected JSON exercise object'));
return;
}
if (!isset($exercise['prompt']) || !strlen(trim($exercise['prompt']))) {
http_response_code(400);
echo json_encode(array('status' => 'failure', 'detail' => 'Missing required field: prompt'));
return;
}
if (!isset($exercise['setup_sql'])) {
$exercise['setup_sql'] = '';
}
if (!isset($exercise['solution_sql'])) {
$exercise['solution_sql'] = '';
}
$mode = isset($exercise['mode']) ? $exercise['mode'] : 'query';
$verify = isset($exercise['verification_sql']) ? $exercise['verification_sql'] : null;
$hasVerify = is_array($verify) ? count($verify) > 0 : (is_string($verify) && strlen(trim($verify)) > 0);
if ($mode === 'playground') {
// Prompt required above; setup_sql optional (applied on Reset).
} else if ($mode === 'upload-check') {
if (!$hasVerify) {
http_response_code(400);
echo json_encode(array('status' => 'failure', 'detail' => 'upload-check mode requires verification_sql'));
return;
}
if (!strlen(trim($exercise['setup_sql'])) && !strlen(trim($exercise['solution_sql']))) {
http_response_code(400);
echo json_encode(array(
'status' => 'failure',
'detail' => 'upload-check mode requires setup_sql and/or solution_sql for the expected reference database'
));
return;
}
} else if ($mode === 'database-state') {
if (!$hasVerify) {
http_response_code(400);
echo json_encode(array('status' => 'failure', 'detail' => 'database-state mode requires verification_sql'));
return;
}
if (!strlen(trim($exercise['solution_sql']))) {
http_response_code(400);
echo json_encode(array('status' => 'failure', 'detail' => 'database-state mode requires solution_sql'));
return;
}
} else {
if (!strlen(trim($exercise['solution_sql']))) {
http_response_code(400);
echo json_encode(array('status' => 'failure', 'detail' => 'query mode requires solution_sql'));
return;
}
if (!strlen(trim($exercise['setup_sql']))) {
http_response_code(400);
echo json_encode(array('status' => 'failure', 'detail' => 'query mode requires setup_sql'));
return;
}
}
// Normalize required defaults
if (!isset($exercise['version'])) $exercise['version'] = 1;
if (!isset($exercise['type'])) $exercise['type'] = 'sqlite';
if (!isset($exercise['mode'])) $exercise['mode'] = 'query';
$LINK->setJson(json_encode($exercise));
echo json_encode(array('status' => 'success'));