Skip to content

Instantly share code, notes, and snippets.

@hinok
Created January 10, 2015 03:06
Show Gist options
  • Save hinok/dbf1d59a9ad5a3c92133 to your computer and use it in GitHub Desktop.
Save hinok/dbf1d59a9ad5a3c92133 to your computer and use it in GitHub Desktop.

Revisions

  1. hinok created this gist Jan 10, 2015.
    73 changes: 73 additions & 0 deletions find.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,73 @@
    /**
    * Module dependencies
    */
    var util = require('util'),
    actionUtil = require('../../node_modules/sails/lib/hooks/blueprints/actionUtil');


    /**
    * Find Records
    *
    * get /:modelIdentity
    * * /:modelIdentity/find
    *
    * An API call to find and return model instances from the data adapter
    * using the specified criteria. If an id was specified, just the instance
    * with that unique id will be returned.
    *
    * Optional:
    * @param {Object} where - the find criteria (passed directly to the ORM)
    * @param {Integer} limit - the maximum number of records to send back (useful for pagination)
    * @param {Integer} skip - the number of records to skip (useful for pagination)
    * @param {String} sort - the order of returned records, e.g. `name ASC` or `age DESC`
    * @param {String} callback - default jsonp callback param (i.e. the name of the js function returned)
    */

    module.exports = function findRecords(req, res) {

    // Look up the model
    var Model = actionUtil.parseModel(req);

    // If an `id` param was specified, use the findOne blueprint action
    // to grab the particular instance with its primary key === the value
    // of the `id` param. (mainly here for compatibility for 0.9, where
    // there was no separate `findOne` action)
    if (actionUtil.parsePk(req)) {
    return require('./findOne')(req, res);
    }

    // Lookup for records that match the specified criteria
    var query = Model.find()
    .where(actionUtil.parseCriteria(req))
    .limit(actionUtil.parseLimit(req))
    .skip(actionUtil.parseSkip(req))
    .sort(actionUtil.parseSort(req));
    // TODO: .populateEach(req.options);
    query = actionUtil.populateEach(query, req);
    query.exec(function found(err, matchingRecords) {
    if (err) return res.serverError(err);

    // Only `.watch()` for new instances of the model if
    // `autoWatch` is enabled.
    if (req._sails.hooks.pubsub && req.isSocket) {
    Model.subscribe(req, matchingRecords);
    if (req.options.autoWatch) {
    Model.watch(req);
    }
    // Also subscribe to instances of all associated models
    _.each(matchingRecords, function(record) {
    actionUtil.subscribeDeep(req, record);
    });
    }

    Model.count(actionUtil.parseCriteria(req)).exec(function(error, total) {
    if (err) {
    return res.serverError(err);
    }

    res.set('Total-Count', total);
    res.ok(matchingRecords);
    });

    });
    };