UNPKG

@ords/modules

Version:

Modules for ords-core microservices based upon proposals

255 lines (254 loc) 9.52 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const core_1 = require("@ords/core"); const Mongo = require("mongodb"); /** * MongoDB database connections * Root: db */ class DatabaseMongo { create(request, mH, pH) { // send operation flag back mH.next([core_1.proposals.main.flag.FLAGSEND, core_1.proposals.main.flag.dataType.RAW]); mH.complete(); let op = { resource: undefined, data: {}, query: {} }; // get objects from request request.package.subscribe((args) => { // save the arguments op[args[0]] = args[1]; // send back errors and perform action }, pH.error, () => { // replace object id in data if (op.data.id) { op.data.id = new Mongo.ObjectID(op.data.id); } // if query is emtpy then dont look for any findone if (Object.keys(op.query).length) { // replace object id in query if (op.query.id) { op.query._id = new Mongo.ObjectID(op.query.id); delete op.query.id; } this.db.collection(op.resource).findOne(op.query).catch(pH.error).then((result) => { // check if user do not exists if (result === null) { this.db.collection(op.resource).insertOne(op.data).catch(pH.error).then((result) => { // send back inserted id pH.next([0, result.insertedId]); pH.complete(); }); } else { // send back no results were found pH.next([0, 0]); pH.complete(); } }); } else { this.db.collection(op.resource).insertOne(op.data).catch(pH.error).then((result) => { // send back inserted id pH.next([0, result.insertedId]); pH.complete(); }); } }); } read(request, mH, pH) { // send operation flag back mH.next([core_1.proposals.main.flag.FLAGSEND, core_1.proposals.main.flag.dataType.MULTIPLE]); mH.complete(); let op = { resource: '', query: {} }; // get objects from request request.package.subscribe((args) => { // save the arguments op[args[0]] = args[1]; // send back errors and perform action }, pH.error, () => { // replace object id in query if (op.query.id) { op.query._id = new Mongo.ObjectID(op.query.id); delete op.query.id; } let options = {}; // get limit from query if (op.limit) { options.limit = op.limit; delete op.limit; } // get sort from query if (op.sort) { options.sort = op.sort; delete op.sort; } // get elements from query if (op.elements) { options.fields = op.elements; delete op.elements; } // we are not ready for joins yet if (op.joins) { pH.error(new Error('Joins are not yet supported')); } else { // cast _id to object id! let curser = this.db.collection(op.resource).find(op.query, options); // how many documents found let counter = 0; // loop throughout documents found let loop = () => { // check if next exsists curser.hasNext((err, flag) => { // check if error if (err === null) { // check if anything is left if (flag) { // then go and get the doc curser.next((innerErr, doc) => { // if error send it back if (err === null) { counter++; // map out mongodb doc.id = doc._id; delete doc._id; pH.next([counter, doc]); loop(); } else { pH.error(innerErr); } }); // if last record send back result } else { pH.complete(); } // if any report back } else { pH.error(err); } }); }; // start loop loop(); } }); } update(request, mH, pH) { // send operation flag back mH.next([core_1.proposals.main.flag.FLAGSEND, core_1.proposals.main.flag.dataType.RAW]); mH.complete(); let op = { resource: '', data: {}, query: {} }; // get objects from request request.package.subscribe((args) => { // save the arguments op[args[0]] = args[1]; // send back errors and perform action }, pH.error, () => { // replace object id in data if (op.data.id) { op.data._id = new Mongo.ObjectID(op.data.id); delete op.data.id; } // replace object id in query if (op.query.id) { op.query._id = new Mongo.ObjectID(op.query.id); delete op.query.id; } this.db.collection(op.resource).replaceOne(op.query, op.data).catch(pH.error).then((result) => { // send back number of updated pH.next([0, result.upsertedId]); pH.complete(); }); }); } patch(request, mH, pH) { // send operation flag back mH.next([core_1.proposals.main.flag.FLAGSEND, core_1.proposals.main.flag.dataType.RAW]); mH.complete(); let op = { resource: '', data: {}, query: {} }; // get objects from request request.package.subscribe((args) => { // save the arguments op[args[0]] = args[1]; // send back errors and perform action }, pH.error, () => { // replace object id in query if (op.data.id) { op.data._id = new Mongo.ObjectID(op.data.id); delete op.data.id; } // replace object id in query if (op.query.id) { op.query._id = new Mongo.ObjectID(op.query.id); delete op.query.id; } this.db.collection(op.resource).updateOne(op.query, op.data).catch(pH.error).then((result) => { // send back number of patched pH.next([0, result.upsertedId]); pH.complete(); }); }); } delete(request, mH, pH) { // send operation flag back mH.next([core_1.proposals.main.flag.FLAGSEND, core_1.proposals.main.flag.dataType.RAW]); mH.complete(); let op = { resource: '', query: {} }; // get objects from request request.package.subscribe((args) => { // save the arguments op[args[0]] = args[1]; // send back errors and perform action }, pH.error, () => { // replace object id in query if (op.query.id) { op.query._id = new Mongo.ObjectID(op.query.id); delete op.query.id; } this.db.collection(op.resource) .deleteOne(op.query).catch(pH.error).then((res) => { // send back number of removed document pH.next([0, res.deletedCount]); pH.complete(); }); }); } constructor(ms, connectionstring) { // connect first Mongo.MongoClient.connect(connectionstring, (err, db) => { // throw error cannot start if (err) { throw err; } // add the read operations to the instance let root = 'db'; this.db = db; ms.addMicroService(root, 'read', this.read.bind(this)); ms.addMicroService(root, 'create', this.create.bind(this)); ms.addMicroService(root, 'update', this.update.bind(this)); ms.addMicroService(root, 'delete', this.delete.bind(this)); ms.addMicroService(root, 'patch', this.patch.bind(this)); }); } } exports.DatabaseMongo = DatabaseMongo;