@vue-skuilder/express 0.1.11-10 → 0.1.11-13
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/attachment-preprocessing/index.d.ts.map +1 -1
- package/dist/attachment-preprocessing/index.js +43 -8
- package/dist/attachment-preprocessing/index.js.map +1 -1
- package/dist/couchdb/index.d.ts.map +1 -1
- package/dist/couchdb/index.js +5 -2
- package/dist/couchdb/index.js.map +1 -1
- package/package.json +3 -3
- package/src/attachment-preprocessing/index.ts +45 -11
- package/src/couchdb/index.ts +26 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/attachment-preprocessing/index.ts"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/attachment-preprocessing/index.ts"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAyCxD;AAED;;;GAGG;AACH,wBAA8B,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkF7E"}
|
|
@@ -12,17 +12,22 @@ const Q = new AsyncProcessQueue(processDocAttachments);
|
|
|
12
12
|
*/
|
|
13
13
|
export function postProcessCourse(courseID) {
|
|
14
14
|
try {
|
|
15
|
-
logger.info(`
|
|
15
|
+
logger.info(`postProcessCourse: Starting for courseID: ${courseID}`);
|
|
16
16
|
const crsString = `coursedb-${courseID}`;
|
|
17
|
+
logger.debug(`postProcessCourse: Using database name: ${crsString}`);
|
|
17
18
|
// Get database instance
|
|
18
19
|
const db = getCouchDB().use(crsString);
|
|
19
20
|
// Test database existence before setting up change listener
|
|
20
21
|
db.info().catch((e) => {
|
|
21
22
|
if (e && typeof e === 'object' && 'status' in e && e.status === 404) {
|
|
22
|
-
logger.error(`Database "${crsString}" does not exist. Expected database name may be incorrect for courseID: ${courseID}`);
|
|
23
|
+
logger.error(`postProcessCourse: Database "${crsString}" does not exist. Expected database name may be incorrect for courseID: ${courseID}`);
|
|
23
24
|
return;
|
|
24
25
|
}
|
|
25
|
-
logger.error(`Error checking database "${crsString}": ${e}`);
|
|
26
|
+
logger.error(`postProcessCourse: Error checking database "${crsString}": ${e}`);
|
|
27
|
+
// Log full error details for debugging
|
|
28
|
+
if (e && typeof e === 'object') {
|
|
29
|
+
logger.error(`postProcessCourse: Full error details for ${crsString}:`, e);
|
|
30
|
+
}
|
|
26
31
|
});
|
|
27
32
|
const courseFilter = filterFactory(courseID);
|
|
28
33
|
db.changesReader
|
|
@@ -88,11 +93,15 @@ export default async function postProcess(courseIDs) {
|
|
|
88
93
|
logger.info('Studio mode detected: scanning for additional course databases...');
|
|
89
94
|
try {
|
|
90
95
|
const allDbs = await getCouchDB().db.list();
|
|
96
|
+
logger.debug(`All databases found: ${allDbs.join(', ')}`);
|
|
91
97
|
const studioDbs = allDbs.filter((db) => db.startsWith('coursedb-') && !processedCourseIds.has(db));
|
|
92
|
-
logger.info(`Found ${studioDbs.length} potential studio databases`);
|
|
98
|
+
logger.info(`Found ${studioDbs.length} potential studio databases: ${studioDbs.join(', ')}`);
|
|
99
|
+
logger.debug(`Already processed course IDs: ${Array.from(processedCourseIds).join(', ')}`);
|
|
93
100
|
for (const studioDb of studioDbs) {
|
|
94
101
|
const courseId = studioDb.replace('coursedb-', '');
|
|
102
|
+
logger.debug(`Checking studio database: ${studioDb} (courseId: ${courseId})`);
|
|
95
103
|
try {
|
|
104
|
+
logger.debug(`Calling hasCourseConfig for: ${studioDb}`);
|
|
96
105
|
if (await hasCourseConfig(studioDb)) {
|
|
97
106
|
logger.info(`Starting postprocessing for studio database: ${studioDb}`);
|
|
98
107
|
postProcessCourse(courseId);
|
|
@@ -103,6 +112,10 @@ export default async function postProcess(courseIDs) {
|
|
|
103
112
|
}
|
|
104
113
|
catch (e) {
|
|
105
114
|
logger.error(`Error processing studio database ${studioDb}: ${e}`);
|
|
115
|
+
// Log the full error object for debugging
|
|
116
|
+
if (e && typeof e === 'object') {
|
|
117
|
+
logger.error(`Error details for ${studioDb}:`, e);
|
|
118
|
+
}
|
|
106
119
|
}
|
|
107
120
|
}
|
|
108
121
|
}
|
|
@@ -116,7 +129,9 @@ export default async function postProcess(courseIDs) {
|
|
|
116
129
|
}
|
|
117
130
|
}
|
|
118
131
|
function filterFactory(courseID) {
|
|
119
|
-
const
|
|
132
|
+
const databaseName = `coursedb-${courseID}`;
|
|
133
|
+
logger.debug(`filterFactory: Creating filter for database: ${databaseName}`);
|
|
134
|
+
const courseDatabase = getCouchDB().use(databaseName);
|
|
120
135
|
return async function filterChanges(changeItem) {
|
|
121
136
|
try {
|
|
122
137
|
const docNoAttachments = await courseDatabase.get(changeItem.id, {
|
|
@@ -207,7 +222,21 @@ async function processDocAttachments(request) {
|
|
|
207
222
|
*/
|
|
208
223
|
async function hasCourseConfig(databaseName) {
|
|
209
224
|
try {
|
|
225
|
+
logger.debug(`hasCourseConfig: Accessing database: ${databaseName}`);
|
|
210
226
|
const db = getCouchDB().use(databaseName);
|
|
227
|
+
// First check if database exists by trying to get info
|
|
228
|
+
try {
|
|
229
|
+
await db.info();
|
|
230
|
+
logger.debug(`hasCourseConfig: Database ${databaseName} exists, checking for course config`);
|
|
231
|
+
}
|
|
232
|
+
catch (infoError) {
|
|
233
|
+
if (infoError && typeof infoError === 'object' && 'status' in infoError && infoError.status === 404) {
|
|
234
|
+
logger.debug(`hasCourseConfig: Database ${databaseName} does not exist (404)`);
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
logger.warn(`hasCourseConfig: Error getting info for database ${databaseName}: ${infoError}`);
|
|
238
|
+
throw infoError;
|
|
239
|
+
}
|
|
211
240
|
// Try to find a course configuration document
|
|
212
241
|
// Course databases should have documents with course metadata
|
|
213
242
|
const result = await db.find({
|
|
@@ -221,15 +250,21 @@ async function hasCourseConfig(databaseName) {
|
|
|
221
250
|
},
|
|
222
251
|
limit: 1,
|
|
223
252
|
});
|
|
224
|
-
|
|
253
|
+
const hasConfig = result.docs && result.docs.length > 0;
|
|
254
|
+
logger.debug(`hasCourseConfig: Database ${databaseName} has course config: ${hasConfig}`);
|
|
255
|
+
return hasConfig;
|
|
225
256
|
}
|
|
226
257
|
catch (e) {
|
|
227
258
|
// Handle specific database not found errors
|
|
228
259
|
if (e && typeof e === 'object' && 'error' in e && e.error === 'not_found') {
|
|
229
|
-
logger.debug(`Database ${databaseName} does not exist`);
|
|
260
|
+
logger.debug(`hasCourseConfig: Database ${databaseName} does not exist (not_found error)`);
|
|
230
261
|
return false;
|
|
231
262
|
}
|
|
232
|
-
logger.
|
|
263
|
+
logger.error(`hasCourseConfig: Error checking course config for ${databaseName}: ${e}`);
|
|
264
|
+
// Log full error details for debugging
|
|
265
|
+
if (e && typeof e === 'object') {
|
|
266
|
+
logger.error(`hasCourseConfig: Full error details for ${databaseName}:`, e);
|
|
267
|
+
}
|
|
233
268
|
return false;
|
|
234
269
|
}
|
|
235
270
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/attachment-preprocessing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,iBAA6B,MAAM,0BAA0B,CAAC;AACrE,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,GAAG,MAAM,iBAAiB,CAAC;AAElC,0BAA0B;AAC1B,MAAM,CAAC,GAAG,IAAI,iBAAiB,CAC7B,qBAAqB,CACtB,CAAC;AAgBF;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/attachment-preprocessing/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/couchdb/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/couchdb/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAMrD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAejE;AAED,wBAAgB,UAAU,IAAI,IAAI,CAAC,WAAW,CAO7C;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAOhD;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAGtC;AAMD,wBAAsB,aAAa,CAAC,CAAC,EACnC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAoBhC;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"}
|
package/dist/couchdb/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import Nano from 'nano';
|
|
2
|
+
import logger from '../logger.js';
|
|
2
3
|
let CouchDB;
|
|
3
4
|
let couchURLWithProtocol;
|
|
4
5
|
export function initializeCouchDB(config) {
|
|
5
|
-
const { COUCHDB_SERVER: url, COUCHDB_PROTOCOL: protocol, COUCHDB_ADMIN: username, COUCHDB_PASSWORD: password } = config;
|
|
6
|
+
const { COUCHDB_SERVER: url, COUCHDB_PROTOCOL: protocol, COUCHDB_ADMIN: username, COUCHDB_PASSWORD: password, } = config;
|
|
6
7
|
if (!url || !protocol || !username || !password) {
|
|
7
8
|
throw new Error('Missing CouchDB configuration');
|
|
8
9
|
}
|
|
@@ -23,6 +24,7 @@ export function getCouchURLWithProtocol() {
|
|
|
23
24
|
return couchURLWithProtocol;
|
|
24
25
|
}
|
|
25
26
|
export async function useOrCreateCourseDB(courseID) {
|
|
27
|
+
logger.debug(`Using or creating course DB for course ID: ${courseID}`);
|
|
26
28
|
return useOrCreateDB(`coursedb-${courseID}`);
|
|
27
29
|
}
|
|
28
30
|
export async function useOrCreateDB(dbName) {
|
|
@@ -31,7 +33,8 @@ export async function useOrCreateDB(dbName) {
|
|
|
31
33
|
await db.info();
|
|
32
34
|
return db;
|
|
33
35
|
}
|
|
34
|
-
catch {
|
|
36
|
+
catch (error) {
|
|
37
|
+
logger.debug(`Lookup failed for Database ${dbName}: `, error);
|
|
35
38
|
try {
|
|
36
39
|
await getCouchDB().db.create(dbName);
|
|
37
40
|
return db;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/couchdb/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/couchdb/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,MAAM,MAAM,cAAc,CAAC;AAElC,IAAI,OAAyB,CAAC;AAC9B,IAAI,oBAA4B,CAAC;AAEjC,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,MAAM,EACJ,cAAc,EAAE,GAAG,EACnB,gBAAgB,EAAE,QAAQ,EAC1B,aAAa,EAAE,QAAQ,EACvB,gBAAgB,EAAE,QAAQ,GAC3B,GAAG,MAAM,CAAC;IAEX,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,kBAAkB,GAAG,GAAG,QAAQ,MAAM,QAAQ,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;IAC1E,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnC,oBAAoB,GAAG,GAAG,QAAQ,MAAM,GAAG,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC;IACD,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAgB;IAEhB,MAAM,CAAC,KAAK,CAAC,8CAA8C,QAAQ,EAAE,CAAC,CAAC;IACvE,OAAO,aAAa,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC;AAC/C,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc;IAEd,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC,GAAG,CAAI,MAAM,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,CAAC,KAAK,CAAC,8BAA8B,MAAM,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,KAAkB,CAAC;YACrC,4DAA4D;YAC5D,IAAI,SAAS,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBACjC,OAAO,EAAE,CAAC;YACZ,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"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.1.11-
|
|
6
|
+
"version": "0.1.11-13",
|
|
7
7
|
"description": "an API",
|
|
8
8
|
"main": "dist/index.js",
|
|
9
9
|
"type": "module",
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
"author": "Colin Kennedy",
|
|
34
34
|
"license": "GPL-3.0-or-later",
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@vue-skuilder/common": "^0.1.11-
|
|
37
|
-
"@vue-skuilder/db": "^0.1.11-
|
|
36
|
+
"@vue-skuilder/common": "^0.1.11-13",
|
|
37
|
+
"@vue-skuilder/db": "^0.1.11-13",
|
|
38
38
|
"axios": "^1.7.4",
|
|
39
39
|
"cookie-parser": "^1.4.7",
|
|
40
40
|
"cors": "^2.8.5",
|
|
@@ -31,9 +31,10 @@ interface DocForProcessing extends nano.DocumentGetResponse {
|
|
|
31
31
|
*/
|
|
32
32
|
export function postProcessCourse(courseID: string): void {
|
|
33
33
|
try {
|
|
34
|
-
logger.info(`
|
|
34
|
+
logger.info(`postProcessCourse: Starting for courseID: ${courseID}`);
|
|
35
35
|
|
|
36
36
|
const crsString = `coursedb-${courseID}`;
|
|
37
|
+
logger.debug(`postProcessCourse: Using database name: ${crsString}`);
|
|
37
38
|
|
|
38
39
|
// Get database instance
|
|
39
40
|
const db = getCouchDB().use(crsString);
|
|
@@ -41,10 +42,14 @@ export function postProcessCourse(courseID: string): void {
|
|
|
41
42
|
// Test database existence before setting up change listener
|
|
42
43
|
db.info().catch((e: unknown) => {
|
|
43
44
|
if (e && typeof e === 'object' && 'status' in e && e.status === 404) {
|
|
44
|
-
logger.error(`Database "${crsString}" does not exist. Expected database name may be incorrect for courseID: ${courseID}`);
|
|
45
|
+
logger.error(`postProcessCourse: Database "${crsString}" does not exist. Expected database name may be incorrect for courseID: ${courseID}`);
|
|
45
46
|
return;
|
|
46
47
|
}
|
|
47
|
-
logger.error(`Error checking database "${crsString}": ${e}`);
|
|
48
|
+
logger.error(`postProcessCourse: Error checking database "${crsString}": ${e}`);
|
|
49
|
+
// Log full error details for debugging
|
|
50
|
+
if (e && typeof e === 'object') {
|
|
51
|
+
logger.error(`postProcessCourse: Full error details for ${crsString}:`, e);
|
|
52
|
+
}
|
|
48
53
|
});
|
|
49
54
|
|
|
50
55
|
const courseFilter = filterFactory(courseID);
|
|
@@ -115,16 +120,21 @@ export default async function postProcess(courseIDs?: string[]): Promise<void> {
|
|
|
115
120
|
|
|
116
121
|
try {
|
|
117
122
|
const allDbs = await getCouchDB().db.list();
|
|
123
|
+
logger.debug(`All databases found: ${allDbs.join(', ')}`);
|
|
124
|
+
|
|
118
125
|
const studioDbs = allDbs.filter(
|
|
119
126
|
(db) => db.startsWith('coursedb-') && !processedCourseIds.has(db)
|
|
120
127
|
);
|
|
121
|
-
|
|
122
|
-
logger.info(`Found ${studioDbs.length} potential studio databases`);
|
|
128
|
+
|
|
129
|
+
logger.info(`Found ${studioDbs.length} potential studio databases: ${studioDbs.join(', ')}`);
|
|
130
|
+
logger.debug(`Already processed course IDs: ${Array.from(processedCourseIds).join(', ')}`);
|
|
123
131
|
|
|
124
132
|
for (const studioDb of studioDbs) {
|
|
125
133
|
const courseId = studioDb.replace('coursedb-', '');
|
|
134
|
+
logger.debug(`Checking studio database: ${studioDb} (courseId: ${courseId})`);
|
|
126
135
|
|
|
127
136
|
try {
|
|
137
|
+
logger.debug(`Calling hasCourseConfig for: ${studioDb}`);
|
|
128
138
|
if (await hasCourseConfig(studioDb)) {
|
|
129
139
|
logger.info(
|
|
130
140
|
`Starting postprocessing for studio database: ${studioDb}`
|
|
@@ -135,6 +145,10 @@ export default async function postProcess(courseIDs?: string[]): Promise<void> {
|
|
|
135
145
|
}
|
|
136
146
|
} catch (e) {
|
|
137
147
|
logger.error(`Error processing studio database ${studioDb}: ${e}`);
|
|
148
|
+
// Log the full error object for debugging
|
|
149
|
+
if (e && typeof e === 'object') {
|
|
150
|
+
logger.error(`Error details for ${studioDb}:`, e);
|
|
151
|
+
}
|
|
138
152
|
}
|
|
139
153
|
}
|
|
140
154
|
} catch (e) {
|
|
@@ -147,9 +161,9 @@ export default async function postProcess(courseIDs?: string[]): Promise<void> {
|
|
|
147
161
|
}
|
|
148
162
|
|
|
149
163
|
function filterFactory(courseID: string) {
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
);
|
|
164
|
+
const databaseName = `coursedb-${courseID}`;
|
|
165
|
+
logger.debug(`filterFactory: Creating filter for database: ${databaseName}`);
|
|
166
|
+
const courseDatabase = getCouchDB().use<DocForProcessing>(databaseName);
|
|
153
167
|
|
|
154
168
|
return async function filterChanges(
|
|
155
169
|
changeItem: nano.DatabaseChangesResultItem
|
|
@@ -276,8 +290,22 @@ interface ProcessingField {
|
|
|
276
290
|
*/
|
|
277
291
|
async function hasCourseConfig(databaseName: string): Promise<boolean> {
|
|
278
292
|
try {
|
|
293
|
+
logger.debug(`hasCourseConfig: Accessing database: ${databaseName}`);
|
|
279
294
|
const db = getCouchDB().use(databaseName);
|
|
280
295
|
|
|
296
|
+
// First check if database exists by trying to get info
|
|
297
|
+
try {
|
|
298
|
+
await db.info();
|
|
299
|
+
logger.debug(`hasCourseConfig: Database ${databaseName} exists, checking for course config`);
|
|
300
|
+
} catch (infoError: unknown) {
|
|
301
|
+
if (infoError && typeof infoError === 'object' && 'status' in infoError && infoError.status === 404) {
|
|
302
|
+
logger.debug(`hasCourseConfig: Database ${databaseName} does not exist (404)`);
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
logger.warn(`hasCourseConfig: Error getting info for database ${databaseName}: ${infoError}`);
|
|
306
|
+
throw infoError;
|
|
307
|
+
}
|
|
308
|
+
|
|
281
309
|
// Try to find a course configuration document
|
|
282
310
|
// Course databases should have documents with course metadata
|
|
283
311
|
const result = await db.find({
|
|
@@ -292,15 +320,21 @@ async function hasCourseConfig(databaseName: string): Promise<boolean> {
|
|
|
292
320
|
limit: 1,
|
|
293
321
|
});
|
|
294
322
|
|
|
295
|
-
|
|
323
|
+
const hasConfig = result.docs && result.docs.length > 0;
|
|
324
|
+
logger.debug(`hasCourseConfig: Database ${databaseName} has course config: ${hasConfig}`);
|
|
325
|
+
return hasConfig;
|
|
296
326
|
} catch (e: unknown) {
|
|
297
327
|
// Handle specific database not found errors
|
|
298
328
|
if (e && typeof e === 'object' && 'error' in e && e.error === 'not_found') {
|
|
299
|
-
logger.debug(`Database ${databaseName} does not exist`);
|
|
329
|
+
logger.debug(`hasCourseConfig: Database ${databaseName} does not exist (not_found error)`);
|
|
300
330
|
return false;
|
|
301
331
|
}
|
|
302
332
|
|
|
303
|
-
logger.
|
|
333
|
+
logger.error(`hasCourseConfig: Error checking course config for ${databaseName}: ${e}`);
|
|
334
|
+
// Log full error details for debugging
|
|
335
|
+
if (e && typeof e === 'object') {
|
|
336
|
+
logger.error(`hasCourseConfig: Full error details for ${databaseName}:`, e);
|
|
337
|
+
}
|
|
304
338
|
return false;
|
|
305
339
|
}
|
|
306
340
|
}
|
package/src/couchdb/index.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import Nano from 'nano';
|
|
2
2
|
import type { EnvironmentConfig } from '../types.js';
|
|
3
|
+
import logger from '../logger.js';
|
|
3
4
|
|
|
4
5
|
let CouchDB: Nano.ServerScope;
|
|
5
6
|
let couchURLWithProtocol: string;
|
|
6
7
|
|
|
7
8
|
export function initializeCouchDB(config: EnvironmentConfig): void {
|
|
8
|
-
const {
|
|
9
|
+
const {
|
|
9
10
|
COUCHDB_SERVER: url,
|
|
10
11
|
COUCHDB_PROTOCOL: protocol,
|
|
11
12
|
COUCHDB_ADMIN: username,
|
|
12
|
-
COUCHDB_PASSWORD: password
|
|
13
|
+
COUCHDB_PASSWORD: password,
|
|
13
14
|
} = config;
|
|
14
15
|
|
|
15
16
|
if (!url || !protocol || !username || !password) {
|
|
@@ -23,19 +24,26 @@ export function initializeCouchDB(config: EnvironmentConfig): void {
|
|
|
23
24
|
|
|
24
25
|
export function getCouchDB(): Nano.ServerScope {
|
|
25
26
|
if (!CouchDB) {
|
|
26
|
-
throw new Error(
|
|
27
|
+
throw new Error(
|
|
28
|
+
'CouchDB has not been initialized. Call initializeCouchDB first.'
|
|
29
|
+
);
|
|
27
30
|
}
|
|
28
31
|
return CouchDB;
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
export function getCouchURLWithProtocol(): string {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
if (!couchURLWithProtocol) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
'CouchDB has not been initialized. Call initializeCouchDB first.'
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
return couchURLWithProtocol;
|
|
36
41
|
}
|
|
37
42
|
|
|
38
|
-
export async function useOrCreateCourseDB(
|
|
43
|
+
export async function useOrCreateCourseDB(
|
|
44
|
+
courseID: string
|
|
45
|
+
): Promise<Nano.DocumentScope<unknown>> {
|
|
46
|
+
logger.debug(`Using or creating course DB for course ID: ${courseID}`);
|
|
39
47
|
return useOrCreateDB(`coursedb-${courseID}`);
|
|
40
48
|
}
|
|
41
49
|
|
|
@@ -43,20 +51,23 @@ interface NanoError extends Error {
|
|
|
43
51
|
statusCode?: number;
|
|
44
52
|
}
|
|
45
53
|
|
|
46
|
-
export async function useOrCreateDB<T>(
|
|
54
|
+
export async function useOrCreateDB<T>(
|
|
55
|
+
dbName: string
|
|
56
|
+
): Promise<Nano.DocumentScope<T>> {
|
|
47
57
|
const db = getCouchDB().use<T>(dbName);
|
|
48
58
|
|
|
49
59
|
try {
|
|
50
60
|
await db.info();
|
|
51
61
|
return db;
|
|
52
|
-
} catch {
|
|
62
|
+
} catch (error: unknown) {
|
|
63
|
+
logger.debug(`Lookup failed for Database ${dbName}: `, error);
|
|
53
64
|
try {
|
|
54
65
|
await getCouchDB().db.create(dbName);
|
|
55
66
|
return db;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
67
|
+
} catch (error: unknown) {
|
|
68
|
+
const createErr = error as NanoError;
|
|
69
|
+
// If error is "database already exists", return existing db
|
|
70
|
+
if (createErr.statusCode === 412) {
|
|
60
71
|
return db;
|
|
61
72
|
}
|
|
62
73
|
throw createErr;
|
|
@@ -79,4 +90,4 @@ export interface SecurityObject extends Nano.MaybeDocument {
|
|
|
79
90
|
names: string[];
|
|
80
91
|
roles: string[];
|
|
81
92
|
};
|
|
82
|
-
}
|
|
93
|
+
}
|