RouteInjector/route-injector

View on GitHub
lib/engine/routeinjector/rest/delete.js

Summary

Maintainability
D
1 day
Test Coverage
var Q = require('q');
var statusCode = require('http-status-codes');
var utils = require('../utils');
var _ = require('lodash');
var injector = require('../../../');
var log = injector.log;
var mongoose = injector.mongoose;

module.exports.deleteByField = function (Model) {
    return function (req, res) {
        var gConfig = Model.injector();
        var field = gConfig.id;
        var config = utils.getConfigByProfile(gConfig.delete, req);
        var isTypeRaw = (req.query.type && req.query.type == "raw");//Special for backoffice
        var documentDb;

        (config.pre) ? utils.runPreCallbacks(config.pre, Model, req, res, mainDeleteFn) : mainDeleteFn();

        function mainDeleteFn() {
            //ID CHECKING
            if (gConfig.id == "_id" && !mongoose.Types.ObjectId.isValid(req.params[gConfig.id]) && !isTypeRaw) {
                res.statusCode = statusCode.NOT_FOUND;
                res.json("Document not found. Invalid mongoose id");
                return res.end();
            }

            var fieldItem = req.params[field];
            var query = {};
            _.assign(query, config.mongo.query);
            query[field] = fieldItem;

            //Shard key insertion if shard is enabled
            if (gConfig.shard && gConfig.shard.shardKey && gConfig.shardKey != "" && req.query[gConfig.shard.shardKey] != undefined) {
                query[gConfig.shard.shardKey] = req.query[gConfig.shard.shardKey];
            }

            var promise;
            if (isTypeRaw) {
                promise = Model.findOne({_id: fieldItem}, {}).lean().exec();
            } else {
                promise = Model.findOne(query, config.mongo.projection).lean().exec();
            }
            var promises = [];
            promises.push(check);
            promises.push(remove);
            promises.push(dispatcher);
            promises = promises.concat(config.post);
            promises.push(ok);

            promises.reduce(Q.when, promise).catch(error);

            function check(doc) {
                var defer = Q.defer();
                if (!doc) {
                    res.statusCode = statusCode.NOT_FOUND;
                    defer.reject('Document not found');
                } else {
                    defer.resolve(doc);
                }
                return defer.promise;
            }

            function remove(doc) {
                //return Model.remove({_id: doc._id}).exec();
                var defer = Q.defer();
                Model.findOne({_id: doc._id}, function (err, doc) {
                    if (err) {
                        res.statusCode = statusCode.INTERNAL_SERVER_ERROR;
                        defer.reject('Internal server error');
                    } else if (!doc) {
                        res.statusCode = statusCode.NOT_FOUND;
                        defer.reject('Document not found');
                    } else {
                        doc.remove(function (err, doc) {
                            if (err) {
                                res.statusCode = statusCode.INTERNAL_SERVER_ERROR;
                                defer.reject('Internal server error');
                            } else if (!doc) {
                                res.statusCode = statusCode.NOT_FOUND;
                                defer.reject('Document not found');
                            } else {
                                defer.resolve(doc);
                            }
                        });
                    }
                });

                return defer.promise;
            }

            function error(err) {
                log.error(err);
                utils.runErrorCallbacks(config, req, err);
                if (res.statsCode == statusCode.OK) {
                    res.statusCode = statusCode.INTERNAL_SERVER_ERROR;
                }
                res.json(err.message);
                return res.end();
            }

            function dispatcher(doc) {
                if (!doc)
                    res.statusCode = statusCode.NOT_FOUND;
                else
                    res.statusCode = statusCode.NO_CONTENT;
                return doc;
            }

            function ok(doc) {
                documentDb = doc;
                return res.end();
            }

            res.on('finish', function () {
                if (config.postsend)
                    config.postsend.forEach(function (fn) {
                        fn(documentDb, req);
                    });
            });
        }
    }
};