@cocreate/mongodb 1.10.5 → 1.11.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/CHANGELOG.md +22 -0
- package/demo/index.html +3 -3
- package/package.json +2 -2
- package/src/index.js +81 -36
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
# [1.11.0](https://github.com/CoCreate-app/CoCreate-mongodb/compare/v1.10.6...v1.11.0) (2023-11-03)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* favicon.ico path ([5e54a37](https://github.com/CoCreate-app/CoCreate-mongodb/commit/5e54a371dcbebc7364d401570c3f0cbeb3f0db31))
|
|
7
|
+
* update dependencies to the lates versions ([2a4dc62](https://github.com/CoCreate-app/CoCreate-mongodb/commit/2a4dc6263067c3c1cc4571d623aa8530a83708d1))
|
|
8
|
+
* update method to use object.update etc ([1e9e7b8](https://github.com/CoCreate-app/CoCreate-mongodb/commit/1e9e7b8e81d7512ec546cdbcbc381851477f8271))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* morph data[type] so the object can be synced across multiple storage, database, arra ([8d29c0a](https://github.com/CoCreate-app/CoCreate-mongodb/commit/8d29c0a7cc160654e04e0e6266f82906e772f57f))
|
|
14
|
+
* read.object will compare modified.on and update db ([b8b2c74](https://github.com/CoCreate-app/CoCreate-mongodb/commit/b8b2c74e2abbf568eda14c1328961781395d7c5c))
|
|
15
|
+
|
|
16
|
+
## [1.10.6](https://github.com/CoCreate-app/CoCreate-mongodb/compare/v1.10.5...v1.10.6) (2023-10-25)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Bug Fixes
|
|
20
|
+
|
|
21
|
+
* ensure a single connection is created ([f3856af](https://github.com/CoCreate-app/CoCreate-mongodb/commit/f3856afb83b59c314f73c11654f8aceaf4891bc7))
|
|
22
|
+
|
|
1
23
|
## [1.10.5](https://github.com/CoCreate-app/CoCreate-mongodb/compare/v1.10.4...v1.10.5) (2023-10-25)
|
|
2
24
|
|
|
3
25
|
|
package/demo/index.html
CHANGED
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
7
7
|
<link
|
|
8
8
|
rel="icon"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
type="image/png"
|
|
10
|
+
sizes="32x32"
|
|
11
|
+
href="../assets/favicon.ico" />
|
|
12
12
|
<title>mongodb | CoCreateJS</title>
|
|
13
13
|
</head>
|
|
14
14
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cocreate/mongodb",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"description": "A simple mongodb component in vanilla javascript. Easily configured using HTML5 data-attributes and/or JavaScript API.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mongodb",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
},
|
|
46
46
|
"main": "./src/index.js",
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@cocreate/utils": "^1.26.
|
|
48
|
+
"@cocreate/utils": "^1.26.2",
|
|
49
49
|
"mongodb": "^4.12.1"
|
|
50
50
|
}
|
|
51
51
|
}
|
package/src/index.js
CHANGED
|
@@ -1,29 +1,32 @@
|
|
|
1
1
|
const { MongoClient, ObjectId } = require('mongodb');
|
|
2
2
|
const { dotNotationToObject, queryData, searchData, sortData, isValidDate } = require('@cocreate/utils')
|
|
3
3
|
const clients = new Map()
|
|
4
|
-
|
|
4
|
+
const organizations = {}
|
|
5
5
|
|
|
6
6
|
async function dbClient(data) {
|
|
7
7
|
if (data.storageUrl) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
8
|
+
if (!organizations[data.organization_id])
|
|
9
|
+
organizations[data.organization_id] = {}
|
|
10
|
+
try {
|
|
11
|
+
if (!organizations[data.organization_id][data.storageUrl])
|
|
12
|
+
organizations[data.organization_id][data.storageUrl] = MongoClient.connect(data.storageUrl, { useNewUrlParser: true, useUnifiedTopology: true })
|
|
13
|
+
|
|
14
|
+
organizations[data.organization_id][data.storageUrl] = await organizations[data.organization_id][data.storageUrl]
|
|
15
|
+
return organizations[data.organization_id][data.storageUrl]
|
|
16
|
+
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.error(`${data.organization_id}: storageName ${data.storageName} failed to connect to mongodb`)
|
|
19
|
+
errorHandler(data, error)
|
|
20
|
+
return { status: false }
|
|
19
21
|
}
|
|
20
|
-
return client
|
|
21
22
|
}
|
|
23
|
+
|
|
24
|
+
errorHandler(data, 'missing StorageUrl')
|
|
22
25
|
return
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
function send(data) {
|
|
26
|
-
let [
|
|
29
|
+
let [type, method] = data.method.split('.')
|
|
27
30
|
// let action = data.method.replace(/\.([a-z])/g, (_, match) => match.toUpperCase());
|
|
28
31
|
|
|
29
32
|
if (type === 'database')
|
|
@@ -43,7 +46,7 @@ function database(action, data) {
|
|
|
43
46
|
|
|
44
47
|
try {
|
|
45
48
|
const client = await dbClient(data)
|
|
46
|
-
if (client.status === false)
|
|
49
|
+
if (!client || client.status === false)
|
|
47
50
|
return data
|
|
48
51
|
if (action == 'readDatabase') {
|
|
49
52
|
const db = client.db().admin();
|
|
@@ -97,7 +100,7 @@ function array(action, data) {
|
|
|
97
100
|
|
|
98
101
|
try {
|
|
99
102
|
const client = await dbClient(data)
|
|
100
|
-
if (client.status === false)
|
|
103
|
+
if (!client || client.status === false)
|
|
101
104
|
return data
|
|
102
105
|
|
|
103
106
|
if (data.request)
|
|
@@ -243,7 +246,8 @@ function object(action, data) {
|
|
|
243
246
|
return new Promise(async (resolve, reject) => {
|
|
244
247
|
try {
|
|
245
248
|
const client = await dbClient(data)
|
|
246
|
-
|
|
249
|
+
|
|
250
|
+
if (!client || client.status === false)
|
|
247
251
|
return data
|
|
248
252
|
|
|
249
253
|
let dataTransferedIn = 0
|
|
@@ -251,8 +255,8 @@ function object(action, data) {
|
|
|
251
255
|
let type = 'object'
|
|
252
256
|
let documents = [];
|
|
253
257
|
|
|
254
|
-
if (data.request)
|
|
255
|
-
|
|
258
|
+
// if (data.request)
|
|
259
|
+
// data[type] = data.request
|
|
256
260
|
|
|
257
261
|
if (!data['timeStamp'])
|
|
258
262
|
data['timeStamp'] = new Date()
|
|
@@ -281,8 +285,8 @@ function object(action, data) {
|
|
|
281
285
|
let isFilter
|
|
282
286
|
if (data.$filter)
|
|
283
287
|
isFilter = true
|
|
284
|
-
if (isFilter && !data[type].length)
|
|
285
|
-
data[type]
|
|
288
|
+
if ((isFilter && !data[type].length) || data.isFilter)
|
|
289
|
+
data[type].splice(0, 0, { isFilter: 'isEmptyObjectFilter' });
|
|
286
290
|
|
|
287
291
|
let filter = await createFilter(data, arrayObj);
|
|
288
292
|
|
|
@@ -348,21 +352,38 @@ function object(action, data) {
|
|
|
348
352
|
result = await arrayObj.insertOne(data[type][i]);
|
|
349
353
|
// TODO: type error occuring when pushing the item pushes but throws an error
|
|
350
354
|
data[type][i]._id = result.insertedId.toString()
|
|
351
|
-
documents.push({ ...data[type][i], ...reference })
|
|
355
|
+
// documents.push({ ...data[type][i], ...reference })
|
|
352
356
|
} else if (action === 'readObject') {
|
|
353
357
|
result = await arrayObj.findOne(query, projection);
|
|
354
358
|
result._id = result._id.toString()
|
|
355
|
-
|
|
359
|
+
|
|
360
|
+
if (data[type][i].$storage && data[type][i].modified && data[type][i].modified.on) {
|
|
361
|
+
if (!result) {
|
|
362
|
+
result = await arrayObj.insertOne(data[type][i]);
|
|
363
|
+
data[type][i]._id = result.insertedId.toString()
|
|
364
|
+
} else if (result && new Date(data[type][i].modified.on) > new Date(result.modified.on)) {
|
|
365
|
+
data[type][i] = { ...result, ...data[type][i] }
|
|
366
|
+
createUpdate(update, options, data[type][i])
|
|
367
|
+
result = await arrayObj.updateOne(query, update, options);
|
|
368
|
+
} else
|
|
369
|
+
data[type][i] = { ...data[type][i], ...result }
|
|
370
|
+
} else
|
|
371
|
+
data[type][i] = { ...data[type][i], ...result }
|
|
356
372
|
} else if (action === 'updateObject') {
|
|
357
373
|
result = await arrayObj.updateOne(query, update, options);
|
|
358
374
|
|
|
359
375
|
// TODO: handle upsert false and id does not exist
|
|
360
376
|
data[type][i]._id = query._id.toString()
|
|
361
|
-
documents.push({ ...data[type][i], ...reference })
|
|
377
|
+
// documents.push({ ...data[type][i], ...reference })
|
|
362
378
|
} else if (action === 'deleteObject') {
|
|
363
379
|
result = await arrayObj.deleteOne(query);
|
|
364
|
-
documents.push({ ...reference, _id: data[type][i]._id })
|
|
380
|
+
// documents.push({ ...reference, _id: data[type][i]._id })
|
|
365
381
|
}
|
|
382
|
+
|
|
383
|
+
data[type][i].$storage = 'mongodb'
|
|
384
|
+
data[type][i].$database = database
|
|
385
|
+
data[type][i].$array = array
|
|
386
|
+
|
|
366
387
|
dataTransferedIn += getBytes(result)
|
|
367
388
|
|
|
368
389
|
} catch (error) {
|
|
@@ -395,7 +416,22 @@ function object(action, data) {
|
|
|
395
416
|
}
|
|
396
417
|
|
|
397
418
|
if (action === 'readObject') {
|
|
398
|
-
|
|
419
|
+
document._id = document._id.toString()
|
|
420
|
+
let object = data[type].find(obj => obj._id && obj._id.toString() === document._id.toString())
|
|
421
|
+
if (object) {
|
|
422
|
+
if (object.$storage && object.modified && object.modified.on) {
|
|
423
|
+
if (document && new Date(object.modified.on) > new Date(document.modified.on)) {
|
|
424
|
+
object = { ...document, ...object }
|
|
425
|
+
createUpdate(update, options, object)
|
|
426
|
+
document = await arrayObj.updateOne(query, update, options);
|
|
427
|
+
dataTransferedIn += getBytes(document)
|
|
428
|
+
} else
|
|
429
|
+
documents.push({ ...document, ...reference })
|
|
430
|
+
} else
|
|
431
|
+
documents.push({ ...document, ...reference })
|
|
432
|
+
|
|
433
|
+
} else
|
|
434
|
+
documents.push({ ...document, ...reference })
|
|
399
435
|
} else {
|
|
400
436
|
dataTransferedOut += getBytes({ _id: document._id, update, options })
|
|
401
437
|
|
|
@@ -421,7 +457,7 @@ function object(action, data) {
|
|
|
421
457
|
|
|
422
458
|
dataTransferedIn += getBytes(result)
|
|
423
459
|
documents.push({ ...data[type][i], ...reference, _id: document._id.toString() })
|
|
424
|
-
data[type].push({ ...data[type][i], ...reference, _id: document._id.toString() })
|
|
460
|
+
// data[type].push({ ...data[type][i], ...reference, _id: document._id.toString() })
|
|
425
461
|
|
|
426
462
|
}
|
|
427
463
|
document = ''
|
|
@@ -449,7 +485,6 @@ function object(action, data) {
|
|
|
449
485
|
|
|
450
486
|
}
|
|
451
487
|
}
|
|
452
|
-
|
|
453
488
|
data = createData(data, documents, type, dataTransferedIn, dataTransferedOut)
|
|
454
489
|
resolve(data)
|
|
455
490
|
|
|
@@ -732,16 +767,26 @@ function createData(data, array, type, dataTransferedIn, dataTransferedOut) {
|
|
|
732
767
|
});
|
|
733
768
|
}
|
|
734
769
|
|
|
735
|
-
if (
|
|
736
|
-
data
|
|
770
|
+
if (data[type] && data[type][0] && data[type][0].isFilter === 'isEmptyObjectFilter') {
|
|
771
|
+
data[type].shift()
|
|
772
|
+
data.isFilter = true
|
|
773
|
+
}
|
|
737
774
|
|
|
738
|
-
data[type]
|
|
775
|
+
data[type].push(...array)
|
|
739
776
|
|
|
740
|
-
if (data.
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
}
|
|
777
|
+
// if (data.$filter && data.$filter.sort)
|
|
778
|
+
// data[type] = sortData(data[type], data.$filter.sort)
|
|
779
|
+
|
|
780
|
+
// if (!data.request)
|
|
781
|
+
// data.request = data[type] || {}
|
|
782
|
+
|
|
783
|
+
// data[type] = array
|
|
784
|
+
|
|
785
|
+
// if (data.returnLog) {
|
|
786
|
+
// if (!data.log)
|
|
787
|
+
// data.log = []
|
|
788
|
+
// data.log.push(...data[type])
|
|
789
|
+
// }
|
|
745
790
|
|
|
746
791
|
return data
|
|
747
792
|
}
|