@ -0,0 +1,7 @@ |
|||||
|
node_modules |
||||
|
bower_components |
||||
|
.idea |
||||
|
npm-debug.log |
||||
|
platforms/ |
||||
|
plugins/ |
||||
|
www/lib/ |
@ -0,0 +1,8 @@ |
|||||
|
module.exports = { |
||||
|
/*'secret': process.env.SECRET,// production version |
||||
|
'database': process.env.MONGO_DSN,*/ |
||||
|
'secret': 'secretfortoken',// local version
|
||||
|
'database': 'mongodb://localhost/openeventsplatform', |
||||
|
"port" : process.env.PORT || 3000 |
||||
|
|
||||
|
}; |
@ -0,0 +1,114 @@ |
|||||
|
var jwt = require('jsonwebtoken'); // used to create, sign, and verify tokens
|
||||
|
var express = require("express"); |
||||
|
var app = express(); |
||||
|
var config = require('../config'); // get our config file
|
||||
|
app.set('superSecret', config.secret); // secret variable
|
||||
|
var crypto = require('crypto'); |
||||
|
var mongoose = require('mongoose'); |
||||
|
|
||||
|
var userModel = mongoose.model('userModel'); |
||||
|
|
||||
|
exports.signup = function (req, res) { |
||||
|
var user = new userModel({ |
||||
|
username: req.body.username, |
||||
|
password: crypto.createHash('sha256').update(req.body.password).digest('base64'), |
||||
|
description: req.body.description, |
||||
|
email: req.body.email |
||||
|
}); |
||||
|
|
||||
|
user.save(function (err, user) { |
||||
|
if (err) return res.status(500).send(err.message); |
||||
|
//res.status(200).jsonp(user); en comptes de retoranr la data del signup, fem el login directament
|
||||
|
console.log("signup fet correctament, redirigint al login internament automàtic"); |
||||
|
exports.login(req, res); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
exports.login = function (req, res) { |
||||
|
userModel.findOne({ |
||||
|
email: req.body.email |
||||
|
}) |
||||
|
.select('+password') |
||||
|
.exec(function (err, user) { |
||||
|
if (err) throw err; |
||||
|
if (!user) { |
||||
|
res.json({success: false, message: 'Authentication failed. User not found.'}); |
||||
|
} else if (user) { |
||||
|
req.body.password = crypto.createHash('sha256').update(req.body.password).digest('base64'); |
||||
|
if (user.password != req.body.password) { |
||||
|
res.json({success: false, message: 'Authentication failed. Wrong password.'}); |
||||
|
} else { |
||||
|
var indexToken = -1; |
||||
|
for (var i = 0; i < user.tokens.length; i++) { |
||||
|
if (user.tokens[i].userAgent == req.body.userAgent) { |
||||
|
indexToken = JSON.parse(JSON.stringify(i));//stringify i parse pq es faci una còpia de la variable i, enlloc de una referència
|
||||
|
} |
||||
|
} |
||||
|
console.log(indexToken); |
||||
|
if (indexToken == -1) {//userAgent no exist
|
||||
|
var tokenGenerated = jwt.sign({foo: 'bar'}, app.get('superSecret'), { |
||||
|
// expiresIn: 86400 // expires in 24 hours
|
||||
|
}); |
||||
|
var newToken = { |
||||
|
userAgent: req.body.userAgent, |
||||
|
token: tokenGenerated, |
||||
|
os: req.body.os, |
||||
|
browser: req.body.browser, |
||||
|
device: req.body.device, |
||||
|
os_version: req.body.os_version, |
||||
|
browser_version: req.body.browser_version, |
||||
|
ip: req.body.ip, |
||||
|
lastLogin: Date() |
||||
|
}; |
||||
|
user.tokens.push(newToken); |
||||
|
} else {//userAgent already exist
|
||||
|
user.tokens[indexToken].token = ""; |
||||
|
var tokenGenerated = jwt.sign({foo: 'bar'}, app.get('superSecret'), { |
||||
|
// expiresIn: 86400 // expires in 24 hours
|
||||
|
}); |
||||
|
user.tokens[indexToken].token = tokenGenerated; |
||||
|
user.tokens[indexToken].ip = req.body.ip; |
||||
|
user.tokens[indexToken].lastLogin = Date(); |
||||
|
} |
||||
|
user.save(function (err, user) { |
||||
|
if (err) return res.send(500, err.message); |
||||
|
// return the information including token as JSON
|
||||
|
user.password = ""; |
||||
|
res.json({ |
||||
|
user: user, |
||||
|
success: true, |
||||
|
message: 'Enjoy your token!', |
||||
|
token: tokenGenerated |
||||
|
}); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
exports.getAllUsers = function(req, res) { |
||||
|
userModel.find() |
||||
|
.limit(Number(req.query.pageSize)) |
||||
|
.skip(Number(req.query.pageSize) * Number(req.query.page)) |
||||
|
.exec(function (err, users) { |
||||
|
if (err) return res.send(500, err.message); |
||||
|
res.status(200).jsonp(users); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
exports.getUserById = function (req, res) { |
||||
|
userModel.findOne({_id: req.params.userid}) |
||||
|
.lean() |
||||
|
.populate('events', 'title description img date') |
||||
|
.exec(function (err, user) { |
||||
|
if (err) return res.send(500, err.message); |
||||
|
if (!user) { |
||||
|
res.json({success: false, message: 'User not found.'}); |
||||
|
} else if (user) { |
||||
|
|
||||
|
res.status(200).jsonp(user); |
||||
|
} |
||||
|
}); |
||||
|
}; |
@ -0,0 +1,28 @@ |
|||||
|
var mongoose = require('mongoose'), |
||||
|
Schema = mongoose.Schema; |
||||
|
|
||||
|
var mongooseUniqueValidator = require('mongoose-unique-validator'); |
||||
|
|
||||
|
var alertSchema = new Schema({ |
||||
|
title: { type: String }, |
||||
|
description: { type: String }, |
||||
|
img: { type: String }, |
||||
|
date: { type: Date }, |
||||
|
location:{ |
||||
|
direction: { type: String }, |
||||
|
city: { type: String }, |
||||
|
district: { type: String }, |
||||
|
geolocation: { |
||||
|
lat: {type: Number}, |
||||
|
long: {type: Number}, |
||||
|
name: { type: String, required: true } |
||||
|
} |
||||
|
}, |
||||
|
user: { |
||||
|
type: mongoose.Schema.Types.ObjectId, |
||||
|
ref: 'userModel' |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
alertSchema.plugin(mongooseUniqueValidator); |
||||
|
module.exports = mongoose.model('alertModel', alertSchema); |
@ -0,0 +1,31 @@ |
|||||
|
var mongoose = require('mongoose'), |
||||
|
Schema = mongoose.Schema; |
||||
|
|
||||
|
var mongooseUniqueValidator = require('mongoose-unique-validator'); |
||||
|
|
||||
|
var eventSchema = new Schema({ |
||||
|
title: { type: String }, |
||||
|
description: { type: String }, |
||||
|
img: { type: String }, |
||||
|
date: { type: Date }, |
||||
|
categories: [{ |
||||
|
name: {type: String} |
||||
|
}], |
||||
|
location: { |
||||
|
direction: { type: String }, |
||||
|
city: { type: String }, |
||||
|
district: { type: String }, |
||||
|
geolocation: { |
||||
|
lat: {type: Number}, |
||||
|
long: {type: Number}, |
||||
|
name: { type: String, required: true } |
||||
|
} |
||||
|
}, |
||||
|
user: { |
||||
|
type: mongoose.Schema.Types.ObjectId, |
||||
|
ref: 'userModel' |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
eventSchema.plugin(mongooseUniqueValidator); |
||||
|
module.exports = mongoose.model('eventModel', eventSchema); |
@ -0,0 +1,48 @@ |
|||||
|
var mongoose = require('mongoose'), |
||||
|
Schema = mongoose.Schema; |
||||
|
|
||||
|
var mongooseUniqueValidator = require('mongoose-unique-validator'); |
||||
|
|
||||
|
var userSchema = new Schema({ |
||||
|
username: { type: String, required: true, unique: true }, |
||||
|
email: { type: String, required: true }, |
||||
|
password: { type: String, required: true, select: false }, |
||||
|
tokens: [{ |
||||
|
userAgent: {type: String}, |
||||
|
token: {type: String, select: false}, |
||||
|
os: {type: String}, |
||||
|
browser: {type: String}, |
||||
|
device: {type: String}, |
||||
|
os_version: {type: String}, |
||||
|
browser_version: {type: String}, |
||||
|
ip: {type: String}, |
||||
|
lastLogin: {type: Date}, |
||||
|
birthdate: {type: Date}, |
||||
|
}], |
||||
|
description: { type: String }, |
||||
|
img: { type: String, default: "https://assets-cdn.github.com/images/modules/logos_page/GitHub-Mark.png" }, |
||||
|
contact: { |
||||
|
twitter: { type: String }, |
||||
|
facebook: { type: String }, |
||||
|
telegram: { type: String }, |
||||
|
web: { type: String }, |
||||
|
phone: { type: Number } |
||||
|
}, |
||||
|
location:{ |
||||
|
direction: { type: String }, |
||||
|
city: { type: String }, |
||||
|
district: { type: String }, |
||||
|
geolocation: { |
||||
|
lat: {type: Number}, |
||||
|
long: {type: Number}, |
||||
|
name: { type: String} |
||||
|
} |
||||
|
}, |
||||
|
events: [{ |
||||
|
type: mongoose.Schema.Types.ObjectId, |
||||
|
ref: 'eventModel' |
||||
|
}] |
||||
|
}); |
||||
|
|
||||
|
userSchema.plugin(mongooseUniqueValidator); |
||||
|
module.exports = mongoose.model('userModel', userSchema); |
@ -0,0 +1,20 @@ |
|||||
|
{ |
||||
|
"name": "openEventsPlatformServer", |
||||
|
"version": "0.0.1", |
||||
|
"description": "openEventsPlatformServer", |
||||
|
"repository": "https://github.com/arnaucode/openEventsPlatformServer", |
||||
|
"main": "server.js", |
||||
|
"scripts": { |
||||
|
"prestart": "npm install", |
||||
|
"start": "node server.js" |
||||
|
}, |
||||
|
"dependencies": { |
||||
|
"body-parser": "latest", |
||||
|
"express": "^4.7.1", |
||||
|
"jsonwebtoken": "latest", |
||||
|
"method-override": "^2.1.2", |
||||
|
"mongoose": "latest", |
||||
|
"morgan": "latest", |
||||
|
"mongoose-unique-validator": "^1.0.2" |
||||
|
} |
||||
|
} |
@ -0,0 +1,97 @@ |
|||||
|
var express = require("express"), |
||||
|
app = express(), |
||||
|
bodyParser = require("body-parser"), |
||||
|
methodOverride = require("method-override"), |
||||
|
mongoose = require('mongoose'); |
||||
|
|
||||
|
var morgan = require('morgan'); |
||||
|
var jwt = require('jsonwebtoken'); // used to create, sign, and verify tokens
|
||||
|
var config = require('./config'); // get our config file
|
||||
|
|
||||
|
mongoose.Promise = global.Promise; |
||||
|
// Connection to DB
|
||||
|
mongoose.connect(config.database, function(err, res) { |
||||
|
if (err) throw err; |
||||
|
console.log('Connected to Database'); |
||||
|
}); |
||||
|
app.set('superSecret', config.secret); // secret variable
|
||||
|
|
||||
|
// Middlewares
|
||||
|
app.use(bodyParser.urlencoded({ |
||||
|
extended: false |
||||
|
})); |
||||
|
app.use(bodyParser.json()); |
||||
|
app.use(methodOverride()); |
||||
|
|
||||
|
// use morgan to log requests to the console
|
||||
|
app.use(morgan('dev')); |
||||
|
|
||||
|
|
||||
|
|
||||
|
var userMdl = require('./models/userModel')(app, mongoose); |
||||
|
var userCtrl = require('./controllers/userController'); |
||||
|
var eventMdl = require('./models/eventModel')(app, mongoose); |
||||
|
//var eventCtrl = require('./controllers/eventController');
|
||||
|
var alertMdl = require('./models/alertModel')(app, mongoose); |
||||
|
//var alertCtrl = require('./controllers/alertController');
|
||||
|
|
||||
|
//CORS
|
||||
|
app.use(function(req, res, next) { |
||||
|
res.header("Access-Control-Allow-Origin", "*"); |
||||
|
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); |
||||
|
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, X-Access-Token"); |
||||
|
next(); |
||||
|
}); |
||||
|
|
||||
|
|
||||
|
// API routes ------------------------------------------------------
|
||||
|
var apiRoutes = express.Router(); |
||||
|
|
||||
|
apiRoutes.route('/login') |
||||
|
.post(userCtrl.login); |
||||
|
apiRoutes.route('/signup') |
||||
|
.post(userCtrl.signup); |
||||
|
|
||||
|
apiRoutes.route('/users') |
||||
|
.get(userCtrl.getAllUsers); |
||||
|
apiRoutes.route('/users/id/:userid') |
||||
|
.get(userCtrl.getUserById); |
||||
|
|
||||
|
// route middleware to verify a token
|
||||
|
apiRoutes.use(function(req, res, next) { |
||||
|
// check header or url parameters or post parameters for token
|
||||
|
var token = req.body.token || req.query.token || req.headers['x-access-token']; |
||||
|
// decode token
|
||||
|
if (token) { |
||||
|
// verifies secret and checks exp
|
||||
|
jwt.verify(token, app.get('superSecret'), function(err, decoded) { |
||||
|
if (err) { |
||||
|
return res.send(204, { |
||||
|
success: false, |
||||
|
message: 'Failed to authenticate token.' |
||||
|
}); |
||||
|
} else { |
||||
|
// if everything is good, save to request for use in other routes
|
||||
|
req.decoded = decoded; |
||||
|
//console.log("decoded " + decoded);
|
||||
|
next(); |
||||
|
} |
||||
|
}); |
||||
|
} else { |
||||
|
// if there is no token
|
||||
|
// return an error
|
||||
|
return res.status(204).send({ |
||||
|
success: false, |
||||
|
message: 'No token provided.' |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
}); //fi verificació de token
|
||||
|
|
||||
|
app.use('/api', apiRoutes); |
||||
|
// end of API routes -------------------------------------
|
||||
|
|
||||
|
// Start server
|
||||
|
app.listen(config.port, function() { |
||||
|
console.log("Node server running on http://localhost:3000"); |
||||
|
}); |