Robert
Robert

Reputation: 1266

Write generic query function for mongodb REST API

I'm using node.js express MongoDB and Mongoose to create rest api for my app. I'm wondering that there is any kind of type to replace such code like below for more generic? I do not want to pass all params all the time, but in only certain time. The most of time I just want to pass a part of them. Normally in Java, I create builder for such stuff, but I don't know any tricks for Javascript :)

exports.getMessages = function (req, res) {

    var from = req.query.from;
    var deleted = req.query.deleted;
    var readed = req.query.readed;

    if(from && deleted && readed) {
        Message.find({to: req.user.email, from: from, deleted: deleted, readed: readed}, function(err, messages) {
            if(err) {
                res.send(err);
            }
            res.json(messages);
        })
    } else if(from && deleted) {
        Message.find({to: req.user.email, from: from, deleted: deleted}, function(err, messages) {
            if(err) {
                res.send(err);
            }
            res.json(messages);
        })
    } else if (from && readed) {
        Message.find({to: req.user.email, from: from, readed: readed}, function (err, messages) {
            if(err) {
                res.send(err);
            }
            res.json(messages);
        });
    } else if(deleted && readed) {
        Message.find({to: req.user.email, deleted: deleted, readed: readed}, function (err, messages) {
            if(err) {
                res.send(err);
            }
            res.json(messages);
        });
    } else if(deleted){
        Message.find({to: req.user.email, deleted: deleted}, function(err, messages) {
            if(err) {
                req.send(err);
            }
            res.json(messages);
        })
    } else if(readed){
        Message.find({to: req.user.email, readed: readed}, function(err, messages) {
            if(err) {
                req.send(err);
            }
            res.json(messages);
        });
    } else if(from){
        Message.find({to: req.user.email, from: from}, function(err, messages) {
            if(err) {
                req.send(err);
            }
            res.json(messages);
        });
    }
};

Upvotes: 1

Views: 1193

Answers (1)

Jakeii
Jakeii

Reputation: 1273

Just build your find query object conditionally, i think this is as generic as it can get, just add to allowedParams as needed

exports.getMessages = function (req, res) {

    var allowedParams = [
        'deleted',
        'readed',
        'from'
    ];

    var query = {
        to: req.user.email
    };

    for(param in req.query) {
        if(allowedParams.indexOf(param) !== -1) {
            query[param] = req.query[param];
        }
    }

    Message.find(query, function (err, messages) {
        if(err) {
            res.send(err);
        }
        res.json(messages);
    });
}

Upvotes: 1

Related Questions