@citolab/qti-backend-firebase 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +674 -0
- package/dist/api/app-specific/base/application-specific-base.d.ts +45 -0
- package/dist/api/app-specific/base/application-specific-base.d.ts.map +1 -0
- package/dist/api/app-specific/base/application-specific-base.js +503 -0
- package/dist/api/app-specific/base/application-specific-base.js.map +1 -0
- package/dist/api/app-specific/base/cheerio-helper.d.ts +5 -0
- package/dist/api/app-specific/base/cheerio-helper.d.ts.map +1 -0
- package/dist/api/app-specific/base/cheerio-helper.js +16 -0
- package/dist/api/app-specific/base/cheerio-helper.js.map +1 -0
- package/dist/api/app-specific/baseImplementation.d.ts +6 -0
- package/dist/api/app-specific/baseImplementation.d.ts.map +1 -0
- package/dist/api/app-specific/baseImplementation.js +11 -0
- package/dist/api/app-specific/baseImplementation.js.map +1 -0
- package/dist/api/app-specific/index.d.ts +4 -0
- package/dist/api/app-specific/index.d.ts.map +1 -0
- package/dist/api/app-specific/index.js +4 -0
- package/dist/api/app-specific/index.js.map +1 -0
- package/dist/api/app-specific/interface/IApplicationSpecific.d.ts +31 -0
- package/dist/api/app-specific/interface/IApplicationSpecific.d.ts.map +1 -0
- package/dist/api/app-specific/interface/IApplicationSpecific.js +2 -0
- package/dist/api/app-specific/interface/IApplicationSpecific.js.map +1 -0
- package/dist/api/app-specific/specific.d.ts +1 -0
- package/dist/api/app-specific/specific.d.ts.map +1 -0
- package/dist/api/app-specific/specific.js +31 -0
- package/dist/api/app-specific/specific.js.map +1 -0
- package/dist/api/index.d.ts +3 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +15 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/qti-data.d.ts +4 -0
- package/dist/api/qti-data.d.ts.map +1 -0
- package/dist/api/qti-data.js +622 -0
- package/dist/api/qti-data.js.map +1 -0
- package/dist/api/qti-resources.d.ts +4 -0
- package/dist/api/qti-resources.d.ts.map +1 -0
- package/dist/api/qti-resources.js +348 -0
- package/dist/api/qti-resources.js.map +1 -0
- package/dist/api/qti-teacher.d.ts +6 -0
- package/dist/api/qti-teacher.d.ts.map +1 -0
- package/dist/api/qti-teacher.js +807 -0
- package/dist/api/qti-teacher.js.map +1 -0
- package/dist/api/qti-tools.d.ts +3 -0
- package/dist/api/qti-tools.d.ts.map +1 -0
- package/dist/api/qti-tools.js +450 -0
- package/dist/api/qti-tools.js.map +1 -0
- package/dist/console.d.ts +2 -0
- package/dist/console.d.ts.map +1 -0
- package/dist/console.js +30 -0
- package/dist/console.js.map +1 -0
- package/dist/express-test.d.ts +2 -0
- package/dist/express-test.d.ts.map +1 -0
- package/dist/express-test.js +19 -0
- package/dist/express-test.js.map +1 -0
- package/dist/helpers/ci-bootstap.d.ts +4 -0
- package/dist/helpers/ci-bootstap.d.ts.map +1 -0
- package/dist/helpers/ci-bootstap.js +96 -0
- package/dist/helpers/ci-bootstap.js.map +1 -0
- package/dist/helpers/database.d.ts +110 -0
- package/dist/helpers/database.d.ts.map +1 -0
- package/dist/helpers/database.js +151 -0
- package/dist/helpers/database.js.map +1 -0
- package/dist/helpers/db.d.ts +3 -0
- package/dist/helpers/db.d.ts.map +1 -0
- package/dist/helpers/db.js +10 -0
- package/dist/helpers/db.js.map +1 -0
- package/dist/helpers/endpoint-helpers.d.ts +33 -0
- package/dist/helpers/endpoint-helpers.d.ts.map +1 -0
- package/dist/helpers/endpoint-helpers.js +149 -0
- package/dist/helpers/endpoint-helpers.js.map +1 -0
- package/dist/helpers/firebase.d.ts +7 -0
- package/dist/helpers/firebase.d.ts.map +1 -0
- package/dist/helpers/firebase.js +15 -0
- package/dist/helpers/firebase.js.map +1 -0
- package/dist/helpers/index.d.ts +11 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +11 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/local-helpers.d.ts +2 -0
- package/dist/helpers/local-helpers.d.ts.map +1 -0
- package/dist/helpers/local-helpers.js +11 -0
- package/dist/helpers/local-helpers.js.map +1 -0
- package/dist/helpers/logic.d.ts +73 -0
- package/dist/helpers/logic.d.ts.map +1 -0
- package/dist/helpers/logic.js +759 -0
- package/dist/helpers/logic.js.map +1 -0
- package/dist/helpers/package-upload.d.ts +16 -0
- package/dist/helpers/package-upload.d.ts.map +1 -0
- package/dist/helpers/package-upload.js +160 -0
- package/dist/helpers/package-upload.js.map +1 -0
- package/dist/helpers/package.d.ts +32 -0
- package/dist/helpers/package.d.ts.map +1 -0
- package/dist/helpers/package.js +373 -0
- package/dist/helpers/package.js.map +1 -0
- package/dist/helpers/request-headers.d.ts +27 -0
- package/dist/helpers/request-headers.d.ts.map +1 -0
- package/dist/helpers/request-headers.js +144 -0
- package/dist/helpers/request-headers.js.map +1 -0
- package/dist/helpers/storage.d.ts +10 -0
- package/dist/helpers/storage.d.ts.map +1 -0
- package/dist/helpers/storage.js +132 -0
- package/dist/helpers/storage.js.map +1 -0
- package/dist/helpers/utils.d.ts +42 -0
- package/dist/helpers/utils.d.ts.map +1 -0
- package/dist/helpers/utils.js +228 -0
- package/dist/helpers/utils.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +14 -0
- package/dist/main.js.map +1 -0
- package/package.json +101 -0
- package/readme.md +11 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { storageFileToXml } from "./storage";
|
|
2
|
+
import * as cheerio from "cheerio";
|
|
3
|
+
import { convertQti2toQti3 } from "@citolab/qti-convert/qti-convert";
|
|
4
|
+
import { qtiTransform } from "@citolab/qti-convert/qti-transformer";
|
|
5
|
+
import { getUnique, removeDoubleSlashes } from "./utils";
|
|
6
|
+
import path from "path";
|
|
7
|
+
import { getStorage } from "./firebase";
|
|
8
|
+
const fixNamespaces = ($rootElement) => {
|
|
9
|
+
if (!$rootElement) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const root = $rootElement.root().children().first();
|
|
13
|
+
const rootName = root[0].tagName;
|
|
14
|
+
if (rootName.includes(":")) {
|
|
15
|
+
const [prefix, tag] = rootName.split(":");
|
|
16
|
+
root.prop("tagName", tag);
|
|
17
|
+
root.removeAttr(`xmlns:${prefix}`);
|
|
18
|
+
const pdNamespace = root.attr("xmlns");
|
|
19
|
+
root.attr("xmlns", `http://www.imsglobal.org/xsd/imscp_v1p1`);
|
|
20
|
+
if (pdNamespace) {
|
|
21
|
+
// set previous default namespace
|
|
22
|
+
root.attr("xmlns:pd", pdNamespace);
|
|
23
|
+
}
|
|
24
|
+
// // Fix child elements
|
|
25
|
+
$rootElement("*").each((i, elem) => {
|
|
26
|
+
if (elem.type !== "tag")
|
|
27
|
+
return;
|
|
28
|
+
if (!elem.tagName.includes(`:`) && !(elem === root[0]) && pdNamespace) {
|
|
29
|
+
elem.tagName = `pd:${elem.tagName}`;
|
|
30
|
+
}
|
|
31
|
+
else if (elem.tagName.startsWith(`${prefix}:`)) {
|
|
32
|
+
const [, tag] = elem.tagName.split(":");
|
|
33
|
+
elem.tagName = tag;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
export const qtiConversionFixes = async (qti3, itemXmlPath) => {
|
|
39
|
+
const transform = qtiTransform(qti3);
|
|
40
|
+
const processPath = (path) => {
|
|
41
|
+
const parts = path.split("/");
|
|
42
|
+
const lastPart = parts[parts.length - 1];
|
|
43
|
+
if (lastPart.includes(".")) {
|
|
44
|
+
parts.pop(); // Remove the last part if it contains a dot
|
|
45
|
+
}
|
|
46
|
+
return parts.join("/");
|
|
47
|
+
};
|
|
48
|
+
const makeAbsolutePath = (mediaLocation, relativePath) => {
|
|
49
|
+
// Combine the media location and the relative path
|
|
50
|
+
const combinedPath = path.join(mediaLocation, relativePath);
|
|
51
|
+
// Normalize the combined path to resolve '..' and '.'
|
|
52
|
+
const normalizedPath = path.normalize(combinedPath);
|
|
53
|
+
return normalizedPath;
|
|
54
|
+
};
|
|
55
|
+
const transformResult = await transform
|
|
56
|
+
// .stripStylesheets()
|
|
57
|
+
.objectToImg()
|
|
58
|
+
.objectToVideo()
|
|
59
|
+
.objectToAudio()
|
|
60
|
+
.stripMaterialInfo()
|
|
61
|
+
.minChoicesToOne()
|
|
62
|
+
.externalScored()
|
|
63
|
+
.qbCleanup()
|
|
64
|
+
.depConvert()
|
|
65
|
+
.upgradePci()
|
|
66
|
+
.changeAssetLocationAsync(async (srcValue) => {
|
|
67
|
+
if (srcValue?.startsWith("http") ||
|
|
68
|
+
srcValue?.startsWith("data") ||
|
|
69
|
+
srcValue.startsWith("//") ||
|
|
70
|
+
!srcValue) {
|
|
71
|
+
return srcValue;
|
|
72
|
+
}
|
|
73
|
+
const assetUrl = "/";
|
|
74
|
+
const pathWithoutFilename = processPath(itemXmlPath);
|
|
75
|
+
if (itemXmlPath) {
|
|
76
|
+
// path is the relative path , the newSrc is relative to this path
|
|
77
|
+
const relative = `${pathWithoutFilename}/${srcValue}`;
|
|
78
|
+
// remove unnecessary ../ like: /items/../img/1.png must be /img/1.png
|
|
79
|
+
srcValue = removeDoubleSlashes(makeAbsolutePath(assetUrl, relative));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
srcValue = removeDoubleSlashes(makeAbsolutePath(assetUrl, srcValue));
|
|
83
|
+
}
|
|
84
|
+
return srcValue;
|
|
85
|
+
});
|
|
86
|
+
return transformResult.xml();
|
|
87
|
+
};
|
|
88
|
+
const getAllResourceTypes = ($manifestXml) => {
|
|
89
|
+
const resources = $manifestXml(`resource[type]`);
|
|
90
|
+
if (resources.length === 0) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
const arr = Array.from(resources);
|
|
94
|
+
return getUnique(arr
|
|
95
|
+
.filter((resource) => resource.attribs.type)
|
|
96
|
+
.map((resource) => resource.attribs.type));
|
|
97
|
+
};
|
|
98
|
+
const getResourceType = ($manifestXml, resourceType) => {
|
|
99
|
+
const allTypes = getAllResourceTypes($manifestXml);
|
|
100
|
+
return allTypes.find((type) => type.includes(resourceType));
|
|
101
|
+
};
|
|
102
|
+
export const getPackageResourcesFromStorage = async (packageLocation,
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
104
|
+
_assetUrl) => {
|
|
105
|
+
const foldername = packageLocation.toLocaleLowerCase().endsWith(".zip")
|
|
106
|
+
? packageLocation.split("/").slice(0, -1).join("/")
|
|
107
|
+
: packageLocation;
|
|
108
|
+
const resources = [];
|
|
109
|
+
const manifest = removeDoubleSlashes(`${foldername}/imsmanifest.xml`);
|
|
110
|
+
const $manifestXml = await getXmlByQtiResource(manifest);
|
|
111
|
+
if (!$manifestXml) {
|
|
112
|
+
console.warn(`Could not load manifest from ${manifest}`);
|
|
113
|
+
return resources;
|
|
114
|
+
}
|
|
115
|
+
fixNamespaces($manifestXml);
|
|
116
|
+
let manifestContent = $manifestXml.xml();
|
|
117
|
+
if (manifestContent.startsWith("")) {
|
|
118
|
+
manifestContent = manifestContent.replace("", "");
|
|
119
|
+
}
|
|
120
|
+
const resourceType = getResourceType($manifestXml, "test");
|
|
121
|
+
const assessmentTestElements = $manifestXml(`resource[type='${resourceType}']`);
|
|
122
|
+
resources.push({
|
|
123
|
+
content: manifestContent,
|
|
124
|
+
identifier: "imsmanifest",
|
|
125
|
+
path: "imsmanifest.xml",
|
|
126
|
+
type: "manifest",
|
|
127
|
+
});
|
|
128
|
+
for (const assessmentTestElement of assessmentTestElements) {
|
|
129
|
+
const href = assessmentTestElement.attribs["href"].replaceAll("\\", "/");
|
|
130
|
+
const location = `${foldername}/${href}`;
|
|
131
|
+
const $testResource = await getXmlByQtiResource(location);
|
|
132
|
+
if (!$testResource) {
|
|
133
|
+
console.warn(`Could not load test resource from ${location}`);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const assessmentId = $testResource("qti-assessment-test").attr("identifier") ||
|
|
137
|
+
$testResource("assessmentTest").attr("identifier");
|
|
138
|
+
let content = $testResource.xml();
|
|
139
|
+
if (content.startsWith("")) {
|
|
140
|
+
content = content.replace("", "");
|
|
141
|
+
}
|
|
142
|
+
const items = await getItemsFromAssessmentTest($testResource);
|
|
143
|
+
resources.push({
|
|
144
|
+
content,
|
|
145
|
+
path: href,
|
|
146
|
+
identifier: assessmentId,
|
|
147
|
+
type: "test",
|
|
148
|
+
items,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
const assessmentItemElements = $manifestXml(`resource[type*='item']`);
|
|
152
|
+
for (const assessmentItemElement of assessmentItemElements) {
|
|
153
|
+
const href = assessmentItemElement.attribs["href"].replaceAll("\\", "/");
|
|
154
|
+
const location = `${foldername}/${href}`;
|
|
155
|
+
const $itemResource = await getXmlByQtiResource(location);
|
|
156
|
+
if (!$itemResource) {
|
|
157
|
+
console.warn(`Could not load item resource from ${location}`);
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const itemIdentifier = $itemResource("qti-assessment-item").attr("identifier");
|
|
161
|
+
resources
|
|
162
|
+
.filter((r) => r.type === "test")
|
|
163
|
+
.forEach((r) => {
|
|
164
|
+
const test = r;
|
|
165
|
+
const item = test.items.find((i) => i.identifier === itemIdentifier);
|
|
166
|
+
if (item) {
|
|
167
|
+
item.title = $itemResource("qti-assessment-item").attr("title") || "";
|
|
168
|
+
item.type =
|
|
169
|
+
$itemResource("qti-response-processing").length > 0
|
|
170
|
+
? "regular"
|
|
171
|
+
: "info";
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
resources.push({
|
|
175
|
+
content: $itemResource.xml(),
|
|
176
|
+
identifier: itemIdentifier,
|
|
177
|
+
path: href,
|
|
178
|
+
type: "item",
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return resources;
|
|
182
|
+
};
|
|
183
|
+
export function getItemsFromAssessmentTest($assessmentTest) {
|
|
184
|
+
if ($assessmentTest) {
|
|
185
|
+
const itemList = $assessmentTest("qti-assessment-item-ref").map((i, element) => {
|
|
186
|
+
const categories = (element.attribs["category"] || "").split(" ");
|
|
187
|
+
return {
|
|
188
|
+
identifier: element.attribs["identifier"],
|
|
189
|
+
categories,
|
|
190
|
+
href: element.attribs["href"],
|
|
191
|
+
type: categories.includes("informational")
|
|
192
|
+
? "informational"
|
|
193
|
+
: "regular",
|
|
194
|
+
};
|
|
195
|
+
});
|
|
196
|
+
return itemList.toArray();
|
|
197
|
+
}
|
|
198
|
+
return [];
|
|
199
|
+
}
|
|
200
|
+
export const getResource = async (location) => {
|
|
201
|
+
const storage = getStorage();
|
|
202
|
+
const cleanedLocation = location.replace(/^\//, "").trim();
|
|
203
|
+
const item = storage.bucket().file(cleanedLocation);
|
|
204
|
+
const exists = await item.exists();
|
|
205
|
+
if (!(exists.length > 0 && exists[0])) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
return item;
|
|
209
|
+
};
|
|
210
|
+
export const extractInfoFromAssetUrl = (assetUrl) => {
|
|
211
|
+
let applicationId = "";
|
|
212
|
+
let packageId = "";
|
|
213
|
+
const applicationIndex = assetUrl.indexOf("/application/");
|
|
214
|
+
if (applicationIndex > 0) {
|
|
215
|
+
applicationId = assetUrl
|
|
216
|
+
.substring(applicationIndex + 1, assetUrl.length)
|
|
217
|
+
.split("/")[1];
|
|
218
|
+
}
|
|
219
|
+
const packageIndex = assetUrl.indexOf("/package/");
|
|
220
|
+
if (packageIndex > 0) {
|
|
221
|
+
packageId = assetUrl
|
|
222
|
+
.substring(packageIndex + 1, assetUrl.length)
|
|
223
|
+
.split("/")[1];
|
|
224
|
+
}
|
|
225
|
+
const relativeUrl = assetUrl.substring(assetUrl.indexOf(packageId) + packageId.length + 1, assetUrl.length);
|
|
226
|
+
return { applicationId, packageId, relativeUrl };
|
|
227
|
+
};
|
|
228
|
+
export const getStorageRefFromAssetUrl = (assetUrl, isSingleTenant) => {
|
|
229
|
+
const { applicationId, packageId, relativeUrl } = extractInfoFromAssetUrl(assetUrl);
|
|
230
|
+
const ref = getStorageRef(relativeUrl, isSingleTenant, packageId, applicationId);
|
|
231
|
+
return ref;
|
|
232
|
+
};
|
|
233
|
+
export const getStoragePackageFolder = (isSingleTenant, packageId, applicationId) => {
|
|
234
|
+
const storageRef = `${!isSingleTenant ? `packages/${applicationId}/` : "packages/"}${packageId}`;
|
|
235
|
+
return storageRef;
|
|
236
|
+
};
|
|
237
|
+
export const getStorageRef = (relativeUrl, isSingleTenant, packageId, applicationId) => {
|
|
238
|
+
return removeDoubleSlashes(`${getStoragePackageFolder(isSingleTenant, packageId, applicationId)}/${relativeUrl}`);
|
|
239
|
+
};
|
|
240
|
+
export const getAllResourcesInStorageBucket = async (location) => {
|
|
241
|
+
const storage = getStorage();
|
|
242
|
+
const prefix = location
|
|
243
|
+
.replace(/^\//, "")
|
|
244
|
+
.replace("package/", "packages/")
|
|
245
|
+
.trim();
|
|
246
|
+
const [files] = await storage.bucket().getFiles({
|
|
247
|
+
prefix,
|
|
248
|
+
});
|
|
249
|
+
const names = files.length > 0 ? files.map((f) => f.name.replace(prefix, "")) : [];
|
|
250
|
+
return names;
|
|
251
|
+
};
|
|
252
|
+
export const getXmlByQtiResource = async (location) => {
|
|
253
|
+
// remove first slash
|
|
254
|
+
location = removeDoubleSlashes(location);
|
|
255
|
+
let item = await getResource(location);
|
|
256
|
+
if (!item) {
|
|
257
|
+
item = await getResource(location.replace("depitems", "depItems"));
|
|
258
|
+
}
|
|
259
|
+
if (!item) {
|
|
260
|
+
console.warn(`Could not find resource at ${location}`);
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
let xml = await storageFileToXml(item);
|
|
264
|
+
if (!xml) {
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
if (xml("assessmentItem").length > 0 || xml("assessmentTest").length > 0) {
|
|
268
|
+
const convertedString = await convertQti2toQti3(xml.xml());
|
|
269
|
+
xml = cheerio.load(convertedString, { xmlMode: true, xml: true });
|
|
270
|
+
}
|
|
271
|
+
// check if tag name is kebab cased otherwise convert with kebab case
|
|
272
|
+
return xml;
|
|
273
|
+
};
|
|
274
|
+
export function determineItemType(xml) {
|
|
275
|
+
if (xml.includes("<qti-choice-interaction")) {
|
|
276
|
+
return "choice";
|
|
277
|
+
}
|
|
278
|
+
if (xml.includes("<qti-text-entry-interaction")) {
|
|
279
|
+
return "textEntry";
|
|
280
|
+
}
|
|
281
|
+
if (xml.includes("<qti-extended-text-interaction")) {
|
|
282
|
+
return "extendedTextEntry";
|
|
283
|
+
}
|
|
284
|
+
if (xml.includes("<qti-custom-interaction") ||
|
|
285
|
+
xml.includes("<qti-portable-interaction")) {
|
|
286
|
+
return "customInteraction";
|
|
287
|
+
}
|
|
288
|
+
if (xml.includes("<qti-inline-choice-interaction")) {
|
|
289
|
+
return "inlineChoice";
|
|
290
|
+
}
|
|
291
|
+
return "unknown";
|
|
292
|
+
}
|
|
293
|
+
export function getQtiItemBody(xml) {
|
|
294
|
+
const $ = cheerio.load(xml, { xmlMode: true, xml: true });
|
|
295
|
+
const body = $("qti-item-body").text();
|
|
296
|
+
return body.replace(/\n/g, " ").replace(/ +/g, " ").trim();
|
|
297
|
+
}
|
|
298
|
+
const _cachedItems = new Map();
|
|
299
|
+
export async function getItemsFromTest(appId, assessmentId) {
|
|
300
|
+
if (_cachedItems.has(`${appId}-${assessmentId}`)) {
|
|
301
|
+
return _cachedItems.get(`${appId}-${assessmentId}`);
|
|
302
|
+
}
|
|
303
|
+
const storage = getStorage();
|
|
304
|
+
const packageFolder = `packages/${appId}/${assessmentId}`;
|
|
305
|
+
const manifestFile = await storage
|
|
306
|
+
.bucket()
|
|
307
|
+
.file(`${packageFolder}/imsmanifest.xml`)
|
|
308
|
+
.download();
|
|
309
|
+
const manifest = manifestFile[0].toString();
|
|
310
|
+
const $manifest = cheerio.load(manifest, { xmlMode: true, xml: true });
|
|
311
|
+
// find the assessment item in the manifest
|
|
312
|
+
const assessmentTest = Array.from($manifest("resource")).filter((r) => {
|
|
313
|
+
const type = r.attribs["type"];
|
|
314
|
+
return type && type.includes("test");
|
|
315
|
+
});
|
|
316
|
+
if (assessmentTest.length !== 1) {
|
|
317
|
+
throw new Error(`Expected one assessment test in manifest, found ${assessmentTest.length}`);
|
|
318
|
+
}
|
|
319
|
+
const testPath = assessmentTest[0].attribs["href"];
|
|
320
|
+
const testPathWithoutFileName = path.dirname(testPath);
|
|
321
|
+
const testFile = await storage
|
|
322
|
+
.bucket()
|
|
323
|
+
.file(`${packageFolder}/${testPath}`)
|
|
324
|
+
.download();
|
|
325
|
+
const testXML = testFile[0].toString();
|
|
326
|
+
const $test = cheerio.load(testXML, { xmlMode: true, xml: true });
|
|
327
|
+
// find the assessment item in the test
|
|
328
|
+
const itemsInTest = Array.from($test("qti-assessment-item-ref")).map((i) => {
|
|
329
|
+
const identifier = i.attribs["identifier"];
|
|
330
|
+
const href = i.attribs["href"];
|
|
331
|
+
const resolvedPath = resolvePath(href, testPathWithoutFileName);
|
|
332
|
+
return {
|
|
333
|
+
identifier,
|
|
334
|
+
href: resolvedPath,
|
|
335
|
+
};
|
|
336
|
+
});
|
|
337
|
+
const retrievedItems = [];
|
|
338
|
+
for (const item of itemsInTest) {
|
|
339
|
+
const itemFile = await storage
|
|
340
|
+
.bucket()
|
|
341
|
+
.file(`${packageFolder}/${item.href}`)
|
|
342
|
+
.download();
|
|
343
|
+
const itemXML = itemFile[0].toString();
|
|
344
|
+
const $item = cheerio.load(itemXML, { xmlMode: true, xml: true });
|
|
345
|
+
// get all identifiers of qti-response-declaration
|
|
346
|
+
const responseDeclarations = Array.from($item("qti-response-declaration")).map((i) => i.attribs["identifier"]);
|
|
347
|
+
retrievedItems.push({
|
|
348
|
+
identifier: item.identifier,
|
|
349
|
+
content: itemXML,
|
|
350
|
+
responseDeclarations: responseDeclarations,
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
// cache the items
|
|
354
|
+
_cachedItems.set(`${appId}-${assessmentId}`, retrievedItems);
|
|
355
|
+
return retrievedItems;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Resolves a relative path against a base path
|
|
359
|
+
* @param relativePath - The path to resolve (e.g., 'item.xml')
|
|
360
|
+
* @param basePath - The path to resolve against (e.g., 'item/assessmentTest.xml')
|
|
361
|
+
* @returns The resolved absolute path (e.g., 'item/item.xml')
|
|
362
|
+
*/
|
|
363
|
+
export function resolvePath(relativePath, basePath) {
|
|
364
|
+
// Extract the directory part of the base path
|
|
365
|
+
const baseDir = basePath.split("/").slice(0, -1).join("/");
|
|
366
|
+
// If there's no directory in the base path, just return the relative path
|
|
367
|
+
if (!baseDir) {
|
|
368
|
+
return relativePath;
|
|
369
|
+
}
|
|
370
|
+
// Join the base directory with the relative path
|
|
371
|
+
return `${baseDir}/${relativePath}`;
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/helpers/package.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Request, Response } from "express";
|
|
2
|
+
import { UserRecord } from "firebase-admin/auth";
|
|
3
|
+
export declare const getToken: (req: Request) => string;
|
|
4
|
+
export declare const authenticateTeacher: (req: Request, res: Response) => Promise<{
|
|
5
|
+
user?: UserRecord;
|
|
6
|
+
handled: boolean;
|
|
7
|
+
}>;
|
|
8
|
+
export declare const authenticateStudent: (req: Request, res: Response) => Promise<{
|
|
9
|
+
user?: UserRecord;
|
|
10
|
+
handled: boolean;
|
|
11
|
+
}>;
|
|
12
|
+
export declare const tryAuthenticateStudent: (req: Request, res: Response) => Promise<UserRecord | undefined>;
|
|
13
|
+
export declare const authenticateAdmin: (req: Request, res: Response) => Promise<{
|
|
14
|
+
user?: UserRecord;
|
|
15
|
+
handled: boolean;
|
|
16
|
+
} | {
|
|
17
|
+
user: null;
|
|
18
|
+
handled: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
export declare const authenticateStudentOrTeacher: (req: Request, res: Response) => Promise<{
|
|
21
|
+
user?: UserRecord;
|
|
22
|
+
handled: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
export declare const getAppId: (req: Request) => string;
|
|
25
|
+
export declare const getName: (req: Request) => string;
|
|
26
|
+
export declare const getAssessmentId: (req: Request) => string;
|
|
27
|
+
//# sourceMappingURL=request-headers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-headers.d.ts","sourceRoot":"","sources":["../../src/helpers/request-headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAQjD,eAAO,MAAM,QAAQ,GAAI,KAAK,OAAO,WAWpC,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,KAAK,OAAO,EAAE,KAAK,QAAQ;WAoDjD,UAAU;aAAW,OAAO;EAlD/C,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,KAAK,OAAO,EAAE,KAAK,QAAQ;WAgDjD,UAAU;aAAW,OAAO;EA9C/C,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAU,KAAK,OAAO,EAAE,KAAK,QAAQ,oCAGvE,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,KAAK,OAAO,EAAE,KAAK,QAAQ;WAuC/C,UAAU;aAAW,OAAO;;;;EAf/C,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,KAAK,OAAO,EACZ,KAAK,QAAQ;WAWK,UAAU;aAAW,OAAO;EAR/C,CAAC;AA6FF,eAAO,MAAM,QAAQ,GAAI,KAAK,OAAO,WACG,CAAC;AAEzC,eAAO,MAAM,OAAO,GAAI,KAAK,OAAO,WACK,CAAC;AAE1C,eAAO,MAAM,eAAe,GAAI,KAAK,OAAO,WACG,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import NodeCache from "node-cache";
|
|
2
|
+
import { getUser, hasAccess } from "./logic";
|
|
3
|
+
import { getAuth } from "./firebase";
|
|
4
|
+
const cache = new NodeCache({
|
|
5
|
+
stdTTL: 300,
|
|
6
|
+
});
|
|
7
|
+
export const getToken = (req) => {
|
|
8
|
+
let token = "";
|
|
9
|
+
if (req.headers.authorization &&
|
|
10
|
+
req.headers.authorization.split(" ")[0] === "Bearer") {
|
|
11
|
+
token = req.headers.authorization.split(" ")[1];
|
|
12
|
+
}
|
|
13
|
+
else if (req.query && req.query.token) {
|
|
14
|
+
token = req.query.token.toString();
|
|
15
|
+
}
|
|
16
|
+
return token;
|
|
17
|
+
};
|
|
18
|
+
export const authenticateTeacher = async (req, res) => {
|
|
19
|
+
return authenticate(req, res, ["google.com", "password"]);
|
|
20
|
+
};
|
|
21
|
+
export const authenticateStudent = async (req, res) => {
|
|
22
|
+
return authenticate(req, res, ["anonymous"], false);
|
|
23
|
+
};
|
|
24
|
+
export const tryAuthenticateStudent = async (req, res) => {
|
|
25
|
+
const result = await authenticate(req, res, ["anonymous"], false, false);
|
|
26
|
+
return result.user;
|
|
27
|
+
};
|
|
28
|
+
export const authenticateAdmin = async (req, res) => {
|
|
29
|
+
const authResult = await authenticate(req, res, ["google.com", "password"], false);
|
|
30
|
+
if (authResult && authResult?.user?.uid) {
|
|
31
|
+
const tokenCacheKey = `admin-${authResult.user.uid}`;
|
|
32
|
+
if (cache.get(tokenCacheKey)) {
|
|
33
|
+
return authResult;
|
|
34
|
+
}
|
|
35
|
+
const userFromDatabase = await getUser(authResult.user.uid);
|
|
36
|
+
if (userFromDatabase?.admin) {
|
|
37
|
+
cache.set(tokenCacheKey, true);
|
|
38
|
+
return authResult;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
cache.set(tokenCacheKey, false);
|
|
42
|
+
res.status(403).send("Unauthorized");
|
|
43
|
+
return { user: null, handled: true };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
return authResult;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
export const authenticateStudentOrTeacher = async (req, res) => {
|
|
51
|
+
return authenticate(req, res, ["anonymous", "google.com", "password"], false);
|
|
52
|
+
};
|
|
53
|
+
const authenticate = async (req, res, allowedProviders, checkAccess = true, sendError = true) => {
|
|
54
|
+
try {
|
|
55
|
+
const auth = getAuth();
|
|
56
|
+
const idToken = getToken(req);
|
|
57
|
+
if (!idToken) {
|
|
58
|
+
if (sendError) {
|
|
59
|
+
res.status(403).send("Unauthorized");
|
|
60
|
+
}
|
|
61
|
+
return { handled: true };
|
|
62
|
+
}
|
|
63
|
+
let userId = "";
|
|
64
|
+
const tokenCacheKey = `token-${idToken}`;
|
|
65
|
+
const cachedUserId = cache.get(tokenCacheKey);
|
|
66
|
+
if (cachedUserId) {
|
|
67
|
+
userId = cachedUserId;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const verifyIdTokenResult = await auth.verifyIdToken(idToken);
|
|
71
|
+
userId = verifyIdTokenResult.uid;
|
|
72
|
+
cache.set(tokenCacheKey, userId);
|
|
73
|
+
}
|
|
74
|
+
if (!userId) {
|
|
75
|
+
res.status(403).send("userId could not be retrieved from idToken");
|
|
76
|
+
}
|
|
77
|
+
let user = undefined;
|
|
78
|
+
const userCacheKey = `user-${userId}`;
|
|
79
|
+
if (cache.get(userCacheKey)) {
|
|
80
|
+
user = cache.get(userCacheKey);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
user = await getAuth().getUser(userId);
|
|
84
|
+
cache.set(userCacheKey, user);
|
|
85
|
+
}
|
|
86
|
+
if (!user && !allowedProviders.includes("anonymous")) {
|
|
87
|
+
if (sendError) {
|
|
88
|
+
res.status(403).send("Unauthorized");
|
|
89
|
+
}
|
|
90
|
+
return { handled: true };
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const appId = getAppId(req);
|
|
94
|
+
const provider = user?.providerData && user.providerData.length > 0
|
|
95
|
+
? user.providerData[0].providerId
|
|
96
|
+
: "anonymous";
|
|
97
|
+
let hasAccessResult = false;
|
|
98
|
+
if (checkAccess) {
|
|
99
|
+
const userAppCacheKey = `user-app-${userId}`;
|
|
100
|
+
if (cache.get(userAppCacheKey)) {
|
|
101
|
+
hasAccessResult = !!cache.get(userAppCacheKey);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
hasAccessResult = await hasAccess(userId, appId);
|
|
105
|
+
cache.set(userAppCacheKey, hasAccessResult);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if ((allowedProviders.indexOf(provider) !== -1 && hasAccessResult) ||
|
|
109
|
+
!checkAccess) {
|
|
110
|
+
return { user, handled: false };
|
|
111
|
+
}
|
|
112
|
+
else if (allowedProviders.indexOf(provider) === -1) {
|
|
113
|
+
console.error(`Access with provider ${provider} not allowed`);
|
|
114
|
+
if (sendError) {
|
|
115
|
+
res.status(403).send("Unauthorized");
|
|
116
|
+
}
|
|
117
|
+
return { handled: true };
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
console.error(`Access to app ${appId} not allowed`);
|
|
121
|
+
if (sendError) {
|
|
122
|
+
res.status(403).send("Unauthorized");
|
|
123
|
+
}
|
|
124
|
+
return { handled: true };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
if (sendError) {
|
|
129
|
+
res.status(403).send("Unauthorized");
|
|
130
|
+
}
|
|
131
|
+
return { handled: true };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
if (sendError) {
|
|
136
|
+
res.status(403).send("Unauthorized");
|
|
137
|
+
}
|
|
138
|
+
return { handled: true };
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
export const getAppId = (req) => req.headers["x-app"]?.toString() || ""; // MAYBE WE SHOULD CONSIDER CHECKING IF API ALLOWS RUNNING WITHOUT APP ID
|
|
142
|
+
export const getName = (req) => req.headers["x-name"]?.toString() || "";
|
|
143
|
+
export const getAssessmentId = (req) => req.headers["x-assessment"]?.toString() || "";
|
|
144
|
+
//# sourceMappingURL=request-headers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-headers.js","sourceRoot":"","sources":["../../src/helpers/request-headers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as cheerio from 'cheerio';
|
|
2
|
+
import { Bucket } from '@google-cloud/storage';
|
|
3
|
+
export declare const storeXml: (location: string, xml: string) => Promise<void>;
|
|
4
|
+
export declare const storageFileToXml: (file: {
|
|
5
|
+
download: () => Promise<Buffer[]>;
|
|
6
|
+
}) => Promise<cheerio.CheerioAPI>;
|
|
7
|
+
export declare function deleteFilesRecursive(bucket: Bucket, directory: string, excludeFiles?: string[]): Promise<void>;
|
|
8
|
+
export declare const pollForStorageFile: (bucketname: string, fileRef: string, maxAttempts?: number) => Promise<import("@google-cloud/storage").File | undefined>;
|
|
9
|
+
export declare const copyStorageFiles: (originPath: string, destPath: string, adminSdkJsonOrigin: string, adminSdkJsonDest: string) => Promise<void>;
|
|
10
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/helpers/storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAI/C,eAAO,MAAM,QAAQ,GAAU,UAAU,MAAM,EAAE,KAAK,MAAM,kBAI3D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,MAAM;IAC3C,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACnC,KAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAY7B,CAAC;AAEF,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,YAAY,GAAE,MAAM,EAAO,GAC1B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,eAAO,MAAM,kBAAkB,GAC7B,YAAY,MAAM,EAClB,SAAS,MAAM,EACf,oBAAe,8DAgBhB,CAAC;AA0FF,eAAO,MAAM,gBAAgB,GAC3B,YAAY,MAAM,EAClB,UAAU,MAAM,EAChB,oBAAoB,MAAM,EAC1B,kBAAkB,MAAM,kBAgBzB,CAAC"}
|