Skip to content

Instantly share code, notes, and snippets.

@aantipov
Created March 15, 2015 19:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aantipov/cabf488597ac834d1ad8 to your computer and use it in GitHub Desktop.
Save aantipov/cabf488597ac834d1ad8 to your computer and use it in GitHub Desktop.
Examle of a controller from my sails.js project
'use strict';
/**
* Module dependencies
*/
var actionUtil = require('sails/lib/hooks/blueprints/actionUtil');
var util = require('util');
/**
* HikeController
*
* @description :: Server-side logic for managing hikes
* @help :: See http://links.sailsjs.org/docs/controllers
*/
module.exports = {
_config: {
populate: true
},
saveImage: function (req, res) {
var hikeId = req.param('hike'),
tmpImagePath = req.param('image'),
Model = sails.models.hike;
if (!hikeId || !tmpImagePath) {
return res.badRequest('Invalid params values');
}
// Check that hike exists.
Model.findOne(hikeId).exec(function (err, hike) {
if (err) {
return res.negotiate(err);
}
if (hike === undefined) {
return res.badRequest('Hike was not found');
}
var imageVersion = parseInt(hike.imageVersion, 10);
if (isNaN(imageVersion)) {
imageVersion = 0;
}
// Store image at Amazon S3
return Model.saveImage(hikeId, tmpImagePath, function (err) {
if (err) {
return res.negotiate(err);
}
// Update Hike's hasImage property & image version.
Model.update(hikeId, {hasImage: true, imageVersion: ++imageVersion}).exec(function updated(err, hike) {
if (err) {
res.negotiate(err);
}
res.ok(hike[0]);
});
});
});
},
publish: function (req, res) {
var hikeId = req.param('hike'),
Model = sails.models.hike;
// Get the hike.
Model.findOne(hikeId).exec(function (err, hike) {
if (err) {
return res.negotiate(err);
}
if (hike === undefined) {
return res.badRequest('Hike was not found');
}
// Only author can publish hike.
if (hike.author !== req.user.id) {
return res.forbidden();
}
if (hike.state !== 'PENDING') {
return res.badRequest('Hike can be published from \'PENDING\' state only');
}
// Update Hike's hasImage property & image version.
Model.update(hikeId, {state: 'PUBLISHED'}).exec(function (err, hike) {
if (err) {
res.negotiate(err);
}
return res.ok(hike[0]);
});
});
},
unpublish: function (req, res) {
var hikeId = req.param('hike'),
Model = sails.models.hike;
// Get the hike.
Model.findOne(hikeId).exec(function (err, hike) {
if (err) {
return res.negotiate(err);
}
if (hike === undefined) {
return res.badRequest('Hike was not found');
}
// Only author can publish hike.
if (hike.author !== req.user.id) {
return res.forbidden();
}
if (hike.state !== 'PUBLISHED') {
return res.badRequest('Hike can be unpublished from \'PUBLISHED\' state only');
}
// Update Hike's hasImage property & image version.
Model.update(hikeId, {state: 'PENDING'}).exec(function (err, hike) {
if (err) {
res.negotiate(err);
}
return res.ok(hike[0]);
});
});
},
archive: function (req, res) {
var hikeId = req.param('hike'),
Model = sails.models.hike;
// Get the hike.
Model.findOne(hikeId).exec(function (err, hike) {
if (err) {
return res.negotiate(err);
}
if (hike === undefined) {
return res.badRequest('Hike was not found');
}
// Only author can publish hike.
if (hike.author !== req.user.id) {
return res.forbidden();
}
if (hike.state !== 'PENDING' && hike.state !== 'PUBLISHED') {
return res.badRequest('Hike can be archived from \'PENDING\' and \'PUBLISHED\' state only');
}
// Update Hike's hasImage property & image version.
Model.update(hikeId, {state: 'ARCHIVED'}).exec(function (err, hike) {
if (err) {
res.negotiate(err);
}
return res.ok(hike[0]);
});
});
},
renew: function (req, res) {
var hikeId = req.param('hike'),
Model = sails.models.hike;
// Get the hike.
Model.findOne(hikeId).exec(function (err, hike) {
if (err) {
return res.negotiate(err);
}
if (hike === undefined) {
return res.badRequest('Hike was not found');
}
// Only author can publish hike.
if (hike.author !== req.user.id) {
return res.forbidden();
}
if (hike.state !== 'ARCHIVED') {
return res.badRequest('Hike can be renewed from \'ARCHIVED\' state only');
}
// Update Hike's hasImage property & image version.
Model.update(hikeId, {state: 'PENDING'}).exec(function (err, hike) {
if (err) {
res.negotiate(err);
}
return res.ok(hike[0]);
});
});
},
trash: function (req, res) {
var hikeId = req.param('hike'),
Model = sails.models.hike;
// Get the hike.
Model.findOne(hikeId).exec(function (err, hike) {
if (err) {
return res.negotiate(err);
}
if (hike === undefined) {
return res.badRequest('Hike was not found');
}
// Only author can publish hike.
if (hike.author !== req.user.id) {
return res.forbidden();
}
if (hike.state !== 'ARCHIVED') {
return res.badRequest('Hike can be deleted from \'ARCHIVED\' state only');
}
// Update Hike's hasImage property & image version.
Model.update(hikeId, {state: '_TRASHED'}).exec(function (err, hike) {
if (err) {
res.negotiate(err);
}
return res.ok(hike[0]);
});
});
},
/**
* Override default method to exclude TRASHED records.
*
* @param req
* @param res
*/
findOne: function (req, res) {
var Model = actionUtil.parseModel(req);
var pk = actionUtil.requirePk(req);
var query = Model.findOne(pk)
.where({state: {'!': 'TRASHED'}});
query = actionUtil.populateEach(query, req);
query.exec(function found(err, matchingRecord) {
if (err) return res.serverError(err);
if (!matchingRecord) return res.notFound('No record found with the specified `id`.');
if (sails.hooks.pubsub && req.isSocket) {
Model.subscribe(req, matchingRecord);
actionUtil.subscribeDeep(req, matchingRecord);
}
res.ok(matchingRecord);
});
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment