@vue-skuilder/cli 0.1.7 → 0.1.8-0
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/README.md +122 -8
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +34 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pack.d.ts +10 -0
- package/dist/commands/pack.d.ts.map +1 -1
- package/dist/commands/pack.js +1 -1
- package/dist/commands/pack.js.map +1 -1
- package/dist/commands/studio.d.ts.map +1 -1
- package/dist/commands/studio.js +640 -105
- package/dist/commands/studio.js.map +1 -1
- package/dist/commands/unpack.d.ts +12 -0
- package/dist/commands/unpack.d.ts.map +1 -1
- package/dist/commands/unpack.js +1 -1
- package/dist/commands/unpack.js.map +1 -1
- package/dist/express-assets/app.d.ts +6 -0
- package/dist/express-assets/app.d.ts.map +1 -0
- package/dist/express-assets/app.js +209 -0
- package/dist/express-assets/app.js.map +1 -0
- package/dist/express-assets/assets/classroomDesignDoc.js +24 -0
- package/dist/express-assets/assets/courseValidateDocUpdate.js +56 -0
- package/dist/express-assets/assets/get-tagsDesignDoc.json +9 -0
- package/dist/express-assets/attachment-preprocessing/index.d.ts +11 -0
- package/dist/express-assets/attachment-preprocessing/index.d.ts.map +1 -0
- package/dist/express-assets/attachment-preprocessing/index.js +204 -0
- package/dist/express-assets/attachment-preprocessing/index.js.map +1 -0
- package/dist/express-assets/attachment-preprocessing/normalize.d.ts +7 -0
- package/dist/express-assets/attachment-preprocessing/normalize.d.ts.map +1 -0
- package/dist/express-assets/attachment-preprocessing/normalize.js +90 -0
- package/dist/express-assets/attachment-preprocessing/normalize.js.map +1 -0
- package/dist/express-assets/client-requests/classroom-requests.d.ts +26 -0
- package/dist/express-assets/client-requests/classroom-requests.d.ts.map +1 -0
- package/dist/express-assets/client-requests/classroom-requests.js +171 -0
- package/dist/express-assets/client-requests/classroom-requests.js.map +1 -0
- package/dist/express-assets/client-requests/course-requests.d.ts +10 -0
- package/dist/express-assets/client-requests/course-requests.d.ts.map +1 -0
- package/dist/express-assets/client-requests/course-requests.js +135 -0
- package/dist/express-assets/client-requests/course-requests.js.map +1 -0
- package/dist/express-assets/client-requests/pack-requests.d.ts +19 -0
- package/dist/express-assets/client-requests/pack-requests.d.ts.map +1 -0
- package/dist/express-assets/client-requests/pack-requests.js +130 -0
- package/dist/express-assets/client-requests/pack-requests.js.map +1 -0
- package/dist/express-assets/client.d.ts +31 -0
- package/dist/express-assets/client.d.ts.map +1 -0
- package/dist/express-assets/client.js +70 -0
- package/dist/express-assets/client.js.map +1 -0
- package/dist/express-assets/couchdb/authentication.d.ts +4 -0
- package/dist/express-assets/couchdb/authentication.d.ts.map +1 -0
- package/dist/express-assets/couchdb/authentication.js +69 -0
- package/dist/express-assets/couchdb/authentication.js.map +1 -0
- package/dist/express-assets/couchdb/index.d.ts +18 -0
- package/dist/express-assets/couchdb/index.d.ts.map +1 -0
- package/dist/express-assets/couchdb/index.js +52 -0
- package/dist/express-assets/couchdb/index.js.map +1 -0
- package/dist/express-assets/design-docs.d.ts +63 -0
- package/dist/express-assets/design-docs.d.ts.map +1 -0
- package/dist/express-assets/design-docs.js +90 -0
- package/dist/express-assets/design-docs.js.map +1 -0
- package/dist/express-assets/logger.d.ts +3 -0
- package/dist/express-assets/logger.d.ts.map +1 -0
- package/dist/express-assets/logger.js +62 -0
- package/dist/express-assets/logger.js.map +1 -0
- package/dist/express-assets/routes/logs.d.ts +3 -0
- package/dist/express-assets/routes/logs.d.ts.map +1 -0
- package/dist/express-assets/routes/logs.js +274 -0
- package/dist/express-assets/routes/logs.js.map +1 -0
- package/dist/express-assets/utils/env.d.ts +11 -0
- package/dist/express-assets/utils/env.d.ts.map +1 -0
- package/dist/express-assets/utils/env.js +39 -0
- package/dist/express-assets/utils/env.js.map +1 -0
- package/dist/express-assets/utils/processQueue.d.ts +39 -0
- package/dist/express-assets/utils/processQueue.d.ts.map +1 -0
- package/dist/express-assets/utils/processQueue.js +175 -0
- package/dist/express-assets/utils/processQueue.js.map +1 -0
- package/dist/studio-ui-src/App.vue +132 -0
- package/dist/studio-ui-src/api/index.ts +30 -0
- package/dist/studio-ui-src/components/StudioFlush.vue +108 -0
- package/dist/studio-ui-src/config/development.ts +98 -0
- package/dist/studio-ui-src/index.html +13 -0
- package/dist/studio-ui-src/main.ts +148 -0
- package/dist/studio-ui-src/package.json +35 -0
- package/dist/studio-ui-src/router/index.ts +32 -0
- package/dist/studio-ui-src/stores/useAuthStore.ts +3 -0
- package/dist/studio-ui-src/tsconfig.json +28 -0
- package/dist/studio-ui-src/views/BrowseView.vue +82 -0
- package/dist/studio-ui-src/views/BulkImportView.vue +89 -0
- package/dist/studio-ui-src/views/CourseEditorView.vue +62 -0
- package/dist/studio-ui-src/views/CreateCardView.vue +140 -0
- package/dist/studio-ui-src/vite.config.base.js +100 -0
- package/dist/studio-ui-src/vite.config.ts +26 -0
- package/dist/templates/.skuilder/README.md +29 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/ExpressManager.d.ts +28 -0
- package/dist/utils/ExpressManager.d.ts.map +1 -0
- package/dist/utils/ExpressManager.js +166 -0
- package/dist/utils/ExpressManager.js.map +1 -0
- package/dist/utils/NodeFileSystemAdapter.d.ts +6 -0
- package/dist/utils/NodeFileSystemAdapter.d.ts.map +1 -1
- package/dist/utils/NodeFileSystemAdapter.js +29 -1
- package/dist/utils/NodeFileSystemAdapter.js.map +1 -1
- package/dist/utils/error-reporting.d.ts +54 -0
- package/dist/utils/error-reporting.d.ts.map +1 -0
- package/dist/utils/error-reporting.js +143 -0
- package/dist/utils/error-reporting.js.map +1 -0
- package/dist/utils/pack-courses.d.ts.map +1 -1
- package/dist/utils/pack-courses.js +10 -27
- package/dist/utils/pack-courses.js.map +1 -1
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +24 -0
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/questions-hash.d.ts +22 -0
- package/dist/utils/questions-hash.d.ts.map +1 -0
- package/dist/utils/questions-hash.js +96 -0
- package/dist/utils/questions-hash.js.map +1 -0
- package/dist/utils/template.d.ts +1 -1
- package/dist/utils/template.d.ts.map +1 -1
- package/dist/utils/template.js +202 -25
- package/dist/utils/template.js.map +1 -1
- package/eslint.config.mjs +1 -1
- package/package.json +30 -11
- package/src/cli.ts +3 -1
- package/src/commands/init.ts +48 -3
- package/src/commands/pack.ts +1 -1
- package/src/commands/studio.ts +850 -121
- package/src/commands/unpack.ts +1 -1
- package/src/types.ts +5 -0
- package/src/utils/ExpressManager.ts +210 -0
- package/src/utils/NodeFileSystemAdapter.ts +46 -2
- package/src/utils/error-reporting.ts +192 -0
- package/src/utils/pack-courses.ts +11 -36
- package/src/utils/prompts.ts +34 -0
- package/src/utils/questions-hash.ts +109 -0
- package/src/utils/template.ts +231 -27
- package/templates/.skuilder/README.md +29 -0
- package/dist/studio-ui-assets/assets/BrowseView-BJbixGOU.js +0 -2
- package/dist/studio-ui-assets/assets/BrowseView-BJbixGOU.js.map +0 -1
- package/dist/studio-ui-assets/assets/BrowseView-CM4HBO4j.css +0 -1
- package/dist/studio-ui-assets/assets/BulkImportView-DB6DYDJU.js +0 -2
- package/dist/studio-ui-assets/assets/BulkImportView-DB6DYDJU.js.map +0 -1
- package/dist/studio-ui-assets/assets/BulkImportView-g4wQUfPA.css +0 -1
- package/dist/studio-ui-assets/assets/CourseEditorView-BIlhlhw1.js +0 -2
- package/dist/studio-ui-assets/assets/CourseEditorView-BIlhlhw1.js.map +0 -1
- package/dist/studio-ui-assets/assets/CourseEditorView-WuPNLVKp.css +0 -1
- package/dist/studio-ui-assets/assets/CreateCardView-CyNOKCkm.css +0 -1
- package/dist/studio-ui-assets/assets/CreateCardView-DPjPvzzt.js +0 -2
- package/dist/studio-ui-assets/assets/CreateCardView-DPjPvzzt.js.map +0 -1
- package/dist/studio-ui-assets/assets/edit-ui.es-DiUxqbgF.js +0 -330
- package/dist/studio-ui-assets/assets/edit-ui.es-DiUxqbgF.js.map +0 -1
- package/dist/studio-ui-assets/assets/index--zY88pg6.css +0 -14
- package/dist/studio-ui-assets/assets/index-BnAv1C72.js +0 -287
- package/dist/studio-ui-assets/assets/index-BnAv1C72.js.map +0 -1
- package/dist/studio-ui-assets/assets/index-DHMXQY3-.js +0 -192
- package/dist/studio-ui-assets/assets/index-DHMXQY3-.js.map +0 -1
- package/dist/studio-ui-assets/assets/materialdesignicons-webfont-B7mPwVP_.ttf +0 -0
- package/dist/studio-ui-assets/assets/materialdesignicons-webfont-CSr8KVlo.eot +0 -0
- package/dist/studio-ui-assets/assets/materialdesignicons-webfont-Dp5v-WZN.woff2 +0 -0
- package/dist/studio-ui-assets/assets/materialdesignicons-webfont-PXm3-2wK.woff +0 -0
- package/dist/studio-ui-assets/assets/vue-DZcMATiC.js +0 -28
- package/dist/studio-ui-assets/assets/vue-DZcMATiC.js.map +0 -1
- package/dist/studio-ui-assets/assets/vuetify-qg7mRxy_.js +0 -6
- package/dist/studio-ui-assets/assets/vuetify-qg7mRxy_.js.map +0 -1
- package/dist/studio-ui-assets/index.html +0 -16
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { log } from 'util';
|
|
2
|
+
import CouchDB from '../couchdb/index.js';
|
|
3
|
+
import { postProcessCourse } from '../attachment-preprocessing/index.js';
|
|
4
|
+
import AsyncProcessQueue from '../utils/processQueue.js';
|
|
5
|
+
import logger from '../logger.js';
|
|
6
|
+
import { CourseLookup } from '@vue-skuilder/db';
|
|
7
|
+
import { courseDBDesignDocs } from '../design-docs.js';
|
|
8
|
+
function getCourseDBName(courseID) {
|
|
9
|
+
return `coursedb-${courseID}`;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Inserts a design document into a course database.
|
|
13
|
+
* @param courseID - The ID of the course database.
|
|
14
|
+
* @param doc
|
|
15
|
+
*/
|
|
16
|
+
function insertDesignDoc(courseID, doc) {
|
|
17
|
+
const courseDB = CouchDB.use(courseID);
|
|
18
|
+
courseDB
|
|
19
|
+
.get(doc._id)
|
|
20
|
+
.then((priorDoc) => {
|
|
21
|
+
void courseDB.insert({
|
|
22
|
+
...doc,
|
|
23
|
+
_rev: priorDoc._rev,
|
|
24
|
+
});
|
|
25
|
+
})
|
|
26
|
+
.catch(() => {
|
|
27
|
+
void courseDB
|
|
28
|
+
.insert(doc)
|
|
29
|
+
.catch((e) => {
|
|
30
|
+
log(`Error inserting design doc ${doc._id} in course-${courseID}: ${e}`);
|
|
31
|
+
})
|
|
32
|
+
.then((resp) => {
|
|
33
|
+
if (resp && resp.ok) {
|
|
34
|
+
log(`CourseDB design doc inserted into course-${courseID}`);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export async function initCourseDBDesignDocInsert() {
|
|
40
|
+
const courses = await CourseLookup.allCourses();
|
|
41
|
+
courses.forEach((c) => {
|
|
42
|
+
// Insert design docs
|
|
43
|
+
courseDBDesignDocs.forEach((dd) => {
|
|
44
|
+
insertDesignDoc(getCourseDBName(c._id), dd);
|
|
45
|
+
});
|
|
46
|
+
// Update security object for public courses
|
|
47
|
+
const courseDB = CouchDB.use(getCourseDBName(c._id));
|
|
48
|
+
courseDB
|
|
49
|
+
.get('CourseConfig')
|
|
50
|
+
.then((configDoc) => {
|
|
51
|
+
if (configDoc.public === true) {
|
|
52
|
+
const secObj = {
|
|
53
|
+
admins: {
|
|
54
|
+
names: [],
|
|
55
|
+
roles: [],
|
|
56
|
+
},
|
|
57
|
+
members: {
|
|
58
|
+
names: [], // Empty array for public courses to allow all users access
|
|
59
|
+
roles: [],
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
courseDB
|
|
63
|
+
// @ts-expect-error allow insertion of _security document.
|
|
64
|
+
// db scoped as ConfigDoc to make the read easier.
|
|
65
|
+
.insert(secObj, '_security')
|
|
66
|
+
.then(() => {
|
|
67
|
+
logger.info(`Updated security settings for public course ${c._id}`);
|
|
68
|
+
})
|
|
69
|
+
.catch((e) => {
|
|
70
|
+
logger.error(`Error updating security for public course ${c._id}: ${e}`);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
.catch((e) => {
|
|
75
|
+
logger.error(`Error getting CourseConfig for ${c._id}: ${e}`);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async function createCourse(cfg) {
|
|
80
|
+
cfg.courseID = await CourseLookup.add(cfg.name);
|
|
81
|
+
if (!cfg.courseID) {
|
|
82
|
+
throw new Error('Course ID not found');
|
|
83
|
+
}
|
|
84
|
+
const courseDBName = getCourseDBName(cfg.courseID);
|
|
85
|
+
const dbCreation = await CouchDB.db.create(courseDBName);
|
|
86
|
+
if (dbCreation.ok) {
|
|
87
|
+
const courseDB = CouchDB.use(courseDBName);
|
|
88
|
+
courseDB
|
|
89
|
+
.insert({
|
|
90
|
+
_id: 'CourseConfig',
|
|
91
|
+
...cfg,
|
|
92
|
+
})
|
|
93
|
+
.catch((e) => {
|
|
94
|
+
logger.error(`Error inserting CourseConfig for course ${cfg.courseID}:`, e);
|
|
95
|
+
});
|
|
96
|
+
// insert the tags, elo, etc view docs
|
|
97
|
+
courseDBDesignDocs.forEach((doc) => {
|
|
98
|
+
courseDB.insert(doc).catch((e) => {
|
|
99
|
+
logger.error(`Error inserting design doc for course ${cfg.courseID}:`, e);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
// Configure security for both public and private courses
|
|
103
|
+
const secObj = {
|
|
104
|
+
admins: {
|
|
105
|
+
names: [],
|
|
106
|
+
roles: [],
|
|
107
|
+
},
|
|
108
|
+
members: {
|
|
109
|
+
names: cfg.public ? [] : [cfg.creator], // Empty array for public courses to allow all users access
|
|
110
|
+
roles: [],
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
courseDB
|
|
114
|
+
.insert(secObj, '_security')
|
|
115
|
+
.then(() => {
|
|
116
|
+
logger.info(`Successfully set security for ${cfg.public ? 'public' : 'private'} course ${cfg.courseID}`);
|
|
117
|
+
})
|
|
118
|
+
.catch((e) => {
|
|
119
|
+
logger.error(`Error inserting security object for course ${cfg.courseID}:`, e);
|
|
120
|
+
});
|
|
121
|
+
// Design documents including validation are inserted via courseDBDesignDocs
|
|
122
|
+
logger.info(`Validation design document will be inserted for course ${cfg.courseID}`);
|
|
123
|
+
}
|
|
124
|
+
// follow the course so that user-uploaded content goes through
|
|
125
|
+
// post-processing
|
|
126
|
+
postProcessCourse(cfg.courseID);
|
|
127
|
+
return {
|
|
128
|
+
ok: dbCreation.ok ?? false,
|
|
129
|
+
status: 'ok',
|
|
130
|
+
// @ts-expect-error courseID required for runtime but not in Result interface - see sideQuest.md
|
|
131
|
+
courseID: cfg.courseID,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export const CourseCreationQueue = new AsyncProcessQueue(createCourse);
|
|
135
|
+
//# sourceMappingURL=course-requests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"course-requests.js","sourceRoot":"","sources":["../../src/client-requests/course-requests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Status } from '@vue-skuilder/common';
|
|
2
|
+
interface PackCourseData {
|
|
3
|
+
courseId: string;
|
|
4
|
+
outputPath?: string;
|
|
5
|
+
}
|
|
6
|
+
interface PackCourseResponse {
|
|
7
|
+
status: Status;
|
|
8
|
+
ok: boolean;
|
|
9
|
+
packedFiles?: never;
|
|
10
|
+
outputPath?: string;
|
|
11
|
+
attachmentsFound?: number;
|
|
12
|
+
filesWritten?: number;
|
|
13
|
+
totalFiles?: number;
|
|
14
|
+
duration?: number;
|
|
15
|
+
errorText?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function packCourse(data: PackCourseData): Promise<PackCourseResponse>;
|
|
18
|
+
export type { PackCourseData, PackCourseResponse };
|
|
19
|
+
//# sourceMappingURL=pack-requests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-requests.d.ts","sourceRoot":"","sources":["../../src/client-requests/pack-requests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAK9C,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4IlF;AAGD,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Status } from '@vue-skuilder/common';
|
|
2
|
+
import logger from '../logger.js';
|
|
3
|
+
import ENV from '../utils/env.js';
|
|
4
|
+
import PouchDb from 'pouchdb';
|
|
5
|
+
export async function packCourse(data) {
|
|
6
|
+
logger.info(`Starting PACK_COURSE for ${data.courseId}...`);
|
|
7
|
+
try {
|
|
8
|
+
const startTime = Date.now();
|
|
9
|
+
// Use CouchDBToStaticPacker directly from db package
|
|
10
|
+
const { CouchDBToStaticPacker } = await import('@vue-skuilder/db');
|
|
11
|
+
// Create database connection URL
|
|
12
|
+
const dbUrl = `${ENV.COUCHDB_PROTOCOL}://${ENV.COUCHDB_ADMIN}:${ENV.COUCHDB_PASSWORD}@${ENV.COUCHDB_SERVER}`;
|
|
13
|
+
const dbName = `coursedb-${data.courseId}`;
|
|
14
|
+
// Determine output path based on environment and provided path
|
|
15
|
+
let outputPath;
|
|
16
|
+
if (data.outputPath) {
|
|
17
|
+
// If output path is provided, check if it's absolute or relative
|
|
18
|
+
const pathModule = await import('path');
|
|
19
|
+
const path = pathModule.default || pathModule;
|
|
20
|
+
if (path.isAbsolute(data.outputPath)) {
|
|
21
|
+
// Use absolute path as-is
|
|
22
|
+
outputPath = data.outputPath;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
// Relative path - combine with project path in studio mode
|
|
26
|
+
const projectPath = process.env.PROJECT_PATH || process.cwd();
|
|
27
|
+
outputPath = path.join(projectPath, data.outputPath);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// No output path provided - use default
|
|
32
|
+
outputPath = ENV.NODE_ENV === 'studio' ?
|
|
33
|
+
'/tmp/skuilder-studio-output' :
|
|
34
|
+
process.cwd();
|
|
35
|
+
}
|
|
36
|
+
logger.info(`Packing course ${data.courseId} from ${dbName} to ${outputPath}`);
|
|
37
|
+
// Clean up existing output directory for replace-in-place functionality
|
|
38
|
+
const fsExtra = await import('fs-extra');
|
|
39
|
+
const fs = fsExtra.default || fsExtra;
|
|
40
|
+
try {
|
|
41
|
+
if (await fs.pathExists(outputPath)) {
|
|
42
|
+
logger.info(`Removing existing directory: ${outputPath}`);
|
|
43
|
+
await fs.remove(outputPath);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (cleanupError) {
|
|
47
|
+
logger.warn(`Warning: Could not clean up existing directory ${outputPath}:`, cleanupError);
|
|
48
|
+
// Continue anyway - the write operation might still succeed
|
|
49
|
+
}
|
|
50
|
+
// Create course database connection
|
|
51
|
+
const courseDbUrl = `${dbUrl}/${dbName}`;
|
|
52
|
+
// Initialize packer and perform pack operation with file writing
|
|
53
|
+
const packer = new CouchDBToStaticPacker();
|
|
54
|
+
// For Express, we create a simple FileSystemAdapter using dynamic imports
|
|
55
|
+
const createFsAdapter = async () => {
|
|
56
|
+
const fsExtra = await import('fs-extra');
|
|
57
|
+
const pathModule = await import('path');
|
|
58
|
+
// Access the default export for fs-extra
|
|
59
|
+
const fs = fsExtra.default || fsExtra;
|
|
60
|
+
const path = pathModule.default || pathModule;
|
|
61
|
+
return {
|
|
62
|
+
async readFile(filePath) {
|
|
63
|
+
return await fs.readFile(filePath, 'utf8');
|
|
64
|
+
},
|
|
65
|
+
async readBinary(filePath) {
|
|
66
|
+
return await fs.readFile(filePath);
|
|
67
|
+
},
|
|
68
|
+
async exists(filePath) {
|
|
69
|
+
try {
|
|
70
|
+
await fs.access(filePath);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
async stat(filePath) {
|
|
78
|
+
const stats = await fs.stat(filePath);
|
|
79
|
+
return {
|
|
80
|
+
isDirectory: () => stats.isDirectory(),
|
|
81
|
+
isFile: () => stats.isFile(),
|
|
82
|
+
size: stats.size
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
async writeFile(filePath, data) {
|
|
86
|
+
await fs.writeFile(filePath, data);
|
|
87
|
+
},
|
|
88
|
+
async writeJson(filePath, data, options) {
|
|
89
|
+
await fs.writeJson(filePath, data, options);
|
|
90
|
+
},
|
|
91
|
+
async ensureDir(dirPath) {
|
|
92
|
+
await fs.ensureDir(dirPath);
|
|
93
|
+
},
|
|
94
|
+
joinPath(...segments) {
|
|
95
|
+
return path.join(...segments);
|
|
96
|
+
},
|
|
97
|
+
dirname(filePath) {
|
|
98
|
+
return path.dirname(filePath);
|
|
99
|
+
},
|
|
100
|
+
isAbsolute(filePath) {
|
|
101
|
+
return path.isAbsolute(filePath);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
const fsAdapter = await createFsAdapter();
|
|
106
|
+
const packResult = await packer.packCourseToFiles(new PouchDb(courseDbUrl), data.courseId, outputPath, fsAdapter);
|
|
107
|
+
const duration = Date.now() - startTime;
|
|
108
|
+
const response = {
|
|
109
|
+
status: Status.ok,
|
|
110
|
+
ok: true,
|
|
111
|
+
outputPath: outputPath,
|
|
112
|
+
attachmentsFound: packResult.attachmentsFound,
|
|
113
|
+
filesWritten: packResult.filesWritten,
|
|
114
|
+
totalFiles: packResult.filesWritten, // Updated to reflect actual files written
|
|
115
|
+
duration: duration
|
|
116
|
+
};
|
|
117
|
+
logger.info(`Pack completed in ${duration}ms. Attachments: ${response.attachmentsFound}, Files written: ${response.filesWritten}`);
|
|
118
|
+
return response;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
logger.error('Pack operation failed:', error);
|
|
122
|
+
const response = {
|
|
123
|
+
status: Status.error,
|
|
124
|
+
ok: false,
|
|
125
|
+
errorText: error instanceof Error ? error.message : 'Pack operation failed'
|
|
126
|
+
};
|
|
127
|
+
return response;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=pack-requests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-requests.js","sourceRoot":"","sources":["../../src/client-requests/pack-requests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { AxiosBasicCredentials, AxiosResponse } from 'axios';
|
|
2
|
+
import { AddCourseDataPayload, CourseConfig } from '@vue-skuilder/common';
|
|
3
|
+
import { CreateCourseResp } from './client-requests/course-requests.js';
|
|
4
|
+
export default class SkldrClient {
|
|
5
|
+
server: string;
|
|
6
|
+
constructor(server: string);
|
|
7
|
+
/**
|
|
8
|
+
* Create a new course.
|
|
9
|
+
*/
|
|
10
|
+
createCourse(cfg: CourseConfig, auth?: AxiosBasicCredentials): Promise<AxiosResponse<CreateCourseResp>>;
|
|
11
|
+
/**
|
|
12
|
+
* Creates a client to interact with the specified course.
|
|
13
|
+
*/
|
|
14
|
+
getCourseClient(id: string): SkldrCourseClient;
|
|
15
|
+
/**
|
|
16
|
+
* @returns a list of all courses on the server in `id - name` format.
|
|
17
|
+
*/
|
|
18
|
+
getCourses(): Promise<string[]>;
|
|
19
|
+
getVersion(): Promise<string>;
|
|
20
|
+
getRoles(): Promise<string[]>;
|
|
21
|
+
}
|
|
22
|
+
declare class SkldrCourseClient {
|
|
23
|
+
id: string;
|
|
24
|
+
server: string;
|
|
25
|
+
constructor(server: string, id: string);
|
|
26
|
+
addData(data: AddCourseDataPayload): Promise<Express.Response>;
|
|
27
|
+
deleteCourse(auth?: AxiosBasicCredentials): Promise<Express.Response>;
|
|
28
|
+
getConfig(): Promise<CourseConfig>;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,EACL,oBAAoB,EACpB,YAAY,EAGb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,WAAW;IAC9B,MAAM,EAAE,MAAM,CAAC;gBAEH,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACG,YAAY,CAChB,GAAG,EAAE,YAAY,EACjB,IAAI,CAAC,EAAE,qBAAqB,GAC3B,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAmB3C;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB;IAI9C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI/B,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAI7B,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAIpC;AAED,cAAM,iBAAiB;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;gBAEH,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAKtC,OAAO,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;IAOxD,YAAY,CAAC,IAAI,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;IASrE,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;CAMzC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { ServerRequestType, } from '@vue-skuilder/common';
|
|
3
|
+
export default class SkldrClient {
|
|
4
|
+
server;
|
|
5
|
+
constructor(server) {
|
|
6
|
+
this.server = server;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Create a new course.
|
|
10
|
+
*/
|
|
11
|
+
async createCourse(cfg, auth) {
|
|
12
|
+
const request = {
|
|
13
|
+
type: ServerRequestType.CREATE_COURSE,
|
|
14
|
+
data: cfg,
|
|
15
|
+
user: 'apiClient',
|
|
16
|
+
response: null,
|
|
17
|
+
};
|
|
18
|
+
const resp = await axios.post(`${this.server}`, request, {
|
|
19
|
+
auth: auth,
|
|
20
|
+
});
|
|
21
|
+
return resp;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Creates a client to interact with the specified course.
|
|
25
|
+
*/
|
|
26
|
+
getCourseClient(id) {
|
|
27
|
+
return new SkldrCourseClient(this.server, id);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* @returns a list of all courses on the server in `id - name` format.
|
|
31
|
+
*/
|
|
32
|
+
async getCourses() {
|
|
33
|
+
const resp = await axios.get(`${this.server}/courses`);
|
|
34
|
+
return resp.data;
|
|
35
|
+
}
|
|
36
|
+
async getVersion() {
|
|
37
|
+
const resp = await axios.get(`${this.server}/version`);
|
|
38
|
+
return resp.data;
|
|
39
|
+
}
|
|
40
|
+
async getRoles() {
|
|
41
|
+
const resp = await axios.get(`${this.server}/roles`);
|
|
42
|
+
return resp.data;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
class SkldrCourseClient {
|
|
46
|
+
id;
|
|
47
|
+
server;
|
|
48
|
+
constructor(server, id) {
|
|
49
|
+
this.server = server;
|
|
50
|
+
this.id = id;
|
|
51
|
+
}
|
|
52
|
+
addData(data) {
|
|
53
|
+
return axios.post(`${this.server}/${this.id}`, {
|
|
54
|
+
method: 'POST',
|
|
55
|
+
body: data,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
async deleteCourse(auth) {
|
|
59
|
+
// [ ] Consider auth / permanence of "destructive" actions
|
|
60
|
+
return axios.delete(`${this.server}/course/${this.id}`, {
|
|
61
|
+
auth,
|
|
62
|
+
});
|
|
63
|
+
// [ ] remove also from the `coursedb-lookup` database (?)
|
|
64
|
+
}
|
|
65
|
+
async getConfig() {
|
|
66
|
+
const resp = await axios.get(`${this.server}/course/${this.id}/config`);
|
|
67
|
+
return resp.data;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AACpE,OAAO,EAIL,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,CAAC,OAAO,OAAO,WAAW;IAC9B,MAAM,CAAS;IAEf,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,GAAiB,EACjB,IAA4B;QAE5B,MAAM,OAAO,GAAiB;YAC5B,IAAI,EAAE,iBAAiB,CAAC,aAAa;YACrC,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,IAAI;SACf,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAC3B,GAAG,IAAI,CAAC,MAAM,EAAE,EAChB,OAAO,EACP;YACE,IAAI,EAAE,IAAI;SACX,CACF,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,EAAU;QACxB,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,iBAAiB;IACrB,EAAE,CAAS;IACX,MAAM,CAAS;IAEf,YAAY,MAAc,EAAE,EAAU;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED,OAAO,CAAC,IAA0B;QAChC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE;YAC7C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAA4B;QAC7C,0DAA0D;QAC1D,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,WAAW,IAAI,CAAC,EAAE,EAAE,EAAE;YACtD,IAAI;SACL,CAAC,CAAC;QAEH,0DAA0D;IAC5D,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAC1B,GAAG,IAAI,CAAC,MAAM,WAAW,IAAI,CAAC,EAAE,SAAS,CAC1C,CAAC;QACF,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { VueClientRequest } from '../app.js';
|
|
2
|
+
export declare function requestIsAdminAuthenticated(req: VueClientRequest): Promise<boolean>;
|
|
3
|
+
export declare function requestIsAuthenticated(req: VueClientRequest): Promise<boolean>;
|
|
4
|
+
//# sourceMappingURL=authentication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication.d.ts","sourceRoot":"","sources":["../../src/couchdb/authentication.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAgB7C,wBAAsB,2BAA2B,CAAC,GAAG,EAAE,gBAAgB,oBAwBtE;AAMD,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,oBA0CjE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import Nano from 'nano';
|
|
2
|
+
import { COUCH_URL_WITH_PROTOCOL } from './index.js';
|
|
3
|
+
import logger from '../logger.js';
|
|
4
|
+
export async function requestIsAdminAuthenticated(req) {
|
|
5
|
+
logRequest(req);
|
|
6
|
+
const username = req.body.user;
|
|
7
|
+
const authCookie = req.cookies.AuthSession ? req.cookies.AuthSession : 'null';
|
|
8
|
+
if (authCookie === 'null') {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
return await Nano({
|
|
13
|
+
cookie: 'AuthSession=' + authCookie,
|
|
14
|
+
url: COUCH_URL_WITH_PROTOCOL,
|
|
15
|
+
})
|
|
16
|
+
.session()
|
|
17
|
+
.then((s) => {
|
|
18
|
+
logger.info(`AuthUser: ${JSON.stringify(s)}`);
|
|
19
|
+
const isAdmin = s.userCtx.roles.indexOf('_admin') !== -1;
|
|
20
|
+
const isLoggedInUser = s.userCtx.name === username;
|
|
21
|
+
return isAdmin && isLoggedInUser;
|
|
22
|
+
})
|
|
23
|
+
.catch((_err) => {
|
|
24
|
+
return false;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function logRequest(req) {
|
|
29
|
+
logger.info(`${req.body.type} request from ${req.body.user}...`);
|
|
30
|
+
}
|
|
31
|
+
export async function requestIsAuthenticated(req) {
|
|
32
|
+
logRequest(req);
|
|
33
|
+
// Studio mode bypass: skip authentication for local development
|
|
34
|
+
if (process.env.NODE_ENV === 'studio') {
|
|
35
|
+
logger.info('Studio mode: bypassing authentication for local development');
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
if (req.headers.authorization) {
|
|
39
|
+
const auth = Buffer.from(req.headers.authorization.split(' ')[1], 'base64')
|
|
40
|
+
.toString('ascii')
|
|
41
|
+
.split(':');
|
|
42
|
+
const username = auth[0];
|
|
43
|
+
const password = auth[1];
|
|
44
|
+
const authResult = await Nano({
|
|
45
|
+
url: COUCH_URL_WITH_PROTOCOL,
|
|
46
|
+
}).auth(username, password);
|
|
47
|
+
return authResult.ok;
|
|
48
|
+
}
|
|
49
|
+
const username = req.body.user;
|
|
50
|
+
const authCookie = req.cookies.AuthSession ? req.cookies.AuthSession : 'null';
|
|
51
|
+
if (authCookie === 'null') {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
return await Nano({
|
|
56
|
+
cookie: 'AuthSession=' + authCookie,
|
|
57
|
+
url: COUCH_URL_WITH_PROTOCOL,
|
|
58
|
+
})
|
|
59
|
+
.session()
|
|
60
|
+
.then((s) => {
|
|
61
|
+
logger.info(`AuthUser: ${JSON.stringify(s)}`);
|
|
62
|
+
return s.userCtx.name === username;
|
|
63
|
+
})
|
|
64
|
+
.catch((_err) => {
|
|
65
|
+
return false;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=authentication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication.js","sourceRoot":"","sources":["../../src/couchdb/authentication.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import Nano from 'nano';
|
|
2
|
+
declare const CouchDB: Nano.ServerScope;
|
|
3
|
+
export declare function useOrCreateCourseDB(courseID: string): Promise<Nano.DocumentScope<unknown>>;
|
|
4
|
+
export declare function useOrCreateDB<T>(dbName: string): Promise<Nano.DocumentScope<T>>;
|
|
5
|
+
export declare function docCount(dbName: string): Promise<number>;
|
|
6
|
+
export interface SecurityObject extends Nano.MaybeDocument {
|
|
7
|
+
admins: {
|
|
8
|
+
names: string[];
|
|
9
|
+
roles: string[];
|
|
10
|
+
};
|
|
11
|
+
members: {
|
|
12
|
+
names: string[];
|
|
13
|
+
roles: string[];
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare const COUCH_URL_WITH_PROTOCOL: string;
|
|
17
|
+
export default CouchDB;
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/couchdb/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAyBxB,QAAA,MAAM,OAAO,kBAA2B,CAAC;AAEzC,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAEhG;AAMD,wBAAsB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAmBrF;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI9D;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,aAAa;IACxD,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;CACH;AAED,eAAO,MAAM,uBAAuB,QAAgD,CAAC;AAErF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import Nano from 'nano';
|
|
2
|
+
import process from 'process';
|
|
3
|
+
import ENV from '../utils/env.js';
|
|
4
|
+
import logger from '../logger.js';
|
|
5
|
+
const url = ENV.COUCHDB_SERVER;
|
|
6
|
+
const protocol = ENV.COUCHDB_PROTOCOL;
|
|
7
|
+
const admin = {
|
|
8
|
+
username: ENV.COUCHDB_ADMIN,
|
|
9
|
+
password: ENV.COUCHDB_PASSWORD,
|
|
10
|
+
};
|
|
11
|
+
const credentialCouchURL = `${protocol}://${admin.username}:${admin.password}@${url}`;
|
|
12
|
+
logger.info('WORKING DIRECTORY: ' + process.cwd());
|
|
13
|
+
logger.info(`CouchDB url: ${url}
|
|
14
|
+
protocol: ${protocol}
|
|
15
|
+
credentials:
|
|
16
|
+
\tusername: ${admin.username}
|
|
17
|
+
\tpassword: *****
|
|
18
|
+
credUrl: ${protocol}://${admin.username}:*****@${url}
|
|
19
|
+
`);
|
|
20
|
+
const CouchDB = Nano(credentialCouchURL);
|
|
21
|
+
export async function useOrCreateCourseDB(courseID) {
|
|
22
|
+
return useOrCreateDB(`coursedb-${courseID}`);
|
|
23
|
+
}
|
|
24
|
+
export async function useOrCreateDB(dbName) {
|
|
25
|
+
const ret = CouchDB.use(dbName);
|
|
26
|
+
try {
|
|
27
|
+
await ret.info();
|
|
28
|
+
return ret;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
try {
|
|
32
|
+
await CouchDB.db.create(dbName);
|
|
33
|
+
return ret;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
const createErr = error;
|
|
37
|
+
// If error is "database already exists", return existing db
|
|
38
|
+
if (createErr.statusCode === 412) {
|
|
39
|
+
return ret;
|
|
40
|
+
}
|
|
41
|
+
throw createErr;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export async function docCount(dbName) {
|
|
46
|
+
const db = await useOrCreateDB(dbName);
|
|
47
|
+
const info = await db.info();
|
|
48
|
+
return info.doc_count;
|
|
49
|
+
}
|
|
50
|
+
export const COUCH_URL_WITH_PROTOCOL = protocol + '://' + process.env.COUCHDB_SERVER;
|
|
51
|
+
export default CouchDB;
|
|
52
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/couchdb/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,GAAG,MAAM,iBAAiB,CAAC;AAClC,OAAO,MAAM,MAAM,cAAc,CAAC;AAElC,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,CAAC;AAC/B,MAAM,QAAQ,GAAW,GAAG,CAAC,gBAAgB,CAAC;AAE9C,MAAM,KAAK,GAAG;IACZ,QAAQ,EAAE,GAAG,CAAC,aAAa;IAC3B,QAAQ,EAAE,GAAG,CAAC,gBAAgB;CAC/B,CAAC;AACF,MAAM,kBAAkB,GAAG,GAAG,QAAQ,MAAM,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,IAAI,GAAG,EAAE,CAAC;AAEtF,MAAM,CAAC,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACnD,MAAM,CAAC,IAAI,CACT,gBAAgB,GAAG;gBACL,QAAQ;;kBAEN,KAAK,CAAC,QAAQ;;eAEjB,QAAQ,MAAM,KAAK,CAAC,QAAQ,UAAU,GAAG;KACnD,CACJ,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACxD,OAAO,aAAa,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC;AAC/C,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAI,MAAc;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAI,MAAM,CAAC,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,OAAO,GAAG,CAAC;QACX,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,KAAkB,CAAC;YACrC,4DAA4D;YAC5D,IAAI,SAAS,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBACnC,OAAO,GAAG,CAAC;YACb,CAAC;YACD,MAAM,SAAS,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc;IAC3C,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,IAAI,CAAC,SAAS,CAAC;AACxB,CAAC;AAaD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAErF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export declare const classroomDbDesignDoc: string;
|
|
2
|
+
export declare const courseDBDesignDoc: string;
|
|
3
|
+
export declare const courseValidateDocUpdate: string;
|
|
4
|
+
export declare const elodoc: {
|
|
5
|
+
_id: string;
|
|
6
|
+
views: {
|
|
7
|
+
elo: {
|
|
8
|
+
map: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
language: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const tagsDoc: {
|
|
14
|
+
_id: string;
|
|
15
|
+
views: {
|
|
16
|
+
getTags: {
|
|
17
|
+
map: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
language: string;
|
|
21
|
+
};
|
|
22
|
+
export declare const cardsByInexperienceDoc: {
|
|
23
|
+
_id: string;
|
|
24
|
+
views: {
|
|
25
|
+
cardsByInexperience: {
|
|
26
|
+
map: string;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
language: string;
|
|
30
|
+
};
|
|
31
|
+
export declare const authDesignDoc: {
|
|
32
|
+
_id: string;
|
|
33
|
+
validate_doc_update: string;
|
|
34
|
+
};
|
|
35
|
+
export declare const courseDBDesignDocs: ({
|
|
36
|
+
_id: string;
|
|
37
|
+
views: {
|
|
38
|
+
elo: {
|
|
39
|
+
map: string;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
language: string;
|
|
43
|
+
} | {
|
|
44
|
+
_id: string;
|
|
45
|
+
views: {
|
|
46
|
+
getTags: {
|
|
47
|
+
map: string;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
language: string;
|
|
51
|
+
} | {
|
|
52
|
+
_id: string;
|
|
53
|
+
views: {
|
|
54
|
+
cardsByInexperience: {
|
|
55
|
+
map: string;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
language: string;
|
|
59
|
+
} | {
|
|
60
|
+
_id: string;
|
|
61
|
+
validate_doc_update: string;
|
|
62
|
+
})[];
|
|
63
|
+
//# sourceMappingURL=design-docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-docs.d.ts","sourceRoot":"","sources":["../src/design-docs.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,oBAAoB,QAGhC,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAG7B,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAGnC,CAAC;AAEF,eAAO,MAAM,MAAM;;;;;;;;CAqBlB,CAAC;AAEF,eAAO,MAAM,OAAO;;;;;;;;CAoBnB,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;CAsBlC,CAAC;AAEF,eAAO,MAAM,aAAa;;;CAGzB,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;IAK9B,CAAC"}
|