packages feed

harmony-0.1.0.0: templates/server/js/server.tpl

var express = require('express'),
    bodyParser = require('body-parser'),
    mongoose = require('mongoose'),
    app = express(),
    args = process.argv.slice(2);

app.use(bodyParser.json());

mongoose.connect(args[1]);

{{#requiresAuth}}
// User registration and authentication
var UserAutoGeneratedSchema = new mongoose.Schema({
  login : { type: String, required: true, unique: true, index: true, dropDupes: true },
  password: { type: String, required: true },
});

UserAutoGeneratedSchema.set('toJSON', {
  transform: function (doc, ret, options) {
    delete ret._id
    delete ret.__v
    delete ret.password
  }
});

var UserAutoGenerated = mongoose.model('UserAutoGenerated', UserAutoGeneratedSchema);

app.post('/u_auth/register', function (req, res) {
  UserAutoGenerated.create(new UserAutoGenerated(req.body), function(err, obj) {
    if (err) {
      console.log("Error registering: ", err);
      res.status(500).send(err);
      return; 
    }
    res.status(201).send();
   });
});

app.post('/u_auth/:login/:password', function (req, res) {
  UserAutoGenerated.find({ login: req.params.login }, function(err, result) {
      if (err) {
        console.log(err);
        res.status(500).send(err);
        return;
      }
      if (result.length == 0) {
        res.status(401).send('Invalid credentials');
      } else {
        if (result[0].password != req.params.password) {
          res.status(401).send('Invalid credentials');
        } else {
          var t = generateToken(req.params.login)
          addSession(t, req.params.login, function() {
            res.status(200).json({token: t});
          });
        }
      }
  });
});

var SessionAutoGeneratedSchema = new mongoose.Schema({
  token : { type: String, required: true, unique: true, index: true, dropDupes: true },
  login : { type: String, required: true, unique: true, dropDupes: true }
});

var SessionAutoGenerated = mongoose.model('SessionAutoGenerated', SessionAutoGeneratedSchema);

var addSession = function(newToken, referredLogin, callback) {
 SessionAutoGenerated.update({token : newToken}, {login: referredLogin}, {upsert: true}, callback); 
}

var assertSessionCorrect = function(t, res, callback) {
 SessionAutoGenerated.findOne({token: t}, function(err, result) {
   if (err) {
     console.log("Error asserting user token is correct: ", err);
     res.status(500).send(err);
     return;
   }
   if(result == null || result.login == null) {
     console.log("Token " + t + " was not found");
     res.status(401).send("Invalid credentials.");
     return;
  }
   callback(result.login);
 });
}

var generateToken = function(login) {
  //TODO implement
  return login;
}
{{/requiresAuth}}

{{#schema}}
var {{schemaName}}Schema = new mongoose.Schema({
{{#schemaVars}}{{#isList}}
  {{varName}} : { type: [{{#isStruct}}{{varType}}Schema{{/isStruct}}{{^isStruct}}{{varType}}{{/isStruct}}]
               {{/isList}}{{^isList}}
  {{varName}} : { type: {{#isStruct}}{{varType}}Schema{{/isStruct}}{{^isStruct}}{{varType}}{{/isStruct}}
               {{/isList}} {{#isUnique}}, unique : true {{/isUnique}}{{#isKey}}, index: true, dropDupes: true {{/isKey}} {{#isRequired}}, required: true {{/isRequired}} {{#isEnum}}, enum: [{{/isEnum}}{{#isEnum}}{{#values}}'{{value}}',{{/values}}{{/isEnum}}{{#isEnum}}]{{/isEnum}}{{/isStruct}} },
{{/schemaVars}}
});

{{schemaName}}Schema.set('toJSON', {
  transform: function (doc, ret, options) {
    {{^hasKeyField}}ret.id = ret._id{{/hasKeyField}}
    {{#schemaVars}}{{#isHidden}}delete ret.{{varName}};{{/isHidden}}{{/schemaVars}}
    delete ret._id
    delete ret.__v
  }
});

{{^hasKeyField}}
{{schemaName}}Schema.set('toObject', {
  transform : function (doc, ret, options) {
    ret._id = ret.id
    delete ret.id
  }
});
{{/hasKeyField}}

var {{schemaName}} = mongoose.model('{{schemaName}}', {{schemaName}}Schema);

{{/schema}}

{{#schema}}
{{#schemaRoute}}
app.get('{{&value}}{{#requiresAuth}}/:token{{/requiresAuth}}', function(req, res) {
{{#requiresAuth}}
  assertSessionCorrect(req.params.token, res, function(userLogin) {
{{/requiresAuth}}
        {{schemaName}}.find(function(err, result) {
          if (err) {
            res.status(500).send(err);  
          } else {
            res.send(result); 
          }   
         });
{{#requiresAuth}}
});
{{/requiresAuth}}
});

app.get('{{&value}}/:id{{#requiresAuth}}/:token{{/requiresAuth}}', function(req, res) {
  {{^hasKeyField}}
  if (!req.params.id.match(/^[0-9a-fA-F]{24}$/)) {
    res.status(404).send();
    return;
  }
  {{/hasKeyField}}
{{#requiresAuth}}
  assertSessionCorrect(req.params.token, res, function(userLogin) {
{{/requiresAuth}}
        {{schemaName}}.find({ {{#hasKeyField}}{{keyField}}{{/hasKeyField}}{{^hasKeyField}}_id{{/hasKeyField}}: req.params.id }, function(err, result) {
          if (err) {
            res.status(500).send(err);
            return;
            }
          if (result.length == 0) {
            res.status(404).send('Not Found');
          } else {
            res.send(result[0]);
          }
        });
{{#requiresAuth}}
});
{{/requiresAuth}}
});

{{#writable}}
{{^hasKeyField}}
app.post('{{&value}}{{#requiresAuth}}/:token{{/requiresAuth}}', function(req, res) {
{{#requiresAuth}}
  assertSessionCorrect(req.params.token, res, function(userLogin) {
{{/requiresAuth}}
{{#schemaVars}}
{{#isUserLogin}}
req.body.{{varName}} = userLogin;
{{/isUserLogin}}
{{/schemaVars}}
  {{schemaName}}.create(new {{schemaName}}(req.body), function(err, obj) {
    if (err) {
      res.status(500).send(err);
      return;  
    }
    res
      .status(201)
      .json({id : obj._id});
   });
{{#requiresAuth}}
});
{{/requiresAuth}}
});
{{/hasKeyField}}

app.put('{{&value}}/:id{{#requiresAuth}}/:token{{/requiresAuth}}', function(req, res) {
  {{^hasKeyField}}
  if (!req.params.id.match(/^[0-9a-fA-F]{24}$/)) {
    res.status(404).send();
    return;
  }
  {{/hasKeyField}}
{{#requiresAuth}}
  assertSessionCorrect(req.params.token, res, function(userLogin) {
{{/requiresAuth}}
{{#schemaVars}}
{{#isUserLogin}}
req.body.{{varName}} = userLogin;
{{/isUserLogin}}
{{/schemaVars}}
  {{schemaName}}.update({ {{#hasKeyField}}{{keyField}}{{/hasKeyField}}{{^hasKeyField}}_id{{/hasKeyField}} : req.params.id }, req.body, {upsert : true, runValidators : true}, function(err, result) {
    if (err) {
      res.status(500).send(err);
    } else {
      res.status(200).send();
    }
  });
{{#requiresAuth}}
});
{{/requiresAuth}}
});

app.delete('{{&value}}/:id{{#requiresAuth}}/:token{{/requiresAuth}}', function(req, res) {
  {{^hasKeyField}}
  if (!req.params.id.match(/^[0-9a-fA-F]{24}$/)) {
    res.status(404).send();
    return;
  }
  {{/hasKeyField}}
{{#requiresAuth}}
  assertSessionCorrect(req.params.token, res, function(userLogin) {
{{/requiresAuth}}
  {{schemaName}}.remove({ {{#hasKeyField}}{{keyField}}{{/hasKeyField}}{{^hasKeyField}}_id{{/hasKeyField}}: req.params.id}, function(err, result) {
      if (err) { 
        res.status(500).send(err);
        return;
    }});
    res.status(200).send();
{{#requiresAuth}}
});
{{/requiresAuth}}
});
{{/writable}}
{{/schemaRoute}}
{{/schema}}

app.listen(args[0]);