@citolab/qti-backend-firebase 0.0.3 → 0.0.5
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/dist/api/app-specific/base/application-specific-base.d.ts +11 -20
- package/dist/api/app-specific/base/application-specific-base.d.ts.map +1 -1
- package/dist/api/app-specific/base/application-specific-base.js +73 -88
- package/dist/api/app-specific/base/application-specific-base.js.map +1 -1
- package/dist/api/app-specific/baseImplementation.d.ts +2 -3
- package/dist/api/app-specific/baseImplementation.d.ts.map +1 -1
- package/dist/api/app-specific/baseImplementation.js +2 -6
- package/dist/api/app-specific/baseImplementation.js.map +1 -1
- package/dist/api/app-specific/index.d.ts +1 -0
- package/dist/api/app-specific/index.d.ts.map +1 -1
- package/dist/api/app-specific/index.js +1 -0
- package/dist/api/app-specific/index.js.map +1 -1
- package/dist/api/app-specific/interface/IApplicationSpecific.d.ts +10 -20
- package/dist/api/app-specific/interface/IApplicationSpecific.d.ts.map +1 -1
- package/dist/api/qti-data.d.ts.map +1 -1
- package/dist/api/qti-data.js +619 -271
- package/dist/api/qti-data.js.map +1 -1
- package/dist/api/qti-resources.d.ts.map +1 -1
- package/dist/api/qti-resources.js +134 -131
- package/dist/api/qti-resources.js.map +1 -1
- package/dist/api/qti-teacher.d.ts.map +1 -1
- package/dist/api/qti-teacher.js +563 -424
- package/dist/api/qti-teacher.js.map +1 -1
- package/dist/api/qti-tools.d.ts.map +1 -1
- package/dist/api/qti-tools.js +213 -41
- package/dist/api/qti-tools.js.map +1 -1
- package/dist/helpers/database.d.ts +35 -24
- package/dist/helpers/database.d.ts.map +1 -1
- package/dist/helpers/database.js +47 -36
- package/dist/helpers/database.js.map +1 -1
- package/dist/helpers/db.d.ts +1 -1
- package/dist/helpers/db.d.ts.map +1 -1
- package/dist/helpers/db.js +3 -7
- package/dist/helpers/db.js.map +1 -1
- package/dist/helpers/endpoint-helpers.d.ts +2 -2
- package/dist/helpers/endpoint-helpers.d.ts.map +1 -1
- package/dist/helpers/endpoint-helpers.js +59 -17
- package/dist/helpers/endpoint-helpers.js.map +1 -1
- package/dist/helpers/excel-helper.d.ts +29 -0
- package/dist/helpers/excel-helper.d.ts.map +1 -0
- package/dist/helpers/excel-helper.js +150 -0
- package/dist/helpers/excel-helper.js.map +1 -0
- package/dist/helpers/general.d.ts +15 -0
- package/dist/helpers/general.d.ts.map +1 -0
- package/dist/helpers/general.js +148 -0
- package/dist/helpers/general.js.map +1 -0
- package/dist/helpers/index.d.ts +2 -0
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/index.js +2 -0
- package/dist/helpers/index.js.map +1 -1
- package/dist/helpers/logic.d.ts +100 -41
- package/dist/helpers/logic.d.ts.map +1 -1
- package/dist/helpers/logic.js +523 -413
- package/dist/helpers/logic.js.map +1 -1
- package/dist/helpers/package-upload.d.ts.map +1 -1
- package/dist/helpers/package-upload.js +2 -3
- package/dist/helpers/package-upload.js.map +1 -1
- package/dist/helpers/package.d.ts +3 -4
- package/dist/helpers/package.d.ts.map +1 -1
- package/dist/helpers/package.js +12 -17
- package/dist/helpers/package.js.map +1 -1
- package/dist/helpers/request-headers.d.ts +4 -0
- package/dist/helpers/request-headers.d.ts.map +1 -1
- package/dist/helpers/request-headers.js +2 -2
- package/dist/helpers/request-headers.js.map +1 -1
- package/dist/helpers/resource-cache.d.ts +35 -0
- package/dist/helpers/resource-cache.d.ts.map +1 -0
- package/dist/helpers/resource-cache.js +171 -0
- package/dist/helpers/resource-cache.js.map +1 -0
- package/dist/helpers/storage.d.ts +2 -2
- package/dist/helpers/storage.d.ts.map +1 -1
- package/dist/helpers/storage.js +16 -15
- package/dist/helpers/storage.js.map +1 -1
- package/dist/helpers/utils.d.ts +4 -3
- package/dist/helpers/utils.d.ts.map +1 -1
- package/dist/helpers/utils.js +73 -51
- package/dist/helpers/utils.js.map +1 -1
- package/package.json +12 -9
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import Excel from "exceljs";
|
|
2
|
+
export class ExcelHelper {
|
|
3
|
+
filename;
|
|
4
|
+
worksheetName;
|
|
5
|
+
workbook = new Excel.Workbook();
|
|
6
|
+
worksheet = undefined;
|
|
7
|
+
columnsByIndex = new Map();
|
|
8
|
+
columnsByName = new Map();
|
|
9
|
+
rows = [];
|
|
10
|
+
constructor(filename, worksheetName) {
|
|
11
|
+
this.filename = filename;
|
|
12
|
+
this.worksheetName = worksheetName;
|
|
13
|
+
}
|
|
14
|
+
async save() {
|
|
15
|
+
await this.workbook.xlsx.writeFile(this.filename);
|
|
16
|
+
}
|
|
17
|
+
async init() {
|
|
18
|
+
await this.workbook.xlsx.readFile(this.filename);
|
|
19
|
+
if (this.worksheetName) {
|
|
20
|
+
this.workbook.worksheets.forEach((w) => {
|
|
21
|
+
if (w.name === this.worksheetName) {
|
|
22
|
+
this.worksheet = w;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
this.worksheet = this.workbook.getWorksheet(1);
|
|
28
|
+
}
|
|
29
|
+
if (!this.worksheet) {
|
|
30
|
+
throw new Error(`Worksheet ${this.worksheetName} not found in file ${this.filename}`);
|
|
31
|
+
}
|
|
32
|
+
this.worksheet.getRow(1).eachCell((cell, colNumber) => {
|
|
33
|
+
if (cell.value?.toString()) {
|
|
34
|
+
this.columnsByIndex.set(colNumber, cell.value.toString().toLowerCase());
|
|
35
|
+
this.columnsByName.set(cell.value.toString().toLowerCase(), colNumber);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
// this loads the rows
|
|
39
|
+
this.clearFilter();
|
|
40
|
+
}
|
|
41
|
+
getCellValue(row, key) {
|
|
42
|
+
const cellKey = this.columnsByName.get(key);
|
|
43
|
+
if (!cellKey) {
|
|
44
|
+
console.error(`Column ${key} not found in worksheet`);
|
|
45
|
+
return "";
|
|
46
|
+
}
|
|
47
|
+
return row.getCell(cellKey).value?.toString() || "";
|
|
48
|
+
}
|
|
49
|
+
uniqueValuesInColumn(key) {
|
|
50
|
+
const values = [];
|
|
51
|
+
const columnIndex = this.columnsByName.get(key);
|
|
52
|
+
if (!this.worksheet || !columnIndex) {
|
|
53
|
+
return values;
|
|
54
|
+
}
|
|
55
|
+
this.worksheet.eachRow((row, rowNumber) => {
|
|
56
|
+
if (rowNumber === 1)
|
|
57
|
+
return;
|
|
58
|
+
const value = row.getCell(columnIndex)?.value || "";
|
|
59
|
+
if (!value)
|
|
60
|
+
return;
|
|
61
|
+
if (!values.includes(value.toString())) {
|
|
62
|
+
values.push(value.toString());
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
return values;
|
|
66
|
+
}
|
|
67
|
+
clearFilter() {
|
|
68
|
+
if (!this.worksheet) {
|
|
69
|
+
throw new Error("Worksheet not initialized");
|
|
70
|
+
}
|
|
71
|
+
this.rows = Array.from(this.worksheet.getRows(2, this.worksheet.rowCount - 1) || []).map((r) => new ExcelHelperRow(r, this.columnsByName));
|
|
72
|
+
}
|
|
73
|
+
filterSheetByColumnValue(filter) {
|
|
74
|
+
const filterWithColumnNumber = filter.map(({ columnName, value }) => {
|
|
75
|
+
const columnNumber = this.columnsByName.get(columnName.toLowerCase());
|
|
76
|
+
return { columnNumber, value, columnName };
|
|
77
|
+
});
|
|
78
|
+
// get the rows with column Packagenaam = bb-bi-22-examenvariant-1
|
|
79
|
+
const filteredRows = [];
|
|
80
|
+
if (!this.worksheet) {
|
|
81
|
+
throw new Error("Worksheet not initialized");
|
|
82
|
+
}
|
|
83
|
+
this.worksheet.eachRow((row, rowNumber) => {
|
|
84
|
+
let matchesFilter = true;
|
|
85
|
+
for (const { columnNumber, value } of filterWithColumnNumber) {
|
|
86
|
+
if (columnNumber === undefined || columnNumber === null) {
|
|
87
|
+
console.error(`Column ${columnNumber} not found in worksheet`);
|
|
88
|
+
matchesFilter = false;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
if (row.getCell(columnNumber).value?.toString() !== value?.toString()) {
|
|
92
|
+
matchesFilter = false;
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (matchesFilter) {
|
|
97
|
+
filteredRows.push(row);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
this.rows = filteredRows.map((r) => new ExcelHelperRow(r, this.columnsByName));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export class ExcelHelperRow {
|
|
104
|
+
row;
|
|
105
|
+
columnsByName;
|
|
106
|
+
constructor(row, columnsByName) {
|
|
107
|
+
this.row = row;
|
|
108
|
+
this.columnsByName = columnsByName;
|
|
109
|
+
}
|
|
110
|
+
getValue(key) {
|
|
111
|
+
if (!this.columnsByName.get(key.toLowerCase())) {
|
|
112
|
+
console.error(`Column ${key} not found in row ${this.row.number}`);
|
|
113
|
+
return "";
|
|
114
|
+
}
|
|
115
|
+
if (!key) {
|
|
116
|
+
return "";
|
|
117
|
+
}
|
|
118
|
+
const columnName = this.columnsByName.get(key.toLowerCase());
|
|
119
|
+
if (!columnName) {
|
|
120
|
+
return "";
|
|
121
|
+
}
|
|
122
|
+
const cellValue = this.row.getCell(columnName)?.value;
|
|
123
|
+
const value = cellValue?.text
|
|
124
|
+
? cellValue.text
|
|
125
|
+
: cellValue?.toString() || "";
|
|
126
|
+
return value === "[object Object]" ? "" : value;
|
|
127
|
+
}
|
|
128
|
+
getNumericValue(key) {
|
|
129
|
+
const value = this.getValue(key);
|
|
130
|
+
try {
|
|
131
|
+
const number = parseFloat(value);
|
|
132
|
+
if (isNaN(number)) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
return number;
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
setValue = (key, value) => {
|
|
142
|
+
const columnName = this.columnsByName.get(key.toLowerCase());
|
|
143
|
+
if (!columnName) {
|
|
144
|
+
console.error(`Column ${key} not found in row ${this.row.number}`);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
this.row.getCell(columnName).value = value;
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=excel-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"excel-helper.js","sourceRoot":"","sources":["../../src/helpers/excel-helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DATABASE } from "./database";
|
|
2
|
+
import { IApplicationSpecific } from "../api/app-specific";
|
|
3
|
+
export declare function syncStudentResultsToTeacher(specificImplementation: IApplicationSpecific, db: DATABASE, filterByIds?: string[]): Promise<void>;
|
|
4
|
+
export declare function addUserByEmail(email: string, application: string, password: string | undefined, isAdmin: boolean | undefined, db: DATABASE): Promise<string>;
|
|
5
|
+
export declare function manualScored(xml: string): boolean;
|
|
6
|
+
export declare const getFolderNames: (parentFolder: string) => Promise<string[]>;
|
|
7
|
+
interface UploadOptions {
|
|
8
|
+
checkForManualFix?: (filename: string) => Promise<string>;
|
|
9
|
+
overrideOther?: boolean;
|
|
10
|
+
overrideXml?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function uploadFolderToStorage(folder: string, storageDestinationPath: string, uploadFiles: Promise<unknown>[], options?: UploadOptions): Promise<void>;
|
|
13
|
+
export declare function addAssessmentResources(backendUrl: string, db: DATABASE, specificImplementation: IApplicationSpecific): Promise<void>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=general.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"general.d.ts","sourceRoot":"","sources":["../../src/helpers/general.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,wBAAsB,2BAA2B,CAC/C,sBAAsB,EAAE,oBAAoB,EAC5C,EAAE,EAAE,QAAQ,EACZ,WAAW,GAAE,MAAM,EAAO,iBAmD3B;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,QAAQ,oBAAK,EACb,OAAO,qBAAQ,EACf,EAAE,EAAE,QAAQ,mBAkCb;AAOD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,WAEvC;AAED,eAAO,MAAM,cAAc,GAAU,cAAc,MAAM,sBAWxD,CAAC;AAEF,UAAU,aAAa;IACrB,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,sBAAsB,EAAE,MAAM,EAC9B,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,EAC/B,OAAO,GAAE,aAAkB,iBAkD5B;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,QAAQ,EACZ,sBAAsB,EAAE,oBAAoB,iBAqB7C"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
import { getAuth, getFirestore, getStorage } from "../helpers/firebase";
|
|
3
|
+
import fs from "fs/promises";
|
|
4
|
+
import mime from "mime";
|
|
5
|
+
import path from "path";
|
|
6
|
+
export async function syncStudentResultsToTeacher(specificImplementation, db, filterByIds = []) {
|
|
7
|
+
const firestore = getFirestore();
|
|
8
|
+
const batch = firestore.batch();
|
|
9
|
+
const allSessionsReferences = await firestore
|
|
10
|
+
.collection(db.SESSION.COLLECTION())
|
|
11
|
+
.get();
|
|
12
|
+
const allSessions = allSessionsReferences.docs.map((d) => d.data());
|
|
13
|
+
// const applicationSpecific = getSpecificImplementation(applicationId);
|
|
14
|
+
for (const session of allSessions) {
|
|
15
|
+
const code = session.code;
|
|
16
|
+
if (filterByIds.length > 0 && !filterByIds.includes(code)) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
// const studentSessions = await firestore
|
|
20
|
+
// .collection(db.SESSION.COLLECTION(code))
|
|
21
|
+
// .get();
|
|
22
|
+
// for (const session of studentSessions.docs) {
|
|
23
|
+
const assessmentId = session.id;
|
|
24
|
+
const testContextRef = await firestore
|
|
25
|
+
.doc(db.SESSION.TEST_CONTEXT(code))
|
|
26
|
+
.get();
|
|
27
|
+
const testContext = testContextRef.exists
|
|
28
|
+
? testContextRef.data()
|
|
29
|
+
: null;
|
|
30
|
+
if (!testContext) {
|
|
31
|
+
console.error(`No test context found for student ${code} assessment ${assessmentId}`);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (!testContext.state) {
|
|
35
|
+
if (session.sessionState) {
|
|
36
|
+
testContext.state = session.sessionState;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
await specificImplementation.testContextToTeacher(code, assessmentId, session.deliveryId, session.teacherId, testContext, batch);
|
|
40
|
+
await batch.commit();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export async function addUserByEmail(email, application, password = "", isAdmin = false, db) {
|
|
44
|
+
let emailVerifyLink = "";
|
|
45
|
+
const auth = getAuth();
|
|
46
|
+
// check if user exists
|
|
47
|
+
let user = null;
|
|
48
|
+
try {
|
|
49
|
+
user = await auth.getUserByEmail(email);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// not found results in an error
|
|
53
|
+
}
|
|
54
|
+
if (!user) {
|
|
55
|
+
user = await auth.createUser({
|
|
56
|
+
displayName: email.split("@")[0],
|
|
57
|
+
email,
|
|
58
|
+
password: password || generatePassword(),
|
|
59
|
+
emailVerified: true,
|
|
60
|
+
});
|
|
61
|
+
if (!password) {
|
|
62
|
+
emailVerifyLink = await auth.generatePasswordResetLink(email);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const firestore = getFirestore();
|
|
66
|
+
const docRef = firestore.doc(db.AUTH.CHECK_APP_RIGHTS(user.uid, application));
|
|
67
|
+
const doc = await docRef.get();
|
|
68
|
+
if (!doc.exists) {
|
|
69
|
+
await docRef.set({ email, userId: user.uid, application });
|
|
70
|
+
}
|
|
71
|
+
if (isAdmin) {
|
|
72
|
+
const userDoc = firestore.doc(db.AUTH.DOC(user.uid));
|
|
73
|
+
await userDoc.set({ admin: true });
|
|
74
|
+
}
|
|
75
|
+
return emailVerifyLink;
|
|
76
|
+
}
|
|
77
|
+
function generatePassword() {
|
|
78
|
+
const password = Math.random().toString(36).slice(-8);
|
|
79
|
+
return password;
|
|
80
|
+
}
|
|
81
|
+
export function manualScored(xml) {
|
|
82
|
+
return xml.includes('use="instructions" view="scorer">');
|
|
83
|
+
}
|
|
84
|
+
export const getFolderNames = async (parentFolder) => {
|
|
85
|
+
const folderNames = [];
|
|
86
|
+
const folderReader = await fs.readdir(parentFolder, {
|
|
87
|
+
withFileTypes: true,
|
|
88
|
+
});
|
|
89
|
+
for (const folder of folderReader) {
|
|
90
|
+
if (folder.isDirectory()) {
|
|
91
|
+
folderNames.push(`${parentFolder}/${folder.name}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return folderNames;
|
|
95
|
+
};
|
|
96
|
+
export async function uploadFolderToStorage(folder, storageDestinationPath, uploadFiles, options = {} // default empty object
|
|
97
|
+
) {
|
|
98
|
+
const storage = getStorage();
|
|
99
|
+
const bucket = storage.bucket();
|
|
100
|
+
const files = await fs.readdir(folder);
|
|
101
|
+
for (const file of files) {
|
|
102
|
+
if (file === ".DS_Store") {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const filePath = `${folder}/${file}`;
|
|
106
|
+
const stat = await fs.stat(filePath);
|
|
107
|
+
if (stat.isDirectory()) {
|
|
108
|
+
// Recursively upload files in subfolder
|
|
109
|
+
await uploadFolderToStorage(filePath, `${storageDestinationPath}/${file}`, uploadFiles, options);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log(`uploading ${filePath}`);
|
|
113
|
+
let fileToUpload = path.join(folder, file);
|
|
114
|
+
// Allow manual filename fix
|
|
115
|
+
if (options.checkForManualFix) {
|
|
116
|
+
fileToUpload = await options.checkForManualFix(fileToUpload);
|
|
117
|
+
}
|
|
118
|
+
const fileExtension = path.extname(file).toLowerCase();
|
|
119
|
+
if ((fileExtension === ".xml" && options.overrideXml === false) ||
|
|
120
|
+
(fileExtension !== ".xml" && options.overrideOther === false)) {
|
|
121
|
+
console.log(`Skipping ${filePath} due to override settings.`);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
uploadFiles.push(bucket.upload(fileToUpload, {
|
|
125
|
+
destination: `${storageDestinationPath}/${file}`,
|
|
126
|
+
metadata: {
|
|
127
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
128
|
+
contentType: mime.getType(file),
|
|
129
|
+
},
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
export async function addAssessmentResources(backendUrl, db, specificImplementation) {
|
|
135
|
+
const fs = getFirestore();
|
|
136
|
+
const assessmentCollection = await fs
|
|
137
|
+
.collection(db.ASSESSMENT.COLLECTION())
|
|
138
|
+
.get();
|
|
139
|
+
const assessments = assessmentCollection.docs.map((d) => d.data());
|
|
140
|
+
const digitalAssessments = assessments.filter((a) => a.isDigital !== false);
|
|
141
|
+
const packageLocation = `packages`;
|
|
142
|
+
for (const assessment of digitalAssessments) {
|
|
143
|
+
await specificImplementation.convertPackageAndAddToDatabase(packageLocation, `${backendUrl}/${assessment.packageId}/`, backendUrl, {
|
|
144
|
+
examenId: assessment.id,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=general.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"general.js","sourceRoot":"","sources":["../../src/helpers/general.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGxE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,sBAA4C,EAC5C,EAAY,EACZ,cAAwB,EAAE;IAE1B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;IAEhC,MAAM,qBAAqB,GAAG,MAAM,SAAS;SAC1C,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;SACnC,GAAG,EAAE,CAAC;IACT,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAa,CAC3B,CAAC;IACF,wEAAwE;IACxE,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1D,SAAS;QACX,CAAC;QAED,0CAA0C;QAC1C,6CAA6C;QAC7C,YAAY;QACZ,gDAAgD;QAChD,MAAM,YAAY,GAAG,OAAO,CAAC,EAAE,CAAC;QAEhC,MAAM,cAAc,GAAG,MAAM,SAAS;aACnC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aAClC,GAAG,EAAE,CAAC;QACT,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM;YACvC,CAAC,CAAE,cAAc,CAAC,IAAI,EAA0B;YAChD,CAAC,CAAC,IAAI,CAAC;QACT,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CACX,qCAAqC,IAAI,eAAe,YAAY,EAAE,CACvE,CAAC;YACF,SAAS;QACX,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,WAAW,CAAC,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,MAAM,sBAAsB,CAAC,oBAAoB,CAC/C,IAAI,EACJ,YAAY,EACZ,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,SAAS,EACjB,WAAW,EACX,KAAK,CACN,CAAC;QACF,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAa,EACb,WAAmB,EACnB,QAAQ,GAAG,EAAE,EACb,OAAO,GAAG,KAAK,EACf,EAAY;IAEZ,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,uBAAuB;IACvB,IAAI,IAAI,GAAsB,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;YAC3B,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChC,KAAK;YACL,QAAQ,EAAE,QAAQ,IAAI,gBAAgB,EAAE;YACxC,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,eAAe,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,GAAG,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,YAAoB,EAAE,EAAE;IAC3D,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE;QAClD,aAAa,EAAE,IAAI;KACpB,CAAC,CAAC;IACH,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,GAAG,YAAY,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAQF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAc,EACd,sBAA8B,EAC9B,WAA+B,EAC/B,UAAyB,EAAE,CAAC,uBAAuB;;IAEnD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,wCAAwC;YACxC,MAAM,qBAAqB,CACzB,QAAQ,EACR,GAAG,sBAAsB,IAAI,IAAI,EAAE,EACnC,WAAW,EACX,OAAO,CACR,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;YACrC,IAAI,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAE3C,4BAA4B;YAC5B,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBAC9B,YAAY,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAEvD,IACE,CAAC,aAAa,KAAK,MAAM,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC;gBAC3D,CAAC,aAAa,KAAK,MAAM,IAAI,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC,EAC7D,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,4BAA4B,CAAC,CAAC;gBAC9D,SAAS;YACX,CAAC;YAED,WAAW,CAAC,IAAI,CACd,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;gBAC1B,WAAW,EAAE,GAAG,sBAAsB,IAAI,IAAI,EAAE;gBAChD,QAAQ,EAAE;oBACR,8DAA8D;oBAC9D,WAAW,EAAG,IAAY,CAAC,OAAO,CAAC,IAAI,CAAC;iBACzC;aACF,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,UAAkB,EAClB,EAAY,EACZ,sBAA4C;IAE5C,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1B,MAAM,oBAAoB,GAAG,MAAM,EAAE;SAClC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;SACtC,GAAG,EAAE,CAAC;IACT,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAgB,CAC9B,CAAC;IACF,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC;IAC5E,MAAM,eAAe,GAAG,UAAU,CAAC;IACnC,KAAK,MAAM,UAAU,IAAI,kBAAkB,EAAE,CAAC;QAC5C,MAAM,sBAAsB,CAAC,8BAA8B,CACzD,eAAe,EACf,GAAG,UAAU,IAAI,UAAU,CAAC,SAAS,GAAG,EACxC,UAAU,EACV;YACE,QAAQ,EAAE,UAAU,CAAC,EAAE;SACxB,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/helpers/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,MAAM,CAAC;AACrB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,MAAM,CAAC;AACrB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC"}
|
package/dist/helpers/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,MAAM,CAAC;AACrB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,MAAM,CAAC;AACrB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC"}
|
package/dist/helpers/logic.d.ts
CHANGED
|
@@ -1,38 +1,54 @@
|
|
|
1
1
|
import { DATABASE } from "./database";
|
|
2
|
-
import {
|
|
2
|
+
import { Assessment, SessionStateType, UniqueResponse, ItemStatisticsWithResponses, Session, Delivery, TestsetSession, TestsetStateType, Testset } from "@citolab/qti-api";
|
|
3
3
|
import * as cheerio from "cheerio";
|
|
4
|
+
import { Request } from "express";
|
|
4
5
|
export declare function uploadFolderToStorage(folder: string, storageDestinationPath: string, uploadFiles: Promise<unknown>[], subfolder?: string): Promise<void>;
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export declare const codeExists: (code: string, db: DATABASE) => Promise<StudentAppSessionInfo | null>;
|
|
18
|
-
export declare const hasAccess: (uid: string, appId: string) => Promise<boolean>;
|
|
19
|
-
export declare const createSession: (teacherId: string, db: DATABASE, count: number, assessments: {
|
|
20
|
-
packageId: string;
|
|
21
|
-
assessmentId: string;
|
|
22
|
-
name: string;
|
|
23
|
-
}[]) => Promise<StudentAppSessionInfo[]>;
|
|
24
|
-
export declare const createSessionByIdentifications: (teacherId: string, db: DATABASE, identifications: {
|
|
25
|
-
identifier: string;
|
|
6
|
+
export declare const getTestsetSessions: (testsetCode: string, db: DATABASE) => Promise<TestsetSession | null>;
|
|
7
|
+
export declare const getTestsetSessionWithSessions: (testsetCode: string, db: DATABASE, userId: string) => Promise<{
|
|
8
|
+
sessions: (FirebaseFirestore.DocumentData | undefined)[];
|
|
9
|
+
userId: string;
|
|
10
|
+
code: string;
|
|
11
|
+
testsetId: string;
|
|
12
|
+
testset?: Testset;
|
|
13
|
+
teacherId: string;
|
|
14
|
+
identification?: string;
|
|
15
|
+
state: TestsetStateType;
|
|
16
|
+
sessionIds: string[];
|
|
17
|
+
currentSessionIndex?: number;
|
|
26
18
|
password?: string;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
export declare const
|
|
35
|
-
export declare const
|
|
19
|
+
startedAt?: number;
|
|
20
|
+
completedAt?: number;
|
|
21
|
+
id: string;
|
|
22
|
+
createdAt: number;
|
|
23
|
+
updatedAt: number;
|
|
24
|
+
createdBy: string;
|
|
25
|
+
} | null>;
|
|
26
|
+
export declare const getSession: (code: string, db: DATABASE, userId?: string) => Promise<Session | null>;
|
|
27
|
+
export declare const getDelivery: (code: string, db: DATABASE) => Promise<Delivery | null>;
|
|
28
|
+
export declare const updateSessionState: (db: DATABASE, code: string, state: SessionStateType, batch: FirebaseFirestore.WriteBatch) => Promise<null | undefined>;
|
|
29
|
+
export declare const isStartable: (asessment: Assessment) => boolean;
|
|
30
|
+
export declare const checkDeliveryCode: (db: DATABASE, deliveryCode: string) => Promise<boolean>;
|
|
31
|
+
export declare const checkTestsetCode: (db: DATABASE, testsetCode: string) => Promise<boolean>;
|
|
32
|
+
export declare const checkSessionCode: (db: DATABASE, studentCode: string) => Promise<boolean>;
|
|
33
|
+
export declare const deleteDelivery: (db: DATABASE, deliveryId: string) => Promise<void>;
|
|
34
|
+
export declare const createDelivery: (db: DATABASE, userId: string, assessmentId: string) => Promise<string | null>;
|
|
35
|
+
export declare const createSessionForDelivery: (db: DATABASE, userId: string, delivery: Delivery) => Promise<Session | undefined>;
|
|
36
|
+
export declare const testsetSessionCodeExists: (code: string, db: DATABASE) => Promise<boolean>;
|
|
37
|
+
export declare const sessionCodeExists: (code: string, db: DATABASE) => Promise<boolean>;
|
|
38
|
+
export declare const deliveryCodeExists: (code: string, db: DATABASE) => Promise<boolean>;
|
|
39
|
+
export declare const createTestsetSessionByIdentifications: (teacherId: string, db: DATABASE, testsetCode: string, identifications: string[], testsessionState?: TestsetStateType, sessionState?: SessionStateType, createPassword?: boolean) => Promise<{
|
|
40
|
+
session: Session[];
|
|
41
|
+
testsetSessions: TestsetSession[];
|
|
42
|
+
} | undefined>;
|
|
43
|
+
export declare const createUniqueCodeForDelivery: (db: DATABASE) => Promise<string | null>;
|
|
44
|
+
export declare const createUniqueCodeForStudentSession: (db: DATABASE) => Promise<string | null>;
|
|
45
|
+
export declare const createUniqueCodeForStudentTestsetSession: (db: DATABASE) => Promise<string | null>;
|
|
46
|
+
export declare const hasAccess: (uid: string, appId: string) => Promise<boolean>;
|
|
47
|
+
export declare const createSessions: (teacherId: string, deliveryCode: string, db: DATABASE, count: number, deliveryIds: string[]) => Promise<Session[]>;
|
|
48
|
+
export declare const getAllStudents: (db: DATABASE) => Promise<Session[]>;
|
|
49
|
+
export declare const getAssessments: (db: DATABASE) => Promise<Assessment[]>;
|
|
50
|
+
export declare const getAssessment: (db: DATABASE, assessmentId: string) => Promise<Assessment>;
|
|
51
|
+
export declare const getTestset: (testsetId: string, db: DATABASE) => Promise<Testset>;
|
|
36
52
|
export declare const getAssessmentItemRefsFromPackage: ($assessmentTest: cheerio.CheerioAPI) => Promise<{
|
|
37
53
|
identifier: string | undefined;
|
|
38
54
|
sequenceNumber: number;
|
|
@@ -40,8 +56,8 @@ export declare const getAssessmentItemRefsFromPackage: ($assessmentTest: cheerio
|
|
|
40
56
|
}[]>;
|
|
41
57
|
export declare const getItemsStats: (db: DATABASE, teacherId: string, assessmentId: string, target: "teacher" | "reviewer") => Promise<ItemStatisticsWithResponses<UniqueResponse>[]>;
|
|
42
58
|
export declare const updateItemStatResponseScore: (db: DATABASE, teacherId: string, assessmentId: string, itemId: string, responseId: string, scoreExternal: number | null, target: "reviewer" | "teacher") => Promise<void>;
|
|
43
|
-
export declare const getPlannedStudents: (db: DATABASE, teacherId: string) => Promise<
|
|
44
|
-
export declare const getPlannedStudent: (db: DATABASE, teacherId: string, code: string) => Promise<
|
|
59
|
+
export declare const getPlannedStudents: (db: DATABASE, teacherId: string) => Promise<Session[]>;
|
|
60
|
+
export declare const getPlannedStudent: (db: DATABASE, teacherId: string, code: string) => Promise<Session>;
|
|
45
61
|
export declare const deleteStudent: (db: DATABASE, teacherId: string, code: string) => Promise<void>;
|
|
46
62
|
export declare const getUser: (uid: string) => Promise<{
|
|
47
63
|
admin?: boolean;
|
|
@@ -49,19 +65,26 @@ export declare const getUser: (uid: string) => Promise<{
|
|
|
49
65
|
export declare const setUser: (uid: string, user: {
|
|
50
66
|
admin?: boolean;
|
|
51
67
|
}) => Promise<void>;
|
|
52
|
-
export declare const
|
|
53
|
-
export declare const
|
|
54
|
-
export declare const
|
|
55
|
-
export declare const
|
|
56
|
-
export declare const
|
|
68
|
+
export declare const reopenSession: (db: DATABASE, teacherId: string, code: string) => Promise<void>;
|
|
69
|
+
export declare const resetSession: (db: DATABASE, teacherId: string, code: string) => Promise<void>;
|
|
70
|
+
export declare const getStudentInfoForTeacher: (db: DATABASE, teacherId: string, code: string) => Promise<Session>;
|
|
71
|
+
export declare const updateStudentIdentification: (db: DATABASE, teacherId: string, code: string, identification: string) => Promise<void>;
|
|
72
|
+
export declare const createUser: (email: string) => Promise<{
|
|
57
73
|
password: string;
|
|
58
74
|
id: string;
|
|
59
75
|
} | {
|
|
60
76
|
id: string;
|
|
61
77
|
password?: undefined;
|
|
62
78
|
}>;
|
|
63
|
-
export declare const
|
|
64
|
-
export declare const
|
|
79
|
+
export declare const deleteUser: (id: string) => Promise<void>;
|
|
80
|
+
export declare const getAllUsers: () => Promise<{
|
|
81
|
+
name: string;
|
|
82
|
+
users: {
|
|
83
|
+
id: string;
|
|
84
|
+
email: string;
|
|
85
|
+
disabled: boolean;
|
|
86
|
+
}[];
|
|
87
|
+
}[]>;
|
|
65
88
|
export declare function deleteDocumentAndSubcollections(docRef: FirebaseFirestore.DocumentReference): Promise<void>;
|
|
66
89
|
export declare function checkAndDeletePackages(dateTime: number): Promise<void>;
|
|
67
90
|
export declare function fetchUsersInChunks(ids: string[], chunkSize?: number): Promise<{
|
|
@@ -69,5 +92,41 @@ export declare function fetchUsersInChunks(ids: string[], chunkSize?: number): P
|
|
|
69
92
|
email: string;
|
|
70
93
|
disabled: boolean;
|
|
71
94
|
}[]>;
|
|
72
|
-
|
|
95
|
+
/**
|
|
96
|
+
* Interface for feedback submission data
|
|
97
|
+
*/
|
|
98
|
+
export interface FeedbackSubmissionData {
|
|
99
|
+
type: string;
|
|
100
|
+
description: string;
|
|
101
|
+
feedbackId: string;
|
|
102
|
+
email?: string;
|
|
103
|
+
pageUrl?: string;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Processes feedback submission with optional screenshot
|
|
107
|
+
* @param req - Express request object
|
|
108
|
+
* @param userId - User ID who is submitting feedback
|
|
109
|
+
* @param userType - Type of user ('teacher' or 'student')
|
|
110
|
+
* @returns Promise<{data: FeedbackSubmissionData, fileBuffer: Buffer | null, fileOriginalname: string | null}>
|
|
111
|
+
*/
|
|
112
|
+
export declare function processFeedbackSubmission(req: Request): Promise<{
|
|
113
|
+
data: FeedbackSubmissionData;
|
|
114
|
+
fileBuffer: Buffer | null;
|
|
115
|
+
fileOriginalname: string | null;
|
|
116
|
+
}>;
|
|
117
|
+
/**
|
|
118
|
+
* Validates feedback submission data
|
|
119
|
+
* @param data - Feedback data to validate
|
|
120
|
+
* @returns Validation error message or null if valid
|
|
121
|
+
*/
|
|
122
|
+
export declare function validateFeedbackData(data: FeedbackSubmissionData): string | null;
|
|
123
|
+
/**
|
|
124
|
+
* Saves feedback to Firestore and optionally uploads screenshot to Storage
|
|
125
|
+
* @param data - Feedback submission data
|
|
126
|
+
* @param userId - User ID who submitted the feedback
|
|
127
|
+
* @param userType - Type of user ('teacher' or 'student')
|
|
128
|
+
* @param fileBuffer - Screenshot file buffer (optional)
|
|
129
|
+
* @returns Promise<void>
|
|
130
|
+
*/
|
|
131
|
+
export declare function saveFeedback(data: FeedbackSubmissionData, userId: string, userType: 'teacher' | 'student', fileBuffer?: Buffer | null): Promise<void>;
|
|
73
132
|
//# sourceMappingURL=logic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../../src/helpers/logic.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../../src/helpers/logic.ts"],"names":[],"mappings":"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"}
|