api.js

Generated by CoffeeScript 1.9.1

(function() {
  var auth, conf, group, ld, pad, passport, user;

  ld = require('lodash');

  passport = require('passport');

  conf = require('./configuration.js');

  user = require('./model/user.js');

  group = require('./model/group.js');

  pad = require('./model/pad.js');

  auth = require('./auth.js');

  module.exports = (function() {
    var api, authAPI, configurationAPI, fn, groupAPI, padAPI, userAPI;
    api = {};
    api.initialRoute = '/mypads/api/';
    api.init = function(app) {
      auth.init(app);
      authAPI(app);
      configurationAPI(app);
      userAPI(app);
      groupAPI(app);
      return padAPI(app);
    };
    fn = {};
    fn.get = function(module, req, res) {
      var e;
      try {
        return module.get(req.params.key, function(err, val) {
          if (err) {
            return res.send(404, {
              error: err.message,
              key: req.params.key
            });
          }
          return res.send({
            key: req.params.key,
            value: val
          });
        });
      } catch (_error) {
        e = _error;
        return res.send(400, {
          error: e.message
        });
      }
    };
    fn.set = function(setFn, key, value, req, res) {
      var e;
      try {
        return setFn(function(err, data) {
          if (err) {
            return res.send(400, {
              error: err.message
            });
          }
          return res.send({
            success: true,
            key: key || data._id,
            value: data || value
          });
        });
      } catch (_error) {
        e = _error;
        return res.send(400, {
          error: e.message
        });
      }
    };
    fn.del = function(delFn, req, res) {
      var key;
      key = req.params.key;
      return delFn(key, function(err) {
        if (err) {
          return res.send(404, {
            error: err.message
          });
        }
        return res.send({
          success: true,
          key: key
        });
      });
    };
    fn.ensureAuthentificated = function(req, res, next) {
      if (!req.isAuthenticated() && !req.session.login) {
        return res.send(401, {
          error: 'you must be authenticated'
        });
      } else {
        return next();
      }
    };
    authAPI = function(app) {
      var authRoute;
      authRoute = api.initialRoute + "auth";
      app.post(authRoute + "/login", function(req, res, next) {
        return passport.authenticate('local', function(err, user, info) {
          if (err) {
            return res.send(400, {
              error: err.message
            });
          }
          if (!user) {
            return res.send(400, {
              error: info.message
            });
          }
          return req.login(user, function(err) {
            req.session.login = user.login;
            if (err) {
              return res.send(400, {
                error: err
              });
            }
            return res.send(200, {
              success: true,
              user: ld.omit(user, 'password')
            });
          });
        })(req, res, next);
      });
      return app.get(authRoute + "/logout", function(req, res) {
        if (req.isAuthenticated() || req.session.login) {
          req.logout();
          req.session.destroy();
          return res.send(200, {
            success: true
          });
        } else {
          return res.send(400, {
            error: 'not authenticated'
          });
        }
      });
    };
    configurationAPI = function(app) {
      var _set, confRoute;
      confRoute = api.initialRoute + "configuration";
      app.get(confRoute, fn.ensureAuthentificated, function(req, res) {
        return conf.all(function(err, value) {
          if (err) {
            return res.send(400, {
              error: err
            });
          }
          return res.send({
            value: value
          });
        });
      });
      app.get(confRoute + "/:key", fn.ensureAuthentificated, function(req, res) {
        return conf.get(req.params.key, function(err, value) {
          if (err) {
            return res.send(404, {
              error: err.message,
              key: req.params.key
            });
          }
          return res.send({
            key: req.params.key,
            value: value
          });
        });
      });
      _set = function(req, res) {
        var key, setFn, value;
        key = req.method === 'POST' ? req.body.key : req.params.key;
        value = req.body.value;
        setFn = ld.partial(conf.set, key, value);
        return fn.set(setFn, key, value, req, res);
      };
      app.post(confRoute, fn.ensureAuthentificated, _set);
      app.put(confRoute + "/:key", fn.ensureAuthentificated, _set);
      return app["delete"](confRoute + "/:key", fn.ensureAuthentificated, ld.partial(fn.del, conf.del));
    };
    userAPI = function(app) {
      var _set, userRoute;
      userRoute = api.initialRoute + "user";
      app.get(userRoute + "/:key", fn.ensureAuthentificated, ld.partial(fn.get, user));
      _set = function(req, res) {
        var key, setFn, value;
        value = req.body;
        if (req.method === 'POST') {
          key = req.body.login;
        } else {
          key = req.params.key;
          value.login = key;
          value._id = user.ids[key];
        }
        setFn = ld.partial(user.set, value);
        return fn.set(setFn, key, value, req, res);
      };
      app.post(userRoute, fn.ensureAuthentificated, _set);
      app.put(userRoute + "/:key", fn.ensureAuthentificated, _set);
      return app["delete"](userRoute + "/:key", fn.ensureAuthentificated, ld.partial(fn.del, user.del));
    };
    groupAPI = function(app) {
      var _set, groupRoute;
      groupRoute = api.initialRoute + "group";
      app.get(groupRoute + "/:key", fn.ensureAuthentificated, ld.partial(fn.get, group));
      _set = function(req, res) {
        var setFn;
        setFn = ld.partial(group.set, req.body);
        return fn.set(setFn, req.body._id, req.body, req, res);
      };
      app.post(groupRoute, fn.ensureAuthentificated, _set);
      app.put(groupRoute + "/:key", fn.ensureAuthentificated, _set);
      return app["delete"](groupRoute + "/:key", fn.ensureAuthentificated, ld.partial(fn.del, group.del));
    };
    padAPI = function(app) {
      var _set, padRoute;
      padRoute = api.initialRoute + "pad";
      app.get(padRoute + "/:key", fn.ensureAuthentificated, ld.partial(fn.get, pad));
      _set = function(req, res) {
        var setFn;
        setFn = ld.partial(pad.set, req.body);
        return fn.set(setFn, req.body._id, req.body, req, res);
      };
      app.post(padRoute, fn.ensureAuthentificated, _set);
      app.put(padRoute + "/:key", fn.ensureAuthentificated, _set);
      return app["delete"](padRoute + "/:key", fn.ensureAuthentificated, ld.partial(fn.del, pad.del));
    };
    return api;
  })();

}).call(this);