@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.
Files changed (111) hide show
  1. package/LICENSE.md +674 -0
  2. package/dist/api/app-specific/base/application-specific-base.d.ts +45 -0
  3. package/dist/api/app-specific/base/application-specific-base.d.ts.map +1 -0
  4. package/dist/api/app-specific/base/application-specific-base.js +503 -0
  5. package/dist/api/app-specific/base/application-specific-base.js.map +1 -0
  6. package/dist/api/app-specific/base/cheerio-helper.d.ts +5 -0
  7. package/dist/api/app-specific/base/cheerio-helper.d.ts.map +1 -0
  8. package/dist/api/app-specific/base/cheerio-helper.js +16 -0
  9. package/dist/api/app-specific/base/cheerio-helper.js.map +1 -0
  10. package/dist/api/app-specific/baseImplementation.d.ts +6 -0
  11. package/dist/api/app-specific/baseImplementation.d.ts.map +1 -0
  12. package/dist/api/app-specific/baseImplementation.js +11 -0
  13. package/dist/api/app-specific/baseImplementation.js.map +1 -0
  14. package/dist/api/app-specific/index.d.ts +4 -0
  15. package/dist/api/app-specific/index.d.ts.map +1 -0
  16. package/dist/api/app-specific/index.js +4 -0
  17. package/dist/api/app-specific/index.js.map +1 -0
  18. package/dist/api/app-specific/interface/IApplicationSpecific.d.ts +31 -0
  19. package/dist/api/app-specific/interface/IApplicationSpecific.d.ts.map +1 -0
  20. package/dist/api/app-specific/interface/IApplicationSpecific.js +2 -0
  21. package/dist/api/app-specific/interface/IApplicationSpecific.js.map +1 -0
  22. package/dist/api/app-specific/specific.d.ts +1 -0
  23. package/dist/api/app-specific/specific.d.ts.map +1 -0
  24. package/dist/api/app-specific/specific.js +31 -0
  25. package/dist/api/app-specific/specific.js.map +1 -0
  26. package/dist/api/index.d.ts +3 -0
  27. package/dist/api/index.d.ts.map +1 -0
  28. package/dist/api/index.js +15 -0
  29. package/dist/api/index.js.map +1 -0
  30. package/dist/api/qti-data.d.ts +4 -0
  31. package/dist/api/qti-data.d.ts.map +1 -0
  32. package/dist/api/qti-data.js +622 -0
  33. package/dist/api/qti-data.js.map +1 -0
  34. package/dist/api/qti-resources.d.ts +4 -0
  35. package/dist/api/qti-resources.d.ts.map +1 -0
  36. package/dist/api/qti-resources.js +348 -0
  37. package/dist/api/qti-resources.js.map +1 -0
  38. package/dist/api/qti-teacher.d.ts +6 -0
  39. package/dist/api/qti-teacher.d.ts.map +1 -0
  40. package/dist/api/qti-teacher.js +807 -0
  41. package/dist/api/qti-teacher.js.map +1 -0
  42. package/dist/api/qti-tools.d.ts +3 -0
  43. package/dist/api/qti-tools.d.ts.map +1 -0
  44. package/dist/api/qti-tools.js +450 -0
  45. package/dist/api/qti-tools.js.map +1 -0
  46. package/dist/console.d.ts +2 -0
  47. package/dist/console.d.ts.map +1 -0
  48. package/dist/console.js +30 -0
  49. package/dist/console.js.map +1 -0
  50. package/dist/express-test.d.ts +2 -0
  51. package/dist/express-test.d.ts.map +1 -0
  52. package/dist/express-test.js +19 -0
  53. package/dist/express-test.js.map +1 -0
  54. package/dist/helpers/ci-bootstap.d.ts +4 -0
  55. package/dist/helpers/ci-bootstap.d.ts.map +1 -0
  56. package/dist/helpers/ci-bootstap.js +96 -0
  57. package/dist/helpers/ci-bootstap.js.map +1 -0
  58. package/dist/helpers/database.d.ts +110 -0
  59. package/dist/helpers/database.d.ts.map +1 -0
  60. package/dist/helpers/database.js +151 -0
  61. package/dist/helpers/database.js.map +1 -0
  62. package/dist/helpers/db.d.ts +3 -0
  63. package/dist/helpers/db.d.ts.map +1 -0
  64. package/dist/helpers/db.js +10 -0
  65. package/dist/helpers/db.js.map +1 -0
  66. package/dist/helpers/endpoint-helpers.d.ts +33 -0
  67. package/dist/helpers/endpoint-helpers.d.ts.map +1 -0
  68. package/dist/helpers/endpoint-helpers.js +149 -0
  69. package/dist/helpers/endpoint-helpers.js.map +1 -0
  70. package/dist/helpers/firebase.d.ts +7 -0
  71. package/dist/helpers/firebase.d.ts.map +1 -0
  72. package/dist/helpers/firebase.js +15 -0
  73. package/dist/helpers/firebase.js.map +1 -0
  74. package/dist/helpers/index.d.ts +11 -0
  75. package/dist/helpers/index.d.ts.map +1 -0
  76. package/dist/helpers/index.js +11 -0
  77. package/dist/helpers/index.js.map +1 -0
  78. package/dist/helpers/local-helpers.d.ts +2 -0
  79. package/dist/helpers/local-helpers.d.ts.map +1 -0
  80. package/dist/helpers/local-helpers.js +11 -0
  81. package/dist/helpers/local-helpers.js.map +1 -0
  82. package/dist/helpers/logic.d.ts +73 -0
  83. package/dist/helpers/logic.d.ts.map +1 -0
  84. package/dist/helpers/logic.js +759 -0
  85. package/dist/helpers/logic.js.map +1 -0
  86. package/dist/helpers/package-upload.d.ts +16 -0
  87. package/dist/helpers/package-upload.d.ts.map +1 -0
  88. package/dist/helpers/package-upload.js +160 -0
  89. package/dist/helpers/package-upload.js.map +1 -0
  90. package/dist/helpers/package.d.ts +32 -0
  91. package/dist/helpers/package.d.ts.map +1 -0
  92. package/dist/helpers/package.js +373 -0
  93. package/dist/helpers/package.js.map +1 -0
  94. package/dist/helpers/request-headers.d.ts +27 -0
  95. package/dist/helpers/request-headers.d.ts.map +1 -0
  96. package/dist/helpers/request-headers.js +144 -0
  97. package/dist/helpers/request-headers.js.map +1 -0
  98. package/dist/helpers/storage.d.ts +10 -0
  99. package/dist/helpers/storage.d.ts.map +1 -0
  100. package/dist/helpers/storage.js +132 -0
  101. package/dist/helpers/storage.js.map +1 -0
  102. package/dist/helpers/utils.d.ts +42 -0
  103. package/dist/helpers/utils.d.ts.map +1 -0
  104. package/dist/helpers/utils.js +228 -0
  105. package/dist/helpers/utils.js.map +1 -0
  106. package/dist/main.d.ts +2 -0
  107. package/dist/main.d.ts.map +1 -0
  108. package/dist/main.js +14 -0
  109. package/dist/main.js.map +1 -0
  110. package/package.json +101 -0
  111. 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"}