New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@cocreate/crud-server

Package Overview
Dependencies
Maintainers
1
Versions
175
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@cocreate/crud-server - npm Package Compare versions

Comparing version 1.10.1 to 1.11.0

19

CHANGELOG.md

@@ -0,1 +1,20 @@

# [1.11.0](https://github.com/CoCreate-app/CoCreate-crud-server/compare/v1.10.1...v1.11.0) (2022-10-01)
### Bug Fixes
* broadcast params reduced to socket, message, data ([ec9c8f2](https://github.com/CoCreate-app/CoCreate-crud-server/commit/ec9c8f259e516424ef95433904a0e89d2aa0c727))
* bump dependencies ([b5b9350](https://github.com/CoCreate-app/CoCreate-crud-server/commit/b5b9350dbcb1b20fc945542a600d526ddb78fb91))
* createDocument inserts _id in the data object ([113c2ff](https://github.com/CoCreate-app/CoCreate-crud-server/commit/113c2ffb3d0a291f3af8ba645f709b1b5811089d))
* createQuery ObjectId ([ec79e40](https://github.com/CoCreate-app/CoCreate-crud-server/commit/ec79e40b81760e347ce5d8d70ed28f3494c49538))
* filter value can be an object or an array ([75cd195](https://github.com/CoCreate-app/CoCreate-crud-server/commit/75cd19560d8086f01a05f55e76102793789ec1d1))
* merged crud and list ([acff218](https://github.com/CoCreate-app/CoCreate-crud-server/commit/acff21831b2ca1274bc5af775f7d3758f2e55663))
* relocate and import filter.js from @cocreate/filter ([b8bab38](https://github.com/CoCreate-app/CoCreate-crud-server/commit/b8bab3882b5ece91115a4568aa80bc5eca2c80f3))
### Features
* config now accessible from socket.config ([2d892ff](https://github.com/CoCreate-app/CoCreate-crud-server/commit/2d892ff961cb48187f8253a4f3778719cb764d1c))
* if data.returnDocument = false only defined names are returned ([652f624](https://github.com/CoCreate-app/CoCreate-crud-server/commit/652f6242c947d3b46d01deaea784f964f43450fd))
## [1.10.1](https://github.com/CoCreate-app/CoCreate-crud-server/compare/v1.10.0...v1.10.1) (2022-09-01)

@@ -2,0 +21,0 @@

4

package.json
{
"name": "@cocreate/crud-server",
"version": "1.10.1",
"version": "1.11.0",
"description": "CoCreate-crud-server",

@@ -43,3 +43,3 @@ "keywords": [

"dependencies": {
"@cocreate/docs": "^1.3.6",
"@cocreate/docs": "^1.3.14",
"csvtojson": "^2.0.10",

@@ -46,0 +46,0 @@ "json-2-csv": "^3.10.3",

@@ -16,7 +16,7 @@ const json2csv = require("json-2-csv")

if (this.wsManager) {
// this.wsManager.on('exportDB', (socket, data, socketInfo) => this.exportData(socket, data, socketInfo));
// this.wsManager.on('importDB', (socket, data, socketInfo) => this.importData(socket, data, socketInfo));
// this.wsManager.on('importFile2DB', (socket, data, socketInfo) => this.importData(socket, data, socketInfo));
// this.wsManager.on('exportDB', (socket, data) => this.exportData(socket, data));
// this.wsManager.on('importDB', (socket, data) => this.importData(socket, data));
// this.wsManager.on('importFile2DB', (socket, data) => this.importData(socket, data));
// this.wsManager.on('downloadData', (socket, data, socketInfo) => this.downloadData(socket, data, socketInfo))
// this.wsManager.on('downloadData', (socket, data) => this.downloadData(socket, data))
}

@@ -32,3 +32,3 @@ }

**/
// async downloadData(socket, data, socketInfo) {
// async downloadData(socket, data) {
// const export_type = data.type || "json";

@@ -39,3 +39,3 @@

// const result = data.data;
// const orgId = socketInfo ? socketInfo.orgId : "";
// const orgId = socket.config.orgId ;
// if (export_type === 'csv') {

@@ -66,3 +66,3 @@ // binaryData = await json2csv.json2csvAsync(JSON.parse(JSON.stringify(result)), {

**/
// async exportData(socket, data, socketInfo) {
// async exportData(socket, data) {
// const self = this;

@@ -75,3 +75,3 @@

// var collection = this.dbClient.db(data['namespace']).collection(data["collection"]);
// const orgId = socketInfo ? socketInfo.orgId : "";
// const orgId = socket.config.orgId

@@ -100,3 +100,3 @@ // var query = {};

// async setImportData(socket, data, socketInfo) {
// async setImportData(socket, data) {
// this.importCollection = data['collection']

@@ -107,3 +107,3 @@ // this.importType = data['import_type'];

// async importData(socket, data, socketInfo) {
// async importData(socket, data) {
// const importCollection = data['collection']

@@ -116,3 +116,3 @@ // const importType = data['import_type'];

// const self = this;
// // const orgId = socketInfo ? socketInfo.orgId : "";
// // const orgId = socket.config.orgId
// if (!importCollection || !importType) {

@@ -119,0 +119,0 @@ // return;

const {ObjectId} = require("mongodb");
const {replaceArray} = require("./utils.crud.js")
const {searchData, sortData} = require("@cocreate/filter")
class CoCreateCrud {

@@ -14,9 +16,11 @@ constructor(wsManager, dbClient) {

if (this.wsManager) {
this.wsManager.on('createDocument', (socket, data, socketInfo) => this.createDocument(socket, data, socketInfo));
this.wsManager.on('readDocument', (socket, data, socketInfo) => this.readDocument(socket, data, socketInfo))
this.wsManager.on('updateDocument', (socket, data, socketInfo) => this.updateDocument(socket, data, socketInfo))
this.wsManager.on('deleteDocument', (socket, data, socketInfo) => this.deleteDocument(socket, data, socketInfo))
this.wsManager.on('createCollection', (socket, data, socketInfo) => this.createCollection(socket, data, socketInfo));
this.wsManager.on('updateCollection', (socket, data, socketInfo) => this.updateCollection(socket, data, socketInfo))
this.wsManager.on('deleteCollection', (socket, data, socketInfo) => this.deleteCollection(socket, data, socketInfo))
this.wsManager.on('createDocument', (socket, data) => this.createDocument(socket, data))
this.wsManager.on('readDocument', (socket, data) => this.readDocument(socket, data))
this.wsManager.on('updateDocument', (socket, data) => this.updateDocument(socket, data))
this.wsManager.on('deleteDocument', (socket, data) => this.deleteDocument(socket, data))
this.wsManager.on('readDocuments', (socket, data) => this.readDocuments(socket, data))
this.wsManager.on('createCollection', (socket, data) => this.createCollection(socket, data))
this.wsManager.on('updateCollection', (socket, data) => this.updateCollection(socket, data))
this.wsManager.on('deleteCollection', (socket, data) => this.deleteCollection(socket, data))
this.wsManager.on('readCollections', (socket, data) => this.readCollections(socket, data))
}

@@ -26,18 +30,19 @@ }

/** Create Document **/
async createDocument(socket, req_data, socketInfo){
async createDocument(socket, data){
const self = this;
if(!req_data.data) return;
if(!data.data) return;
try{
const db = this.dbClient.db(req_data['organization_id']);
const collection = db.collection(req_data["collection"]);
let insertData = replaceArray(req_data.data);
insertData['organization_id'] = req_data['organization_id'];
const db = this.dbClient.db(data['organization_id']);
const collection = db.collection(data["collection"]);
let insertData = replaceArray(data.data);
insertData['organization_id'] = data['organization_id'];
collection.insertOne(insertData, function(error, result) {
if(!error && result){
const response = {...req_data, document_id: `${result.insertedId}`, data: insertData }
self.broadcast(socket, 'createDocument', response, socketInfo)
const response = {...data, document_id: `${result.insertedId}`, data: insertData }
response.data['_id'] = result.insertedId;
self.broadcast(socket, 'createDocument', response)
} else {
self.wsManager.send(socket, 'ServerError', error, socketInfo);
self.wsManager.send(socket, 'ServerError', error);
}

@@ -47,3 +52,3 @@ });

console.log('createDocument error', error);
self.wsManager.send(socket, 'ServerError', 'error', socketInfo);
self.wsManager.send(socket, 'ServerError', 'error');
}

@@ -53,5 +58,5 @@ }

/** Read Document **/
async readDocument(socket, req_data, socketInfo) {
if (!req_data['collection'] || req_data['collection'] == 'null' || typeof req_data['collection'] !== 'string') {
this.wsManager.send(socket, 'ServerError', 'error', socketInfo);
async readDocument(socket, data) {
if (!data['collection'] || data['collection'] == 'null' || typeof data['collection'] !== 'string') {
this.wsManager.send(socket, 'ServerError', 'error');
return;

@@ -62,36 +67,30 @@ }

try {
const db = this.dbClient.db(req_data['organization_id']);
const collection = db.collection(req_data["collection"]);
const db = this.dbClient.db(data['organization_id']);
const collection = db.collection(data["collection"]);
const query = {
"_id": new ObjectId(req_data["document_id"])
};
if (req_data['organization_id']) {
query['organization_id'] = req_data['organization_id'];
const {query, sort} = this.getFilters(data);
if (data['organization_id']) {
query['organization_id'] = data['organization_id'];
}
collection.find(query).toArray(function(error, result) {
collection.find(query).sort(sort).toArray(function(error, result) {
if (!error && result && result.length > 0) {
let tmp = result[0];
if (req_data['exclude_fields']) {
req_data['exclude_fields'].forEach(function(field) {
delete tmp[field];
})
}
if (req_data.data) {
// ToDo: returns values of defined names
if (data.returnDocument == false && data.data) {
let resp = {};
resp['_id'] = tmp['_id']
req_data.data.forEach((f) => resp[f] = tmp[f])
data.data.forEach((f) => resp[f] = tmp[f])
tmp = resp;
}
self.wsManager.send(socket, 'readDocument', { ...req_data, data: tmp }, socketInfo);
data.data = tmp
self.wsManager.send(socket, 'readDocument', data);
} else {
self.wsManager.send(socket, 'readDocument error', req_data, socketInfo);
self.wsManager.send(socket, 'readDocument error', data);
}
});
} catch (error) {
console.log('readDocument error', error, req_data);
self.wsManager.send(socket, 'ServerError', 'error', socketInfo);
console.log('readDocument error', error, data);
self.wsManager.send(socket, 'ServerError', 'error');
}

@@ -101,85 +100,60 @@ }

/** Update Document **/
async updateDocument(socket, req_data, socketInfo) {
async updateDocument(socket, data) {
const self = this;
try {
const db = this.dbClient.db(req_data['organization_id']);
const collection = db.collection(req_data["collection"]);
let objId = new ObjectId();
try {
if (req_data["document_id"]) {
objId = new ObjectId(req_data["document_id"]);
}
} catch (err) {
console.log(err);
}
try {
let {query, sort} = this.getFilters(data);
if (data['data'] && data['data']['_id'])
delete data['data']['_id']
if (req_data['data'] && req_data['data']['_id'])
delete req_data['data']['_id']
const query = {"_id": objId };
let update = {}, projection = {};
if( typeof req_data['data'] === 'object' ) {
update['$set'] = {}
for (const [key, value] of Object.entries(replaceArray(req_data['data']))) {
let val;
let valueType = typeof value;
switch(valueType) {
case 'string':
val = value
break;
case 'number':
val = Number(value)
break;
case 'object':
if (Array.isArray(value))
val = new Array(...value)
else
val = new Object(value)
break;
default:
val = value
}
update['$set'][key] = val
}
update['$set']['organization_id'] = req_data['organization_id'];
let update = {}, projection = {}, returnNewDocument = false;
if (data.data) {
update['$set'] = this.valueTypes(data.data)
update['$set']['organization_id'] = data['organization_id'];
if (update['$set']['_id'])
delete update['$set']['_id']
Object.keys(update['$set']).forEach(x => {
projection[x] = 1
})
}
if( data['deleteName'] ) {
update['$unset'] = replaceArray(data['deleteName']);
}
if( req_data['deleteName'] ) {
update['$unset'] = replaceArray(req_data['deleteName']);
}
if( req_data['updateName'] ) {
update['$rename'] = replaceArray(req_data['updateName'])
if( data['updateName'] ) {
update['$rename'] = replaceArray(data['updateName'])
for (const [key, value] of Object.entries(update['$rename'])) {
let newValue = replaceArray({[value]: value})
let oldkey = key;
for (const [key] of Object.entries(newValue)) {
update['$rename'][oldkey] = key
if (/\.([0-9]*)/g.test(key) || /\[([0-9]*)\]/g.test(value)) {
console.log('key is array', /\[([0-9]*)\]/g.test(value), /\.([0-9]*)/g.test(key))
} else {
let newValue = replaceArray({[value]: value})
let oldkey = key;
for (const [key] of Object.entries(newValue)) {
update['$rename'][oldkey] = key
}
}
}
returnNewDocument == true
}
collection.updateOne( query, update, {
upsert: req_data.upsert || false,
const db = this.dbClient.db(data['organization_id']);
const collection = db.collection(data["collection"]);
collection.findOneAndUpdate( query, update, {
returnOriginal: false,
returnNewDocument: returnNewDocument || false,
upsert: data.upsert || false,
projection: projection,
}
).then((error, result) => {
if (!error) {
let response = { ...req_data, data: update['$set'] };
self.broadcast(socket, 'updateDocument', response, socketInfo)
).then((result) => {
if (result) {
update['$set']['_id'] = data.data._id || data.document_id
data.data = update['$set']
self.broadcast(socket, 'updateDocument', data)
} else {
self.wsManager.send(socket, 'ServerError', error, socketInfo);
self.wsManager.send(socket, 'ServerError', error);
}
}).catch((error) => {
console.log('error', error)
self.wsManager.send(socket, 'ServerError', error, socketInfo);
self.wsManager.send(socket, 'ServerError', error);
});

@@ -189,3 +163,3 @@

console.log(error)
self.wsManager.send(socket, 'updateDocumentError', error, socketInfo);
self.wsManager.send(socket, 'updateDocumentError', error);
}

@@ -195,10 +169,10 @@ }

/** Delete Document **/
async deleteDocument(socket, req_data, socketInfo) {
async deleteDocument(socket, data) {
const self = this;
try {
const db = this.dbClient.db(req_data['organization_id']);
const collection = db.collection(req_data["collection"]);
const db = this.dbClient.db(data['organization_id']);
const collection = db.collection(data["collection"]);
const query = {
"_id": new ObjectId(req_data["document_id"])
"_id": new ObjectId(data["document_id"])
};

@@ -208,6 +182,5 @@

if (!error) {
let response = { ...req_data }
self.broadcast(socket, 'deleteDocument', response, socketInfo)
self.broadcast(socket, 'deleteDocument', data)
} else {
self.wsManager.send(socket, 'ServerError', error, socketInfo);
self.wsManager.send(socket, 'ServerError', error);
}

@@ -217,18 +190,45 @@ })

console.log(error);
self.wsManager.send(socket, 'ServerError', 'error', socketInfo);
self.wsManager.send(socket, 'ServerError', 'error');
}
}
async readDocuments(socket, data) {
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
const self = this;
try {
const db = this.dbClient.db(data['organization_id']);
const collection = db.collection(data["collection"]);
let {query, sort} = this.getFilters(data);
collection.find(query).sort(sort).toArray(function(error, result) {
if (result) {
data['data'] = searchData(result, data.filter)
self.wsManager.send(socket, 'readDocuments', data );
} else {
console.log(error)
self.wsManager.send(socket, 'ServerError', error);
}
})
} catch (error) {
console.log('readDocuments error', error);
this.wsManager.send(socket, 'ServerError', 'error');
}
}
/** Create Collection **/
async createCollection(socket, req_data, socketInfo) {
async createCollection(socket, data) {
const self = this;
try {
const db = this.dbClient.db(req_data['organization_id']);
db.createCollection(req_data.collection, function(error, result) {
const db = this.dbClient.db(data['organization_id']);
db.createCollection(data.collection, function(error, result) {
if (!error) {
let response = { ...req_data }
self.broadcast(socket, 'createCollection', response, socketInfo)
self.broadcast(socket, 'createCollection', data)
} else {
self.wsManager.send(socket, 'ServerError', error, socketInfo);
self.wsManager.send(socket, 'ServerError', error);
}

@@ -238,3 +238,3 @@ })

console.log(error);
self.wsManager.send(socket, 'ServerError', 'error', socketInfo);
self.wsManager.send(socket, 'ServerError', 'error');
}

@@ -244,14 +244,13 @@ }

/** Update Collection **/
async updateCollection(socket, req_data, socketInfo) {
async updateCollection(socket, data) {
const self = this;
try {
const db = this.dbClient.db(req_data['organization_id']);
const collection = db.collection(req_data["collection"]);
collection.rename(req_data.target, function(error, result) {
const db = this.dbClient.db(data['organization_id']);
const collection = db.collection(data["collection"]);
collection.rename(data.target, function(error, result) {
if (!error) {
let response = { ...req_data }
self.broadcast(socket, 'updateCollection', response, socketInfo)
self.broadcast(socket, 'updateCollection', data)
} else {
self.wsManager.send(socket, 'ServerError', error, socketInfo);
self.wsManager.send(socket, 'ServerError', error);
}

@@ -261,3 +260,3 @@ })

console.log(error);
self.wsManager.send(socket, 'ServerError', 'error', socketInfo);
self.wsManager.send(socket, 'ServerError', 'error');
}

@@ -267,14 +266,13 @@ }

/** Delete Collection **/
async deleteCollection(socket, req_data, socketInfo) {
async deleteCollection(socket, data) {
const self = this;
try {
const db = this.dbClient.db(req_data['organization_id']);
const collection = db.collection(req_data["collection"]);
const db = this.dbClient.db(data['organization_id']);
const collection = db.collection(data["collection"]);
collection.drop( function(error, result) {
if (!error) {
let response = { ...req_data }
self.broadcast(socket, 'deleteCollection', response, socketInfo)
self.broadcast(socket, 'deleteCollection', data)
} else {
self.wsManager.send(socket, 'ServerError', error, socketInfo);
self.wsManager.send(socket, 'ServerError', error);
}

@@ -284,12 +282,157 @@ })

console.log(error);
self.wsManager.send(socket, 'ServerError', 'error', socketInfo);
self.wsManager.send(socket, 'ServerError', 'error');
}
}
broadcast(socket, component, response, socketInfo) {
this.wsManager.broadcast(socket, response.namespace || response['organization_id'], response.room, component, response, socketInfo);
async readCollections(socket, data) {
try {
const self = this;
data['collection'] = 'collections'
let {query, sort} = this.getFilters(data);
const db = this.dbClient.db(data['organization_id']);
db.listCollections(query).toArray(function(error, result) {
if (!error && result && result.length > 0) {
data.data = sortData(result, sort)
self.wsManager.send(socket, 'readCollections', data);
}
})
} catch(error) {
console.log('readCollections error', error);
this.wsManager.send(socket, 'ServerError', 'error');
}
}
getFilters(data) {
let query = {}, sort = {}
data.filter = {
query: [],
sort: [],
search: {
value: [],
type: "or"
},
startIndex: 0,
...data.filter
};
if (data.filter) {
query = this.createQuery(data['filter'].query);
if (data["document_id"]) {
query['_id'] = ObjectId(data["document_id"]);
}
if (data.filter.sort)
data.filter.sort.forEach((order) => {
sort[order.name] = order.type
});
}
return {query, sort}
}
createQuery(filters, data) {
let query = new Object();
filters.forEach((item) => {
if (!item.name) {
return;
}
var key = item.name;
if (!query[key]) {
query[key] = {};
}
if (item.name == "_id")
item.value = ObjectId(item.value)
switch (item.operator) {
case '$contain':
var in_values = [];
item.value.forEach(function(v) {
in_values.push(new RegExp(".*" + v + ".*", "i"));
});
query[key] = {$in : in_values }
break;
case '$range':
if (item.value[0] !== null && item.value[1] !== null) {
query[key] = {$gte: item.value[0], $lte: item.value[1]};
} else if (item.value[0] !== null) {
query[key] = {$gte: item.value[0]};
} else if (item.value[1] !== null) {
query[key] = {$lte: item.value[1]};
}
break;
case '$eq':
case '$ne':
case '$lt':
case '$lte':
case '$gt':
case '$gte':
query[key][item.operator] = item.value[0] || item.value;
break;
case '$in':
case '$nin':
query[key][item.operator] = item.value;
break;
case '$geoWithin':
try {
let value = JSON.parse(item.value);
if (item.type) {
query[key]['$geoWithin'] = {
[item.type]: value
}
}
} catch(e) {
console.log('geowithin error');
}
break;
}
})
//. global search
//. we have to set indexes in text fields ex: db.chart.createIndex({ "$**": "text" })
// if (data['searchKey']) {
// query["$text"] = {$search: "\"Ni\""};
// }
return query;
}
valueTypes(data) {
let object = {}
if( typeof data === 'object' ) {
// update['$set'] = {}
for (const [key, value] of Object.entries(replaceArray(data))) {
let val;
let valueType = typeof value;
switch(valueType) {
case 'string':
val = value
break;
case 'number':
val = Number(value)
break;
case 'object':
if (Array.isArray(value))
val = new Array(...value)
else
val = new Object(value)
break;
default:
val = value
}
object[key] = val
}
return object;
}
}
broadcast(socket, component, response) {
this.wsManager.broadcast(socket, component, response);
process.emit('changed-document', response)
}
}
module.exports = CoCreateCrud;

@@ -10,3 +10,3 @@ class CoCreateDatabases {

if (this.wsManager) {
this.wsManager.on('readDatabases', (socket, data, socketInfo) => this.readDatabases(socket, data, socketInfo));
this.wsManager.on('readDatabases', (socket, data) => this.readDatabases(socket, data));
}

@@ -16,3 +16,3 @@ }

/** Create Document **/
async readDatabases(socket, req_data, socketInfo){
async readDatabases(socket, req_data){
const self = this;

@@ -34,3 +34,3 @@ // if(!req_data.data) return;

console.log('readDatabases error', error);
self.wsManager.send(socket, 'ServerError', 'error', socketInfo);
self.wsManager.send(socket, 'ServerError', 'error');
}

@@ -40,4 +40,4 @@ }

broadcast(socket, component, response, socketInfo) {
this.wsManager.broadcast(socket, response.namespace || response['organization_id'], response.room, component, response, socketInfo);
broadcast(socket, component, response) {
this.wsManager.broadcast(socket, component, response);
process.emit('changed-document', response)

@@ -44,0 +44,0 @@ }

'use strict';
const crud = require('./crud');
const list = require('./list');
const backup = require('./backup');

@@ -17,3 +16,2 @@ const database = require('./database');

new crud(this.wsManager, this.dbClient);
new list(this.wsManager, this.dbClient);
new backup(this.wsManager, this.dbClient);

@@ -20,0 +18,0 @@ new database(this.wsManager, this.dbClient);

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc