@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,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 @@
|
|
|
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
|