@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 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
- href="https://cdn.cocreate.app/favicon.ico"
10
- type="image/ico"
11
- sizes="16x16" />
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.10.5",
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.1",
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
- let client = clients.get(data.storageUrl)
9
- if (!client) {
10
- try {
11
- clients.set(data.storageUrl, client)
12
- client = await MongoClient.connect(data.storageUrl, { useNewUrlParser: true, useUnifiedTopology: true });
13
- } catch (error) {
14
- clients.delete(data.storageUrl)
15
- console.error(`${data.organization_id}: storageName ${data.storageName} failed to connect to mongodb`)
16
- errorHandler(data, error)
17
- return { status: false }
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 [method, type] = data.method.split('.')
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
- if (client.status === false)
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
- data[type] = data.request
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
- documents.push({ ...result, ...reference })
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
- documents.push({ ...document, ...reference, _id: document._id.toString() })
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 (!data.request)
736
- data.request = data[type] || {}
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] = array
775
+ data[type].push(...array)
739
776
 
740
- if (data.returnLog) {
741
- if (!data.log)
742
- data.log = []
743
- data.log.push(...data[type])
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
  }