Skip to content

Instantly share code, notes, and snippets.

@aantipov
Created March 15, 2015 19:05
Show Gist options
  • Select an option

  • Save aantipov/cabf488597ac834d1ad8 to your computer and use it in GitHub Desktop.

Select an option

Save aantipov/cabf488597ac834d1ad8 to your computer and use it in GitHub Desktop.

Revisions

  1. aantipov created this gist Mar 15, 2015.
    259 changes: 259 additions & 0 deletions HikeController.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,259 @@
    '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);
    });
    }
    };