@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,45 @@
1
+ import { Element } from "domhandler";
2
+ import { IApplicationSpecific } from "./../interface/IApplicationSpecific";
3
+ import { ItemStatistics, PackageResource, SessionInfoTeacher, StudentAppSessionInfo, ExtendedTestContext, AssessmentInfo, ItemInfo, SessionStateType } from "@citolab/qti-api";
4
+ import { ItemContext } from "@citolab/qti-components/exports/item.context.js";
5
+ import { ModuleResolutionConfig } from "@citolab/qti-convert/qti-transformer";
6
+ export declare abstract class ApplicationSpecificBase implements IApplicationSpecific {
7
+ abstract id: string;
8
+ get db(): import("../../../helpers").DATABASE;
9
+ packageAsQti: boolean;
10
+ xmlFromDatabase: boolean;
11
+ getAssessmentInfo: (assessmentId: string, code?: string) => Promise<AssessmentInfo>;
12
+ assessmentFromStorageToDatabase: (assessmentTestLocation: string) => Promise<void>;
13
+ getCodeByUserId(userId: string, assessmentId?: string): Promise<string>;
14
+ /**
15
+ * Makes a path absolute and normalizes it.
16
+ *
17
+ * @param mediaLocation - The base location to be prefixed.
18
+ * @param relativePath - The relative path to be resolved.
19
+ * @returns The absolute path.
20
+ */
21
+ makeAbsolutePath(mediaLocation: string, relativePath: string): string;
22
+ transformPackageResource(packageResource: PackageResource, assetUrl: string): Promise<PackageResource>;
23
+ getModuleResolution(name: string): Promise<ModuleResolutionConfig | null>;
24
+ getItemInfo(item: PackageResource, $itemRef: Element | null): ItemInfo;
25
+ modifyPackageFiles(packageLocation: string): Promise<void>;
26
+ convertPackageAndAddToDatabase(packageLocation: string, assetUrl: string, extraInfo?: {
27
+ examenId?: string;
28
+ prefixAssessmentId?: string;
29
+ packageName?: string;
30
+ packageId?: string;
31
+ }): Promise<AssessmentInfo[]>;
32
+ updateItemStats<T extends ItemStatistics>(userId: string, assessmentId: string, studentId: string, itemContexts: ItemContext[], target: "teacher" | "reviewer", batch: FirebaseFirestore.WriteBatch): Promise<void>;
33
+ updateStudentStats<T extends ItemContext>(code: string, assessmentId: string, teacherId: string, testContext: ExtendedTestContext, batch: FirebaseFirestore.WriteBatch): Promise<void>;
34
+ getInitialSessionState: (assessmentInfo: AssessmentInfo) => SessionStateType;
35
+ updatePlannedSession(teacherId: string, code: string, updatedSession: SessionInfoTeacher, batch: FirebaseFirestore.WriteBatch): Promise<void>;
36
+ createSessionInfoForStudent(config: {
37
+ userId: string;
38
+ assessmentId?: string;
39
+ identification?: string;
40
+ metadata?: unknown;
41
+ }): Promise<StudentAppSessionInfo>;
42
+ getSessionInfoForStudent(userId: string, assessmentId?: string): Promise<StudentAppSessionInfo | null>;
43
+ testContextToTeacher(code: string, assessmentId: string, testContext: ExtendedTestContext, batch: FirebaseFirestore.WriteBatch): Promise<void>;
44
+ }
45
+ //# sourceMappingURL=application-specific-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-specific-base.d.ts","sourceRoot":"","sources":["../../../../src/api/app-specific/base/application-specific-base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,503 @@
1
+ import { dateId, getReadableResponseFromVariables, IsNullOrUndefined, IsTrue, removeDoubleSlashes, sort, sum, } from "../../../helpers/utils";
2
+ import * as cheerio from "cheerio";
3
+ import * as crypto from "crypto";
4
+ import * as firebaseFirestore from "firebase-admin/firestore";
5
+ import { determineItemType, extractInfoFromAssetUrl, getAllResourcesInStorageBucket, getPackageResourcesFromStorage, getResource, getStoragePackageFolder, getStorageRefFromAssetUrl, } from "./../../../helpers/package";
6
+ import { getCodeByUserId as getCodeByUserIdFromLogic, getStudentSessionInfo, getTeacherIdByCode, } from "./../../../helpers/logic";
7
+ import { qtiTransform } from "@citolab/qti-convert/qti-transformer";
8
+ import path from "path";
9
+ import { ciBootstrap, registerCES } from "../../../helpers/ci-bootstap";
10
+ import { getDatabase } from "./../../../helpers/db";
11
+ import { getFirestore, getStorage } from "./../../../helpers/firebase";
12
+ export class ApplicationSpecificBase {
13
+ get db() {
14
+ return getDatabase(this.id);
15
+ }
16
+ packageAsQti = true;
17
+ xmlFromDatabase = false;
18
+ getAssessmentInfo = async (assessmentId,
19
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
20
+ code) => {
21
+ const firestore = getFirestore();
22
+ const assessmentDoc = await firestore.doc(this.db.ASSESSMENT.DOC(assessmentId));
23
+ const assessmentRef = await assessmentDoc.get();
24
+ const assessment = assessmentRef.data();
25
+ return assessment;
26
+ };
27
+ assessmentFromStorageToDatabase;
28
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
29
+ async getCodeByUserId(userId, assessmentId) {
30
+ const code = await getCodeByUserIdFromLogic(this.db, userId);
31
+ return code || "";
32
+ }
33
+ /**
34
+ * Makes a path absolute and normalizes it.
35
+ *
36
+ * @param mediaLocation - The base location to be prefixed.
37
+ * @param relativePath - The relative path to be resolved.
38
+ * @returns The absolute path.
39
+ */
40
+ makeAbsolutePath(mediaLocation, relativePath) {
41
+ // Combine the media location and the relative path
42
+ const combinedPath = path.join(mediaLocation, relativePath);
43
+ // Normalize the combined path to resolve '..' and '.'
44
+ const normalizedPath = path.normalize(combinedPath);
45
+ return normalizedPath;
46
+ }
47
+ async transformPackageResource(packageResource,
48
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
49
+ assetUrl) {
50
+ if (packageResource.type === "item") {
51
+ const transform = qtiTransform(packageResource.content);
52
+ const processPath = (path) => {
53
+ const parts = path.split("/");
54
+ const lastPart = parts[parts.length - 1];
55
+ if (lastPart.includes(".")) {
56
+ parts.pop(); // Remove the last part if it contains a dot
57
+ }
58
+ return parts.join("/");
59
+ };
60
+ let allResourcesInPackage = [];
61
+ const transformResult = await transform
62
+ // .stripStylesheets()
63
+ .objectToImg()
64
+ .objectToVideo()
65
+ .objectToAudio()
66
+ .stripMaterialInfo()
67
+ .minChoicesToOne()
68
+ .externalScored()
69
+ .qbCleanup()
70
+ .depConvert()
71
+ .upgradePci()
72
+ .customInteraction(assetUrl, "")
73
+ .changeAssetLocationAsync(async (srcValue) => {
74
+ if (srcValue?.startsWith("http") ||
75
+ srcValue?.startsWith("data") ||
76
+ srcValue.startsWith("//") ||
77
+ !srcValue) {
78
+ return srcValue;
79
+ }
80
+ const path = packageResource.path;
81
+ const pathWithoutFilename = processPath(path);
82
+ if (path) {
83
+ // path is the relative path , the newSrc is relative to this path
84
+ const relative = `${pathWithoutFilename}/${srcValue}`;
85
+ // remove unnecessary ../ like: /items/../img/1.png must be /img/1.png
86
+ srcValue = removeDoubleSlashes(this.makeAbsolutePath(assetUrl, relative));
87
+ }
88
+ else {
89
+ srcValue = removeDoubleSlashes(this.makeAbsolutePath(assetUrl, srcValue));
90
+ }
91
+ // CHECK IF MEDIAFILE EXIST TO FIX INVALID ITEMS
92
+ const storageRef = getStorageRefFromAssetUrl(srcValue, IsTrue(process.env.SINGLE_TENANT));
93
+ const resource = await getResource(storageRef);
94
+ if (!resource) {
95
+ if (allResourcesInPackage.length === 0) {
96
+ const { applicationId, packageId } = extractInfoFromAssetUrl(assetUrl);
97
+ const ref = getStoragePackageFolder(IsTrue(process.env.SINGLE_TENANT), packageId, applicationId);
98
+ allResourcesInPackage = await getAllResourcesInStorageBucket(ref);
99
+ }
100
+ }
101
+ const mediaFileFromManifest = allResourcesInPackage.find((r) => {
102
+ const fileNamePackage = srcValue.split("/").pop();
103
+ const filenameItemRef = r.split("/").pop();
104
+ return fileNamePackage === filenameItemRef;
105
+ });
106
+ if (mediaFileFromManifest)
107
+ srcValue = removeDoubleSlashes(this.makeAbsolutePath(assetUrl, mediaFileFromManifest));
108
+ const fixedStorageRef = getStorageRefFromAssetUrl(srcValue, IsTrue(process.env.SINGLE_TENANT));
109
+ const fixedResource = await getResource(fixedStorageRef);
110
+ if (!fixedResource) {
111
+ console.error(`Resource not found: ${srcValue}`);
112
+ }
113
+ return srcValue;
114
+ });
115
+ await transformResult.configurePciAsync(assetUrl, async (relativeUrl) => {
116
+ const moduleResolution = await this.getModuleResolution(removeDoubleSlashes(`${assetUrl}/${relativeUrl}`));
117
+ if (moduleResolution) {
118
+ return moduleResolution;
119
+ }
120
+ // If no module resolution config is found, return an empty object
121
+ return {};
122
+ });
123
+ const modifiedContent = transformResult.xml();
124
+ // console.log(modifiedContent);
125
+ const updatedPackage = {
126
+ ...packageResource,
127
+ content: modifiedContent,
128
+ };
129
+ return Promise.resolve(updatedPackage);
130
+ }
131
+ return Promise.resolve(packageResource);
132
+ }
133
+ async getModuleResolution(name) {
134
+ // try to find the files: /modules/module_resolution.js` and modules/fallback_module_resolution.js`;
135
+ const storageRef = getStorageRefFromAssetUrl(name, IsTrue(process.env.SINGLE_TENANT));
136
+ const modulResolutionResource = await getResource(storageRef);
137
+ if (modulResolutionResource) {
138
+ const downloadResult = await modulResolutionResource.download();
139
+ if (downloadResult) {
140
+ const fileContent = downloadResult[0].toString("utf8");
141
+ if (fileContent) {
142
+ const config = JSON.parse(fileContent);
143
+ return config;
144
+ }
145
+ }
146
+ }
147
+ return null;
148
+ }
149
+ getItemInfo(item, $itemRef) {
150
+ const $assessmentItemDoc = cheerio.load(item.content, {
151
+ xmlMode: true,
152
+ xml: true,
153
+ });
154
+ const $assessmentItem = $assessmentItemDoc("qti-assessment-item")[0];
155
+ const title = $assessmentItem.attribs["title"];
156
+ const itemType = determineItemType(item.content);
157
+ const categories = $itemRef?.attribs["category"]?.split(" ") || [];
158
+ const isInfo = categories.find((c) => c.includes("informational")) ||
159
+ itemType === "info";
160
+ if (!item.path) {
161
+ console.warn("Item path is missing", item);
162
+ }
163
+ return {
164
+ title,
165
+ categories,
166
+ interactionType: itemType,
167
+ href: item.path,
168
+ type: isInfo ? "informational" : "regular",
169
+ identifier: item.identifier,
170
+ };
171
+ }
172
+ async modifyPackageFiles(packageLocation) {
173
+ const storage = getStorage();
174
+ let foldername = packageLocation.toLocaleLowerCase().endsWith(".zip")
175
+ ? packageLocation.split("/").slice(0, -1).join("/")
176
+ : packageLocation;
177
+ if (foldername.startsWith("/")) {
178
+ foldername = foldername.substring(1);
179
+ }
180
+ const bucket = storage.bucket();
181
+ const allFiles = await getAllResourcesInStorageBucket(foldername);
182
+ for (const file of allFiles) {
183
+ if (file.toLocaleLowerCase().endsWith("bootstrap.js")) {
184
+ // rename the file to bootstrap.org.js
185
+ const orgFile = file.replace("bootstrap.js", "bootstrap.org.js");
186
+ const newContent = ciBootstrap;
187
+ const fileRef = await bucket.file(removeDoubleSlashes(`${foldername}/${file}`)); // download the content of of the file;
188
+ const content = await fileRef.download();
189
+ const contentString = content[0].toString("utf8");
190
+ if (contentString.indexOf("CES") < 0) {
191
+ // exit
192
+ break;
193
+ }
194
+ else {
195
+ await bucket
196
+ .file(removeDoubleSlashes(`${foldername}/${orgFile}`))
197
+ .save(Buffer.from(contentString, "utf8")); // store the old file with .org
198
+ await fileRef.save(Buffer.from(newContent, "utf8"));
199
+ }
200
+ }
201
+ else if (file.toLocaleLowerCase().endsWith("index.html")) {
202
+ // rename the file to index.org.html
203
+ const orgFile = file.replace("index.html", "index.org.html");
204
+ // download the content of of the file and ibje
205
+ const fileRef = await bucket.file(removeDoubleSlashes(`${foldername}/${file}`));
206
+ const content = await fileRef.download();
207
+ const contentString = content[0].toString("utf8");
208
+ // find <head> tag and insert loadCES script after it
209
+ const headIndex = contentString.indexOf("<head>");
210
+ if (headIndex < 0 || contentString.indexOf("CES") < 0) {
211
+ // exit
212
+ break;
213
+ }
214
+ else {
215
+ await bucket
216
+ .file(removeDoubleSlashes(`${foldername}/${orgFile}`))
217
+ .save(Buffer.from(contentString, "utf8")); // store the old file with .org
218
+ const newContent = contentString
219
+ .slice(0, headIndex + 6)
220
+ .concat(`<script>${registerCES}</script>`)
221
+ .concat(contentString.slice(headIndex + 6));
222
+ await fileRef.save(Buffer.from(newContent, "utf8"));
223
+ }
224
+ }
225
+ }
226
+ }
227
+ async convertPackageAndAddToDatabase(packageLocation, assetUrl, extraInfo) {
228
+ // get last part of packageLocation
229
+ const packageName = extraInfo?.packageName || packageLocation.split("/").pop();
230
+ const packageId = extraInfo?.packageId || packageName;
231
+ const assessmentInfos = [];
232
+ const firestore = getFirestore();
233
+ const writeBatch = firestore.batch();
234
+ const qtiResources = (await getPackageResourcesFromStorage(packageLocation, assetUrl)) || [];
235
+ const assessments = qtiResources.filter((q) => q.type === "test");
236
+ const items = qtiResources.filter((q) => q.type === "item");
237
+ if (assessments.length === 0) {
238
+ // CREATE FAKE ASSESSMENT with all items
239
+ const xml = `<?xml version="1.0" encoding="utf-8"?>
240
+ <qti-assessment-test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
241
+ xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqtiasi_v3p0 https://purl.imsglobal.org/spec/qti/v3p0/schema/xsd/imsqti_asiv3p0_v1p0.xsd"
242
+ identifier="All" title="ALL items"
243
+ tool-name="CitoLab" tool-version="3.10"
244
+ xmlns="http://www.imsglobal.org/xsd/imsqtiasi_v3p0">
245
+ <qti-outcome-declaration identifier="SCORE" cardinality="single" base-type="float">
246
+ <qti-default-value>
247
+ <qti-value>0</qti-value>
248
+ </qti-default-value>
249
+ </qti-outcome-declaration>
250
+ <qti-test-part identifier="RES-b901b8e7-b516-47cc-8adc-165d065f13c7" title="Tespart-1"
251
+ navigation-mode="nonlinear" submission-mode="simultaneous">
252
+ <qti-assessment-section identifier="section_1" title="section 1"
253
+ visible="true" keep-together="false">
254
+ ${items
255
+ .map((item) => {
256
+ return `<qti-assessment-item-ref identifier="${item.identifier}" href="${item.identifier}.xml">
257
+ <qti-weight identifier="WEIGHT" value="1" />
258
+ </qti-assessment-item-ref>`;
259
+ })
260
+ .join("")}
261
+ </qti-assessment-section>
262
+ </qti-test-part>
263
+ <qti-outcome-processing>
264
+ <qti-set-outcome-value identifier="SCORE">
265
+ <qti-sum>
266
+ <qti-test-variables variable-identifier="SCORE"
267
+ weight-identifier="WEIGHT" />
268
+ </qti-sum>
269
+ </qti-set-outcome-value>
270
+ </qti-outcome-processing>
271
+ </qti-assessment-test>`;
272
+ const prefixAssessmentId = extraInfo?.prefixAssessmentId;
273
+ const assessmentId = prefixAssessmentId || "all";
274
+ const assessmentInfoAll = {
275
+ assessmentId,
276
+ assessmentHref: "all items.xml",
277
+ name: "All items",
278
+ packageName,
279
+ packageId: packageId || "",
280
+ items: items.map((i) => {
281
+ const itemInfo = this.getItemInfo(i, null);
282
+ return { ...itemInfo, itemRefIdentifier: i.identifier };
283
+ }),
284
+ };
285
+ assessmentInfos.push(assessmentInfoAll);
286
+ }
287
+ else {
288
+ for (const assessment of assessments) {
289
+ const assessmentIdFromAssessmentQti = assessment.identifier;
290
+ const prefixAssessmentId = extraInfo?.prefixAssessmentId;
291
+ const examenId = extraInfo?.examenId || assessmentIdFromAssessmentQti;
292
+ const newAssessmentId = `${prefixAssessmentId ? `${prefixAssessmentId}-` : ""}${examenId}`;
293
+ const $assessmentTest = cheerio.load(assessment.content, {
294
+ xmlMode: true,
295
+ xml: true,
296
+ });
297
+ const assessmentInfo = {
298
+ assessmentId: newAssessmentId,
299
+ name: assessment.identifier,
300
+ assessmentHref: assessment.path,
301
+ packageName,
302
+ packageId: packageId || "",
303
+ items: items.map((item) => {
304
+ const $itemRef = $assessmentTest(`qti-assessment-item-ref[identifier="${item.identifier}"]`);
305
+ if (!item.path) {
306
+ console.warn("Item path is missing", item);
307
+ }
308
+ const infoInfo = this.getItemInfo(item, $itemRef.length > 0 ? $itemRef[0] : null);
309
+ return { ...infoInfo, itemRefIdentifier: item.identifier };
310
+ }),
311
+ };
312
+ assessmentInfos.push(assessmentInfo);
313
+ const assessmentPath = this.db.ASSESSMENT.DOC(newAssessmentId);
314
+ writeBatch.set(firestore.doc(assessmentPath), assessmentInfo, {
315
+ merge: true,
316
+ });
317
+ }
318
+ }
319
+ await writeBatch.commit();
320
+ return assessmentInfos;
321
+ }
322
+ async updateItemStats(userId, assessmentId, studentId, itemContexts, target, batch) {
323
+ const firestore = getFirestore();
324
+ for (const itemContext of itemContexts) {
325
+ if (!itemContext.variables) {
326
+ console.warn(`Item context for item ${itemContext.identifier} has no variables. Skipping update.`);
327
+ continue;
328
+ }
329
+ if (!itemContext.identifier) {
330
+ console.warn(`Item context for item with no identifier. Skipping update.`);
331
+ continue;
332
+ }
333
+ // Check if this item is completed
334
+ const completionStatus = itemContext.variables.find((i) => i.identifier.toLocaleLowerCase() === "completionstatus");
335
+ const isCompleted = completionStatus?.value === "completed" ||
336
+ itemContext.variables
337
+ .filter((v) => v.identifier.toLocaleLowerCase().startsWith("response"))
338
+ .every((v) => !!v.value);
339
+ // Extract response data
340
+ const responseVariables = itemContext.variables.filter((variable) => variable.identifier.startsWith("RESPONSE"));
341
+ const responseValue = sort(responseVariables, (r) => r.identifier)
342
+ .map((r, index) => {
343
+ let value;
344
+ if (Array.isArray(r.value)) {
345
+ value = r.value.map((v) => v.trim()).join("#");
346
+ }
347
+ else {
348
+ value = r.value?.toString().trim() || "(--leeg--)";
349
+ }
350
+ return responseVariables.length > 1
351
+ ? `${index + 1}. ${value || "(--leeg--"}`
352
+ : value || "(--leeg--)";
353
+ })
354
+ .join("\n");
355
+ // Determine if answer is correct
356
+ const scoreVariable = itemContext.variables.find((variable) => variable.identifier === "SCORE");
357
+ const isCorrect = !IsNullOrUndefined(scoreVariable?.value) &&
358
+ parseInt(scoreVariable.value.toString() || "0") > 0;
359
+ // Generate response ID
360
+ const generateHash = (input) => {
361
+ return crypto.createHash("sha256").update(input).digest("hex");
362
+ };
363
+ const stringContainsOnlyUpperCaseLetters = (input) => {
364
+ const isValidFormat = /^[A-Z0-9 ]*$/.test(input);
365
+ const containsAlphanumeric = /[A-Z0-9]/.test(input);
366
+ return isValidFormat && containsAlphanumeric;
367
+ };
368
+ const responseId = stringContainsOnlyUpperCaseLetters(responseValue)
369
+ ? responseValue.replace(" ", "_")
370
+ : !responseValue
371
+ ? "(--leeg--)"
372
+ : generateHash(responseValue).toString();
373
+ // Add studentId to the response
374
+ const responsePath = target === "teacher"
375
+ ? this.db.TEACHER.ASSESSMENT_ITEM_STATS.RESPONSES.DOC(userId, assessmentId, itemContext.identifier, responseId)
376
+ : this.db.REVIEWER.ASSESSMENT_ITEM_STATS.RESPONSES.DOC(userId, assessmentId, itemContext.identifier, responseId);
377
+ // Update response statistics with atomic operations
378
+ batch.set(firestore.doc(responsePath), {
379
+ value: responseValue,
380
+ count: firebaseFirestore.FieldValue.increment(1),
381
+ score: scoreVariable?.value || null,
382
+ manualScore: null,
383
+ // Create a subcollection reference for student IDs instead of an array
384
+ }, { merge: true });
385
+ // Store student ID in a subcollection of the response
386
+ batch.set(firestore.doc(`${responsePath}/students/${studentId}`), {
387
+ studentId,
388
+ timestamp: dateId(),
389
+ });
390
+ }
391
+ }
392
+ async updateStudentStats(code, assessmentId, teacherId, testContext, batch) {
393
+ const itemResults = testContext.items
394
+ .filter((item) => item.variables && item.variables.length > 0)
395
+ .map((item) => {
396
+ const itemVariables = item.variables;
397
+ const completionStatus = itemVariables.find((i) => i.identifier.toLocaleLowerCase() === "completionstatus");
398
+ const response = getReadableResponseFromVariables(itemVariables);
399
+ const score = itemVariables.find((i) => i.identifier.toLocaleLowerCase() === "score")?.value || 0;
400
+ return {
401
+ completionStatus: completionStatus?.value || "unknown",
402
+ identifier: item.identifier,
403
+ response,
404
+ score,
405
+ variables: item.variables,
406
+ };
407
+ });
408
+ const assessmentRawScore = sum(itemResults.map((i) => +i.score));
409
+ const studentResult = {
410
+ code,
411
+ items: testContext.items.map((item) => {
412
+ return item;
413
+ }),
414
+ score: assessmentRawScore,
415
+ };
416
+ // const allItemsCompleted = itemResults.every(
417
+ // (i) => i.completionState === 'completed'
418
+ // );
419
+ const path = this.db.TEACHER.ASSESSMENT_RESULTS.DOC(teacherId, assessmentId, code);
420
+ const firestore = getFirestore();
421
+ const assessmentResultDoc = firestore.doc(path);
422
+ batch.set(assessmentResultDoc, studentResult);
423
+ const updatedSession = {
424
+ assessmentId,
425
+ code,
426
+ sessionState: testContext.state || "not_started",
427
+ testScore: assessmentRawScore,
428
+ };
429
+ await this.updatePlannedSession(teacherId, code, updatedSession, batch);
430
+ }
431
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
432
+ getInitialSessionState = (assessmentInfo) => "not_started";
433
+ async updatePlannedSession(teacherId, code, updatedSession, batch) {
434
+ // TODO: // update this for planned dashboardPlannedSessions<TeacherAssessementResult>;
435
+ const firestore = getFirestore();
436
+ const application = await firestore.doc(this.db.APPLICATION.DOC()).get();
437
+ if (!application.exists) {
438
+ return;
439
+ }
440
+ const applicationData = application.data();
441
+ if (!applicationData) {
442
+ return;
443
+ }
444
+ const path = this.db.TEACHER.STUDENTS.SESSION.DOC(teacherId, code, updatedSession.assessmentId);
445
+ const sessionDoc = firestore.doc(path);
446
+ const isAnyFieldUndefined = Object.values(updatedSession).some((v) => v === undefined);
447
+ if (isAnyFieldUndefined) {
448
+ return;
449
+ }
450
+ if (isAnyFieldUndefined) {
451
+ console.log("");
452
+ }
453
+ batch.set(sessionDoc, updatedSession);
454
+ const studentPlanningDocRef = firestore.doc(this.db.TEACHER.STUDENTS.DOC(teacherId, code));
455
+ const plannedSession = (await studentPlanningDocRef.get())?.data();
456
+ // TODO: move to snelkookpan specific.
457
+ if (plannedSession) {
458
+ const updatedSessions = {
459
+ ...plannedSession,
460
+ sessions: plannedSession.sessions.map((s) => {
461
+ if (s.assessmentId === updatedSession.assessmentId) {
462
+ return updatedSession;
463
+ }
464
+ return s;
465
+ }),
466
+ };
467
+ if (updatedSessions) {
468
+ batch.set(studentPlanningDocRef, updatedSessions);
469
+ }
470
+ }
471
+ }
472
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
473
+ createSessionInfoForStudent(config) {
474
+ throw new Error("Creating sessions for students is by default not allowed.");
475
+ }
476
+ // for base, get by code by default. Can be overriden by application specific
477
+ async getSessionInfoForStudent(userId,
478
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
479
+ assessmentId) {
480
+ const code = await this.getCodeByUserId(userId, assessmentId);
481
+ if (!code) {
482
+ return null;
483
+ }
484
+ const sessionInfo = await getStudentSessionInfo(code.toUpperCase(), this.db);
485
+ if (sessionInfo) {
486
+ return sessionInfo;
487
+ }
488
+ else {
489
+ return null;
490
+ }
491
+ }
492
+ async testContextToTeacher(code, assessmentId, testContext, batch) {
493
+ //const firestore = getFirestore();
494
+ const teacherId = await getTeacherIdByCode(this.db, code);
495
+ if (!teacherId) {
496
+ console.warn(`No teacher found for code ${code}`);
497
+ return;
498
+ }
499
+ //await Promise.all(updateModItemStats);
500
+ await this.updateStudentStats(code, assessmentId, teacherId, testContext, batch);
501
+ }
502
+ }
503
+ //# sourceMappingURL=application-specific-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-specific-base.js","sourceRoot":"","sources":["../../../../src/api/app-specific/base/application-specific-base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import * as cheerio from "cheerio";
2
+ import { Element } from "domhandler";
3
+ export declare const removeWrapper: ($: cheerio.CheerioAPI, query: string) => void;
4
+ export declare const removeWrapperByElement: ($wrapper: cheerio.Cheerio<Element>) => void;
5
+ //# sourceMappingURL=cheerio-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cheerio-helper.d.ts","sourceRoot":"","sources":["../../../../src/api/app-specific/base/cheerio-helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,eAAO,MAAM,aAAa,GAAI,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,MAAM,SAOjE,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,UAAU,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAMxE,CAAC"}
@@ -0,0 +1,16 @@
1
+ export const removeWrapper = ($, query) => {
2
+ const $wrapper = $(query);
3
+ const html = $wrapper.html();
4
+ if (!html) {
5
+ return;
6
+ }
7
+ $wrapper?.replaceWith(html);
8
+ };
9
+ export const removeWrapperByElement = ($wrapper) => {
10
+ const html = $wrapper.html();
11
+ if (!html) {
12
+ return;
13
+ }
14
+ $wrapper?.replaceWith(html);
15
+ };
16
+ //# sourceMappingURL=cheerio-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cheerio-helper.js","sourceRoot":"","sources":["../../../../src/api/app-specific/base/cheerio-helper.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAqB,EAAE,KAAa,EAAE,EAAE;IACpE,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IACD,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAkC,EAAE,EAAE;IAC3E,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IACD,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { ApplicationSpecificBase } from './base/application-specific-base';
2
+ export declare class BaseImplementation extends ApplicationSpecificBase {
3
+ id: string;
4
+ constructor(id?: string);
5
+ }
6
+ //# sourceMappingURL=baseImplementation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseImplementation.d.ts","sourceRoot":"","sources":["../../../src/api/app-specific/baseImplementation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAE3E,qBAAa,kBAAmB,SAAQ,uBAAuB;IAC7D,EAAE,SAAU;gBAEA,EAAE,CAAC,EAAE,MAAM;CAMxB"}
@@ -0,0 +1,11 @@
1
+ import { ApplicationSpecificBase } from './base/application-specific-base';
2
+ export class BaseImplementation extends ApplicationSpecificBase {
3
+ id = 'base';
4
+ constructor(id) {
5
+ super();
6
+ if (id) {
7
+ this.id = id;
8
+ }
9
+ }
10
+ }
11
+ //# sourceMappingURL=baseImplementation.js.map