diff --git a/.env b/.env index db14a07..9c1894a 100644 --- a/.env +++ b/.env @@ -1,9 +1,9 @@ APP_ENV="development" NODE_ENV="development" DEBUG=false -SERVER_PORT="3201" +SERVER_PORT=3201 SECRET="$2b$10$2.JkQCRUa3fXESy/WyKVWO" -SESSION_LIFETIME="3600" +SESSION_LIFETIME=3600 MONGODB_URI="mongodb://localhost:27017/headupdb" SENDGRID_API_KEY="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" SENDGRID_FROM_MAIL="contact@rampeur.fr" @@ -19,5 +19,5 @@ MYSQL_DBNAME="c4adastracomdb2" MYSQL_DBUSER="c4adastracomu2" MYSQL_DBPASS="kbrnrt5jPK12" MYSQL_DBHOST="ns388640.ip-176-31-255.eu" -MYSQL_DBPORT="3306" +MYSQL_DBPORT=3306 MYSQL_DBTYPE="mysql" \ No newline at end of file diff --git a/.env.development b/.env.development index 71bc58b..cb962ba 100644 --- a/.env.development +++ b/.env.development @@ -1,7 +1,7 @@ APP_ENV="development" NODE_ENV="development" DEBUG=false -SERVER_PORT="3201" +SERVER_PORT=3201 SECRET="$2b$10$2.JkQCRUa3fXESy/WyKVWO" SESSION_LIFETIME=3600 MONGODB_URI="mongodb://localhost:27017/headupdb" @@ -19,5 +19,5 @@ MYSQL_DBNAME="c4adastracomdb2" MYSQL_DBUSER="c4adastracomu2" MYSQL_DBPASS="kbrnrt5jPK12" MYSQL_DBHOST="ns388640.ip-176-31-255.eu" -MYSQL_DBPORT="3306" +MYSQL_DBPORT=3306 MYSQL_DBTYPE="mysql" diff --git a/.env.local b/.env.local index e21119e..cd71da1 100644 --- a/.env.local +++ b/.env.local @@ -1,7 +1,7 @@ APP_ENV="local" NODE_ENV="development" DEBUG=false -SERVER_PORT="3201" +SERVER_PORT=3201 SECRET="$2b$10$2.JkQCRUa3fXESy/WyKVWO" SESSION_LIFETIME=3600 MONGODB_URI="mongodb://localhost:27017/headupdb" @@ -19,5 +19,5 @@ MYSQL_DBNAME="c4adastracomdb2" MYSQL_DBUSER="c4adastracomu2" MYSQL_DBPASS="kbrnrt5jPK12" MYSQL_DBHOST="ns388640.ip-176-31-255.eu" -MYSQL_DBPORT="3306" +MYSQL_DBPORT=3306 MYSQL_DBTYPE="mysql" diff --git a/.env.production b/.env.production index 6fc2130..3b6cc07 100644 --- a/.env.production +++ b/.env.production @@ -1,7 +1,7 @@ APP_ENV="production" NODE_ENV="production" DEBUG=false -SERVER_PORT="3201" +SERVER_PORT=3201 SECRET="$2b$10$2.JkQCRUa3fXESy/WyKVWO" SESSION_LIFETIME=3600 MONGODB_URI="mongodb://localhost:27017/headupdb" @@ -19,5 +19,5 @@ MYSQL_DBNAME="c4adastracomdb2" MYSQL_DBUSER="c4adastracomu2" MYSQL_DBPASS="kbrnrt5jPK12" MYSQL_DBHOST="ns388640.ip-176-31-255.eu" -MYSQL_DBPORT="3306" +MYSQL_DBPORT=3306 MYSQL_DBTYPE="mysql" diff --git a/.gitignore b/.gitignore index 2d8bf39..8a5a486 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,5 @@ sonar.properties **/*.copy.ts **/*.copy.scss **/*.copy.html + +sequelize-auto-config.json \ No newline at end of file diff --git a/app.js b/app.js index 3b79090..e03f3a4 100644 --- a/app.js +++ b/app.js @@ -14,7 +14,8 @@ var express = require('express'), const utils = require('./src/utils'), exceptionHandler = require('./src/middlewares/exceptions.handler'), - connectDb = require('./src/database/connectDatabase'); + connectDb = require('./src/database/connectDb'), + config = require('./src/config'); // Create global app object var app = express(); @@ -46,18 +47,15 @@ app.use(express.urlencoded({ extended: true })); app.use(require('method-override')()); app.use(express.static(__dirname + '/public')); -app.use(session({ secret: process.env.SECRET, cookie: { maxAge: 60000 }, resave: false, saveUninitialized: false })); +app.use(session({ secret: config.secret, cookie: { maxAge: config.session_lifetime }, resave: false, saveUninitialized: false })); if (appEnv !== 'production') { app.use(errorhandler()); } require('./src/database/models/mongo'); -require('./src/config/passport'); - -//var userid = new mongoose.Types.ObjectId(); -//console.log('userid: ', userid._id.toString()); - +config.initAuth(); +config.initApiKey(); connectDb.connectAllDb(); app.use(require('./src/routes')); @@ -67,6 +65,10 @@ app.use(exceptionHandler.logErrorHandler); app.use(exceptionHandler.clientErrorHandler); app.use(exceptionHandler.fianlErrorHandler); +/* +var userid = new mongoose.Types.ObjectId(); +console.log('userid: ', userid._id.toString()); +*/ /* // catch 404 and forward to error handler app.use(function(req, res, next) { @@ -107,4 +109,4 @@ const startServer = async () => { } // finally, let's start our server... -startServer(); \ No newline at end of file +startServer(); diff --git a/models/index.js b/models/index.js deleted file mode 100644 index 681fbaf..0000000 --- a/models/index.js +++ /dev/null @@ -1,15 +0,0 @@ -exports.User = require('../src/database/models/mongo/User'); -exports.Application = require('../src/database/models/mongo/Application'); -exports.Aeronef = require('../src/database/models/mongo/Aeronef'); -exports.Canopy = require('../src/database/models/mongo/Canopy'); -exports.Dropzone = require('../src/database/models/mongo/Dropzone'); -exports.JumpFile = require('../src/database/models/mongo/JumpFile'); -exports.Jump = require('../src/database/models/mongo/Jump'); -exports.Qcm = require('../src/database/models/mongo/Qcm'); -exports.QcmCategory = require('../src/database/models/mongo/QcmCategory'); -exports.QcmQuestion = require('../src/database/models/mongo/QcmQuestion'); -exports.QcmChoice = require('../src/database/models/mongo/QcmChoice'); -exports.X2DataLog = require('../src/database/models/mongo/X2DataLog'); -exports.Article = require('../src/database/models/mongo/Article'); -exports.Comment = require('../src/database/models/mongo/Comment'); -exports.Tag = require('../src/database/models/mongo/Tag'); \ No newline at end of file diff --git a/nodemon.json b/nodemon.json index b3ce0de..90f8950 100644 --- a/nodemon.json +++ b/nodemon.json @@ -3,9 +3,9 @@ "APP_ENV": "local", "NODE_ENV" : "development", "DEBUG": false, - "SERVER_PORT": "3201", + "SERVER_PORT": 3201, "SECRET": "$2b$10$aEsAUG7Dy8dcTORi1vaQle", - "SESSION_LIFETIME": "3600", + "SESSION_LIFETIME": 3600, "MONGODB_URI": "mongodb://localhost:27017/headupdb", "SENDGRID_API_KEY": "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", "SENDGRID_FROM_MAIL": "contact@rampeur.fr", @@ -21,7 +21,7 @@ "MYSQL_DBUSER": "c4adastracomu2", "MYSQL_DBPASS": "kbrnrt5jPK12", "MYSQL_DBHOST": "ns388640.ip-176-31-255.eu", - "MYSQL_DBPORT": "3306", + "MYSQL_DBPORT": 3306, "MYSQL_DBTYPE": "mysql" } } diff --git a/routes/api/aeronefs.js b/routes/api/aeronefs.js deleted file mode 100644 index 07e68d6..0000000 --- a/routes/api/aeronefs.js +++ /dev/null @@ -1,143 +0,0 @@ -var router = require('express').Router(), - mongoose = require('mongoose'), - Jump = mongoose.model('Jump'), - User = mongoose.model('User'); -const auth = require('../auth'), - queries = require('../queries'); - - -router.get('/allByImat', auth.required, function (req, res, next) { - let limit = 25; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let query = queries.getAeronefsByImatQuery(user._id.toString()); - Promise.all([ - Jump.aggregate(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - //Aeronef.count(query) - ]).then(function (results) { - let aeronefs = results[0]; - //let aeronefsCount = results[1]; - return res.json({ - aeronefs: aeronefs.map(function (data) { - return { aeronef: data._id.aeronef, imat: data._id.imat, count: data.count }; - }), - aeronefsCount: aeronefs.length - }); - /* - return res.json({ - aeronefs: aeronefs.map(function (aeronef) { - return aeronef.toJSONFor(user); - }), - aeronefsCount: aeronefsCount - }); - */ - }).catch(next); - }).catch(next); -}); - -router.get('/allByImatByYear', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let limit = 50; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - let query = queries.getAeronefsByImatByYearQuery(user._id.toString()); - - Jump.aggregate(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - .then(function (result) { - let aeronefs = result.map(function (data) { - return { aeronef: data._id.aeronef, imat: data._id.imat, year: data._id.year, count: data.count }; - }); - return res.json({ - aeronefs: aeronefs, - aeronefsCount: aeronefs.length - }); - }).catch(next); - }).catch(next); - /* - let limit = 50; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': user._id.toString() } ] - } - } - }, { - '$project': { - '_id': 0, - 'aeronef': 1, - 'imat': 1, - 'year': { - '$year': '$date' - } - } - }, { - '$group': { - '_id': { - 'aeronef': '$aeronef', - 'imat': '$imat', - 'year': '$year' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': { - '_id': 1 - } - } - ]; - Promise.all([ - req.payload ? User.findById(req.payload.id) : null, - Jump.aggregate(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - ]).then(function (results) { - let user = results[0]; - let aeronefs = results[1]; - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - return res.json({ - aeronefs: aeronefs, - aeronefsCount: aeronefs.length - }); - }).catch(next); - */ - -}); - -module.exports = router; diff --git a/routes/api/applications.js b/routes/api/applications.js deleted file mode 100644 index 409f43e..0000000 --- a/routes/api/applications.js +++ /dev/null @@ -1,173 +0,0 @@ -var router = require('express').Router(), - mongoose = require('mongoose'), - Application = mongoose.model('Application'), - User = mongoose.model('User'); -const auth = require('../auth'), - mailer = require('@sendgrid/mail'); - -mailer.setApiKey(process.env.SENDGRID_API_KEY); - -// Preload application objects on routes with ':application' -router.param('application', function (req, res, next, slug) { - Application.findOne({ slug: slug }) - .populate('author') - .then(function (application) { - if (!application) { - return res.sendStatus(404); - } - req.application = application; - return next(); - }).catch(next); -}); - -/** - * return all applications - */ -router.get('/', auth.required, function (req, res, next) { - let query = {}; - let limit = 25; - let offset = 0; - - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - if (typeof req.query.apikey !== 'undefined') { - query.apikey = req.query.apikey; - } - if (typeof req.query.maskedkey !== 'undefined') { - query.maskedkey = req.query.maskedkey; - } - - Promise.all([ - req.query.author ? User.findOne({ username: req.query.author }) : null - ]).then(function (author) { - if (author[0]) { - query.author = author[0]._id; - } - return Promise.all([ - Application.find(query) - .skip(Number(offset)) - .limit(Number(limit)) - .sort({ createdAt: 'desc' }) - .populate('author') - .exec(), - Application.count(query).exec(), - req.payload ? User.findById(req.payload.id) : null - ]).then(function (results) { - let applications = results[0]; - let applicationsCount = results[1]; - let user = results[2]; - - return res.json({ - applications: applications.map(function (application) { - return application.toJSONFor(user); - }), - applicationsCount: applicationsCount - }); - }); - }).catch(next); -}); - -/** - * save an application - */ -router.post('/', auth.required, function (req, res, next) { - Promise.all([ - User.findById(req.payload.id), - auth.generateAPIKey() - ]).then(function (results) { - let user = results[0]; - let keys = results[1]; - if (!user) { - return res.sendStatus(401).json({message: "Unauthorized - You are not allowed to access this resource."}); - } - let application = new Application(req.body.application); - application.author = user; - application.apikey = keys.encrypted; - application.maskedkey = keys.masked; - return application.save().then(function () { - let msg = { - to: user.email, - from: process.env.SENDGRID_FROM_MAIL, - subject: `Api-Key ${application.title}`, - text: `Votre Api-Key: ${keys.key}\nAttention, cette Api-Key doit être conservée et ne sera plus affichée.\n\n${application.title}\n${application.description}`, - html: `

${application.title}

-

- Votre Api-Key: ${keys.key}
- Attention, cette Api-Key doit être conservée et ne sera plus affichée. -

-
-

${application.description}

` - }; - mailer.send(msg).then(() => { - return res.json({ application: application.toJSONFor(user) }); - }) - .catch(err => { - res.sendStatus(500).json({message: "A SendGrid error occured while sending an email", err: err}); - }); - }); - }).catch(next); -}); - -/** - * return an application - */ -router.get('/:application', auth.required, function (req, res, next) { - Promise.all([ - req.payload ? User.findById(req.payload.id) : null, - req.application.populate('author') - ]).then(function (results) { - let user = results[0]; - return res.json({ application: req.application.toJSONFor(user) }); - }).catch(next); -}); - -/** - * update an application - */ -router.put('/:application', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (req.application.author._id.toString() === req.payload.id.toString()) { - if (typeof req.body.application.title !== 'undefined') { - req.application.title = req.body.application.title; - } - if (typeof req.body.application.description !== 'undefined') { - req.application.description = req.body.application.description; - } - if (typeof req.body.application.apikey !== 'undefined') { - req.application.apikey = req.body.application.apikey; - } - if (typeof req.body.application.maskedkey !== 'undefined') { - req.application.maskedkey = req.body.application.maskedkey; - } - req.application.save().then(function (application) { - return res.json({ application: application.toJSONFor(user) }); - }).catch(next); - } else { - return res.status(403).json({ errors: { "Forbidden": "Vous ne disposez pas des autorisations suffisantes" } }); - } - }); -}); - -/** - * delete an application - */ -router.delete('/:application', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - if (user.role == 'Admin' || req.application.author._id.toString() === req.payload.id.toString()) { - return req.application.remove().then(function () { - return res.json({ deleted: true }); - }); - } else { - return res.status(403).json({ errors: { "Forbidden": "Vous ne disposez pas des autorisations suffisantes" } }); - } - }).catch(next); -}); - -module.exports = router; diff --git a/routes/api/articles.js b/routes/api/articles.js deleted file mode 100755 index c9c0d46..0000000 --- a/routes/api/articles.js +++ /dev/null @@ -1,283 +0,0 @@ -var router = require('express').Router(); -var mongoose = require('mongoose'); -var Article = mongoose.model('Article'); -var Comment = mongoose.model('Comment'); -var User = mongoose.model('User'); -var auth = require('../auth'); - -// Preload article objects on routes with ':article' -router.param('article', function (req, res, next, slug) { - Article.findOne({ slug: slug }) - .populate('author') - .then(function (article) { - if (!article) { - return res.sendStatus(404); - } - req.article = article; - return next(); - }).catch(next); -}); - -router.param('comment', function (req, res, next, id) { - Comment.findById(id).then(function (comment) { - if (!comment) { - return res.sendStatus(404); - } - req.comment = comment; - return next(); - }).catch(next); -}); - -router.get('/', auth.optional, function (req, res, next) { - var query = {}; - var limit = 20; - var offset = 0; - - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - if (typeof req.query.membre !== 'undefined') { - query.membre = req.query.membre; - } - if (typeof req.query.tag !== 'undefined') { - query.tagList = { "$in": [req.query.tag] }; - } - - Promise.all([ - req.query.author ? User.findOne({ username: req.query.author }) : null, - req.query.favorited ? User.findOne({ username: req.query.favorited }) : null - ]).then(function (results) { - var author = results[0]; - var favoriter = results[1]; - - if (author) { - query.author = author._id; - } - - if (favoriter) { - query._id = { $in: favoriter.favorites }; - } else if (req.query.favorited) { - query._id = { $in: [] }; - } - - return Promise.all([ - Article.find(query) - .limit(Number(limit)) - .skip(Number(offset)) - .sort({ createdAt: 'desc' }) - .populate('author') - .exec(), - Article.count(query).exec(), - req.payload ? User.findById(req.payload.id) : null, - ]).then(function (results) { - var articles = results[0]; - var articlesCount = results[1]; - var user = results[2]; - - return res.json({ - articles: articles.map(function (article) { - return article.toJSONFor(user); - }), - articlesCount: articlesCount - }); - }); - }).catch(next); -}); - -router.get('/feed', auth.required, function (req, res, next) { - var limit = 20; - var offset = 0; - - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.sendStatus(401); - } - Promise.all([ - Article.find({ author: { $in: user.following } }) - .limit(Number(limit)) - .skip(Number(offset)) - .populate('author') - .exec(), - Article.count({ author: { $in: user.following } }) - ]).then(function (results) { - var articles = results[0]; - var articlesCount = results[1]; - return res.json({ - articles: articles.map(function (article) { - return article.toJSONFor(user); - }), - articlesCount: articlesCount - }); - }).catch(next); - }); -}); - -router.post('/', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.sendStatus(401); - } - var article = new Article(req.body.article); - article.author = user; - return article.save().then(function () { - return res.json({ article: article.toJSONFor(user) }); - }); - }).catch(next); -}); - -// return a article -router.get('/:article', auth.optional, function (req, res, next) { - Promise.all([ - req.payload ? User.findById(req.payload.id) : null, - req.article.populate('author') - ]).then(function (results) { - var user = results[0]; - return res.json({ article: req.article.toJSONFor(user) }); - }).catch(next); -}); - -// update article // 6440016ef84d788c1b352018 -router.put('/:article', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (req.article.author._id.toString() === req.payload.id.toString()) { - if (typeof req.body.article.title !== 'undefined') { - req.article.title = req.body.article.title; - } - if (typeof req.body.article.description !== 'undefined') { - req.article.description = req.body.article.description; - } - if (typeof req.body.article.body !== 'undefined') { - req.article.body = req.body.article.body; - } - if (typeof req.body.article.tagList !== 'undefined') { - req.article.tagList = req.body.article.tagList - } - if (typeof req.body.article.membre !== 'undefined') { - req.article.membre = req.body.article.membre; - } - req.article.save().then(function (article) { - return res.json({ article: article.toJSONFor(user) }); - }).catch(next); - } else { - return res.sendStatus(403); - } - }); -}); - -// delete article -router.delete('/:article', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.sendStatus(401); - } - if (req.article.author._id.toString() === req.payload.id.toString()) { - return req.article.remove().then(function () { - return res.sendStatus(204); - }); - } else { - return res.sendStatus(403); - } - }).catch(next); -}); - -// Favorite an article -router.post('/:article/favorite', auth.required, function (req, res, next) { - var articleId = req.article._id; - - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.sendStatus(401); - } - return user.favorite(articleId).then(function () { - return req.article.updateFavoriteCount().then(function (article) { - return res.json({ article: article.toJSONFor(user) }); - }); - }); - }).catch(next); -}); - -// Unfavorite an article -router.delete('/:article/favorite', auth.required, function (req, res, next) { - var articleId = req.article._id; - - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.sendStatus(401); - } - - return user.unfavorite(articleId).then(function () { - return req.article.updateFavoriteCount().then(function (article) { - return res.json({ article: article.toJSONFor(user) }); - }); - }); - }).catch(next); -}); - -// return an article's comments -router.get('/:article/comments', auth.optional, function (req, res, next) { - Promise.resolve(req.payload ? User.findById(req.payload.id) : null).then(function (user) { - return req.article.populate({ - path: 'comments', - populate: { - path: 'author' - }, - options: { - sort: { - createdAt: 'desc' - } - } - }).then(function (article) { - return res.json({ - comments: req.article.comments.map(function (comment) { - return comment.toJSONFor(user); - }) - }); - }); - }).catch(next); -}); - -// create a new comment -router.post('/:article/comments', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.sendStatus(401); - } - var comment = new Comment(req.body.comment); - comment.article = req.article; - comment.author = user; - - return comment.save().then(function () { - req.article.comments.push(comment); - - return req.article.save().then(function (article) { - res.json({ comment: comment.toJSONFor(user) }); - }); - }); - }).catch(next); -}); - -router.delete('/:article/comments/:comment', auth.required, function (req, res, next) { - if (req.comment.author.toString() === req.payload.id.toString()) { - req.article.comments.remove(req.comment._id); - req.article.save() - .then(Comment.find({ _id: req.comment._id }).remove().exec()) - .then(function () { - res.sendStatus(204); - }); - } else { - res.sendStatus(403); - } -}); - -module.exports = router; diff --git a/routes/api/canopies.js b/routes/api/canopies.js deleted file mode 100644 index 0cff862..0000000 --- a/routes/api/canopies.js +++ /dev/null @@ -1,166 +0,0 @@ -var router = require('express').Router(), - mongoose = require('mongoose'), - Jump = mongoose.model('Jump'), - User = mongoose.model('User'); -const auth = require('../auth'), - queries = require('../queries'); - -router.get('/', auth.required, function (req, res, next) { - let query = {}; - let limit = 25; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - if (typeof req.query.slug !== 'undefined') { - query.slug = req.query.slug; - } - - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - if (user.role == 'Admin') { - return res.status(403).json({ errors: { "Forbidden": "Vous ne disposez pas des autorisations suffisantes" } }); - } - Jump.find(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - .then(function (result) { - let canopies = result; - return res.json({ - canopies: canopies, - canopiesCount: canopies.length - }); - }).catch(next); - }).catch(next); -}); - -router.get('/allBySize', auth.required, function (req, res, next) { - let limit = 25; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let query = queries.getCanopiesBySizeQuery(user._id.toString()); - Jump.aggregate(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - .then(function (result) { - let canopies = result.map(function (data) { - return { taille: data._id.taille, count: data.count }; - }); - return res.json({ - canopies: canopies, - canopiesCount: canopies.length - }); - }).catch(next); - }).catch(next); -}); - -router.get('/allBySizeByYear', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let limit = 25; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - let query = queries.getCanopiesBySizeByYearQuery(user._id.toString()); - Jump.aggregate(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - .then(function (result) { - let canopies = result.map(function (data) { - return { taille: data._id.taille, year: data._id.year, count: data.count }; - }); - //console.log(dropzones); - return res.json({ - canopies: canopies, - canopiesCount: canopies.length - }); - }).catch(next); - }).catch(next); -}); - -router.get('/allBySizeByModel', auth.required, function (req, res, next) { - let limit = 25; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let query = queries.getCanopiesBySizeByModelQuery(user._id.toString()); - Jump.aggregate(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - .then(function (result) { - let canopies = result.map(function (data) { - return { taille: data._id.taille, voile: data._id.voile, count: data.count }; - }); - return res.json({ - canopies: canopies, - canopiesCount: canopies.length - }); - }).catch(next); - }).catch(next); -}); - -router.get('/allBySizeByModelByYear', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let limit = 25; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - let query = queries.getCanopiesBySizeByModelByYearQuery(user._id.toString()); - Jump.aggregate(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - .then(function (result) { - let canopies = result.map(function (data) { - return { taille: data._id.taille, voile: data._id.voile, year: data._id.year, count: data.count }; - }); - return res.json({ - canopies: canopies, - canopiesCount: canopies.length - }); - }).catch(next); - }).catch(next); -}); - -module.exports = router; diff --git a/routes/api/comments.js b/routes/api/comments.js deleted file mode 100644 index 04430ff..0000000 --- a/routes/api/comments.js +++ /dev/null @@ -1,63 +0,0 @@ -var router = require('express').Router(); -var mongoose = require('mongoose'); -var Comment = mongoose.model('Comment'); -var User = mongoose.model('User'); -var auth = require('../auth'); - -// return an article's comments -router.get('/:article/comments', auth.optional, function (req, res, next) { - Promise.resolve(req.payload ? User.findById(req.payload.id) : null).then(function (user) { - return req.article.populate({ - path: 'comments', - populate: { - path: 'author' - }, - options: { - sort: { - createdAt: 'desc' - } - } - }).then(function (article) { - return res.json({ - comments: req.article.comments.map(function (comment) { - return comment.toJSONFor(user); - }) - }); - }); - }).catch(next); -}); - -// create a new comment -router.post('/:article/comments', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.sendStatus(401); - } - var comment = new Comment(req.body.comment); - comment.article = req.article; - comment.author = user; - - return comment.save().then(function () { - req.article.comments.push(comment); - - return req.article.save().then(function (article) { - res.json({ comment: comment.toJSONFor(user) }); - }); - }); - }).catch(next); -}); - -router.delete('/:article/comments/:comment', auth.required, function (req, res, next) { - if (req.comment.author.toString() === req.payload.id.toString()) { - req.article.comments.remove(req.comment._id); - req.article.save() - .then(Comment.find({ _id: req.comment._id }).remove().exec()) - .then(function () { - res.sendStatus(204); - }); - } else { - res.sendStatus(403); - } -}); - -module.exports = router; \ No newline at end of file diff --git a/routes/api/dropzones.js b/routes/api/dropzones.js deleted file mode 100644 index c51bebc..0000000 --- a/routes/api/dropzones.js +++ /dev/null @@ -1,69 +0,0 @@ -var router = require('express').Router(), - mongoose = require('mongoose'), - Jump = mongoose.model('Jump'), - User = mongoose.model('User'); -const auth = require('../auth'), - queries = require('../queries'); - - -router.get('/allByOaci', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let limit = 25; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - let query = queries.getDropZonesByOaciQuery(user._id.toString()); - Jump.aggregate(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - .then(function (result) { - let dropzones = result.map(function (data) { - return { lieu: data._id.lieu, oaci: data._id.oaci, count: data.count }; - }); - return res.json({ - dropzones: dropzones, - dropzonesCount: dropzones.length - }); - }).catch(next); - }).catch(next); -}); - -router.get('/allByOaciByYear', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let limit = 25; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - let query = queries.getDropZonesByOaciByYearQuery(user._id.toString()); - Jump.aggregate(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - .then(function (result) { - let dropzones = result.map(function (data) { - return { lieu: data._id.lieu, oaci: data._id.oaci, year: data._id.year, count: data.count }; - }); - return res.json({ - dropzones: dropzones, - dropzonesCount: dropzones.length - }); - }).catch(next); - }).catch(next); -}); - -module.exports = router; diff --git a/routes/api/index.js b/routes/api/index.js deleted file mode 100644 index 9acda18..0000000 --- a/routes/api/index.js +++ /dev/null @@ -1,28 +0,0 @@ -var routes = require('express').Router(); - -routes.use('/', require('./users')); -routes.use('/articles', require('./articles')); -routes.use('/comments', require('./comments')); -routes.use('/tags', require('./tags')); -routes.use('/profiles', require('./profiles')); -routes.use('/applications', require('./applications')); -routes.use('/aeronefs', require('./aeronefs')); -routes.use('/canopies', require('./canopies')); -routes.use('/dropzones', require('./dropzones')); -routes.use('/jumps', require('./jumps')); -routes.use('/pages', require('./pages')); -routes.use('/qcm', require('./qcm')); - -routes.use(function (err, req, res, next) { - if (err.name === 'ValidationError') { - return res.status(422).json({ - errors: Object.keys(err.errors).reduce(function (errors, key) { - errors[key] = err.errors[key].message; - return errors; - }, {}) - }); - } - return next(err); -}); - -module.exports = routes; \ No newline at end of file diff --git a/routes/api/jumps.js b/routes/api/jumps.js deleted file mode 100644 index ee58e88..0000000 --- a/routes/api/jumps.js +++ /dev/null @@ -1,621 +0,0 @@ -var router = require('express').Router(), - mongoose = require('mongoose'), - Jump = mongoose.model('Jump'), - JumpFile = mongoose.model('JumpFile'), - User = mongoose.model('User'), - X2DataLog = mongoose.model('X2DataLog'); -const auth = require('../auth'), - chalk = require('chalk'), - queries = require('../queries'), - utils = require('../utils'); - -// Preload jump objects on routes with ':jump' -router.param('jump', function (req, res, next, slug) { - Jump.findOne({ slug: slug }) - .populate('author') - .populate('files') - .populate('x2data') - .then(function (jump) { - if (!jump) { - return res.sendStatus(404); - } - req.jump = jump; - return next(); - }).catch(next); -}); - -/** - * return all jumps - */ -router.get('/', auth.required, function (req, res, next) { - let query = {}; - let limit = 25; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - if (typeof req.query.title !== 'undefined') { - const rgx = new RegExp(`.*${req.query.title}.*`); - query = { - $or: [ - { title: { $regex: rgx, $options: "i" } }, - { slug: { $regex: rgx, $options: "i" } }, - ], - } - } - if (typeof req.query.numeroRangeStart !== 'undefined' && typeof req.query.numeroRangeEnd !== 'undefined') { - query.numero = { - $gte: req.query.numeroRangeStart, - $lte: req.query.numeroRangeEnd - }; - } - if (typeof req.query.tailleRangeStart !== 'undefined' && typeof req.query.tailleRangeEnd !== 'undefined') { - query.taille = { - $gte: req.query.tailleRangeStart, - $lte: req.query.tailleRangeEnd - }; - } - if (typeof req.query.participantsRangeStart !== 'undefined' && typeof req.query.participantsRangeEnd !== 'undefined') { - query.participants = { - $gte: req.query.participantsRangeStart, - $lte: req.query.participantsRangeEnd - }; - } - if (typeof req.query.hauteurRangeStart !== 'undefined' && typeof req.query.hauteurRangeEnd !== 'undefined') { - query.hauteur = { - $gte: req.query.hauteurRangeStart, - $lte: req.query.hauteurRangeEnd - }; - } - if (typeof req.query.yearRangeStart !== 'undefined' && typeof req.query.yearRangeEnd !== 'undefined') { - query.date = { - $gte: new Date(`${req.query.yearRangeStart}-01-01 00:00:00`), - $lte: new Date(`${req.query.yearRangeEnd}-12-31 23:59:59`) - }; - } - if (typeof req.query.dateRangeStart !== 'undefined' && typeof req.query.dateRangeEnd !== 'undefined') { - query.date = { - $gte: new Date(`${req.query.dateRangeStart} 00:00:00`), - $lte: new Date(`${req.query.dateRangeEnd} 23:59:59`) - }; - } - - Promise.all([ - req.query.author ? User.findOne({ username: req.query.author }) : null, - req.query.favorited ? User.findOne({ username: req.query.favorited }) : null - ]).then(function (users) { - let author = users[0]; - - if (author) { - query.author = author._id; - } - - Promise.all([ - Jump.find(query) - .skip(Number(offset)) - .limit(Number(limit)) - .sort({ numero: 'desc' }) - .populate('author') - .populate('files') - .populate('x2data') - .exec(), - Jump.count(query).exec(), - req.payload ? User.findById(req.payload.id) : null - ]).then(function (results) { - let jumps = results[0]; - let jumpsCount = results[1]; - let user = results[2]; - /* - Promise.all( - jumps.map(jump => { - if (jump.files[0] !== undefined && jump.files[0].type !== 'kml') { - console.log( chalk.green(`Fichier ${jump.files[0].type}`)) - //console.log( chalk.green(`Suppression du fichier ${jump.files[2]._id}`)) - //return jump.removeFile(jump.files[2]._id); - } - return; - }) - ).then(function () { - return res.json({ - jumps: jumps.map(function (jump) { - return jump.toJSONFor(user); - }), - jumpsCount: jumpsCount - }); - }); - */ - return res.json({ - jumps: jumps.map(function (jump) { - return jump.toJSONFor(user); - }), - jumpsCount: jumpsCount - }); - }); - }).catch(next); -}); - -router.get('/allByCategorie', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let limit = 120; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - let query = queries.getJumpsByCategoryQuery(user._id.toString()); - - Jump.aggregate(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - .then(function (result) { - let jumps = result.map(function (data) { - return { categorie: data._id.categorie, count: data.count }; - }); - return res.json({ - jumps: jumps, - jumpsCount: jumps.length - }); - }).catch(next); - }).catch(next); -}); - -router.get('/allByDate', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let limit = 120; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - let query = queries.getJumpsByDateQuery(user._id.toString()); - - Jump.aggregate(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - .then(function (result) { - let jumps = result.map(function (data) { - return { year: data._id.year, month: data._id.month, count: data.count }; - }); - return res.json({ - jumps: jumps, - jumpsCount: jumps.length - }); - }).catch(next); - }).catch(next); -}); - -router.get('/allByDay', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let query = {}; - let limit = 50; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - if (typeof req.query.dateRangeStart !== 'undefined' && typeof req.query.dateRangeEnd !== 'undefined') { - query = queries.getJumpsByDayQuery( - user._id.toString(), - req.query.dateRangeStart, - req.query.dateRangeEnd - ); - } else { - query = queries.getJumpsByDayQuery(user._id.toString()); - } - - Jump.aggregate(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - .then(function (result) { - let days = result.map(function (data) { - return { jumps: data.jumps, count: data.count }; - }); - return res.json({ - days: days, - daysCount: days.length - }); - }).catch(next); - }).catch(next); -}); - -router.get('/allByModule', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let limit = 120; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - let query = queries.getJumpsByModuleQuery(user._id.toString()); - - Jump.aggregate(query) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - .then(function (result) { - let jumps = result.map(function (data) { - return { categorie: data._id.categorie, module: data._id.module, count: data.count }; - }); - return res.json({ - jumps: jumps, - jumpsCount: jumps.length - }); - }).catch(next); - }).catch(next); -}); - -/** - * return a jump from SkydiverId API - */ -router.get('/allFromSkydiverIdApi', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - utils.fetchSkydiverIdApi('jumps', req.query).then(result => { - if (result.errors === undefined) { - console.log(`${utils.getDateTimeISOString()}`, chalk.green(`Réception des sauts SkydiverId`)); - } else { - console.log(`${utils.getDateTimeISOString()}`, chalk.red(`Une erreur ${result.errors.code} '${result.errors.type}' est survenue lors de la réception des sauts SkydiverId : ${result.errors.name} ${result.errors.message}`)); - } - return res.json({ - jumps: result, - jumpsCount: result.items.length - }); - }).catch(next); - }).catch(next); -}); - -router.get('/feed', auth.required, function (req, res, next) { - let limit = 25; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let query = { author: { $in: user.following } }; - Promise.all([ - Jump.find(query) - .skip(Number(offset)) - .limit(Number(limit)) - .populate('author') - .populate('files') - .populate('x2data') - .exec(), - Jump.count(query) - ]).then(function (results) { - let jumps = results[0]; - let jumpsCount = results[1]; - return res.json({ - jumps: jumps.map(function (jump) { - return jump.toJSONFor(user); - }), - jumpsCount: jumpsCount - }); - }).catch(next); - }); -}); - -/** - * return last jump - */ -router.get('/last', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - /*Jump.findOne({ slug: slug }) - .populate('author') - .then(function (jump) { - if (!jump) { - return res.sendStatus(404); - } - req.jump = jump; - return next(); - }).catch(next);*/ - Jump.find({}) - .limit(1) - .sort({ numero: 'desc' }) - .populate('author') - .populate('files') - .populate('x2data') - .exec() - .then(function (jumps) { - if (!jumps) { - return res.sendStatus(404); - } - req.lastjump = jumps[0]; - if (req.lastjump.author._id.toString() !== req.payload.id.toString()) { - return res.status(403).json({ errors: { "Forbidden": "Vous ne disposez pas des autorisations suffisantes" } }); - } - return res.json({ jump: req.lastjump.toJSONFor(user) }); - }).catch(next); - }).catch(next); -}); - -/** - * return a jump - */ -router.get('/:jump', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - if (req.jump.author._id.toString() !== req.payload.id.toString()) { - return res.status(403).json({ errors: { "Forbidden": "Vous ne disposez pas des autorisations suffisantes" } }); - } - Promise.all([ - Jump.findOne({numero: (req.jump.numero - 1)}).exec(), - Jump.findOne({numero: (req.jump.numero + 1)}).exec(), - ]).then(function (results) { - return res.json({ - jump: req.jump.toJSONFor(user), - prevJump: results[0], - nextJump: results[1] - }); - }).catch(next); - }).catch(next); -}); - -/** - * save a jump - */ -router.post('/', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - //let numero = (results[1][0].numero + 1); - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let jump = new Jump(req.body.jump); - jump.author = user; - //jump.numero = numero; - return jump.save().then(function () { - return res.json({ jump: jump.toJSONFor(user) }); - }); - }).catch(next); -}); - -/** - * save a jump file - */ -router.post('/data/:jump', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - if (req.jump.author._id.toString() !== req.payload.id.toString()) { - return res.status(403).json({ errors: { "Forbidden": "Vous ne disposez pas des autorisations suffisantes" } }); - } - /* - console.log(req.jump.files); - return res.json({ jump: req.jump.toJSONFor(user) }); - */ - Object.assign(req.body.file, {_id: new mongoose.Types.ObjectId()}); - let file = new JumpFile(req.body.file); - let files = req.jump.files ? req.jump.files : []; - file.author = user; - files.push(file); - return file.save().then(function () { - Object.assign(req.body.data, {_id: new mongoose.Types.ObjectId()}); - let x2data = new X2DataLog(req.body.data); - x2data.author = user; - return x2data.save().then(function () { - req.jump.files = files; - req.jump.x2data = x2data; - Jump.updateOne({_id: req.jump._id}, {files: files, x2data: x2data._id}).then(function () { - return res.json({ jump: req.jump.toJSONFor(user) }); - }).catch(next); - }).catch(next); - }).catch(next); - }).catch(next); -}); - -/** - * save a jump file - */ -router.post('/file/:jump', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - if (req.jump.author._id.toString() !== req.payload.id.toString()) { - return res.status(403).json({ errors: { "Forbidden": "Vous ne disposez pas des autorisations suffisantes" } }); - } - Object.assign(req.body.file, {_id: new mongoose.Types.ObjectId()}); - let file = new JumpFile(req.body.file); - let files = req.jump.files ? req.jump.files : []; - file.author = user; - files.push(file); - return file.save().then(function () { - Jump.updateOne({_id: req.jump._id}, {files: files}).then(function () { - return res.json({ file: file.toJSONForJump() }); - }).catch(next); - }).catch(next); - }).catch(next); -}); - -/** - * save a jump file - */ -router.post('/kml/:jump', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - if (req.jump.author._id.toString() !== req.payload.id.toString()) { - return res.status(403).json({ errors: { "Forbidden": "Vous ne disposez pas des autorisations suffisantes" } }); - } - Object.assign(req.body.file, { - _id: new mongoose.Types.ObjectId(), - name: `${req.jump.x2data.name}.kml`, - path: `/Volumes/Storage/Skydive/X2_Kmls/${req.jump.date.getFullYear()}/`, - type: 'kml' - }); - let file = new JumpFile(req.body.file); - let files = req.jump.files ? req.jump.files : []; - file.author = user; - files.push(file); - //console.log(chalk.yellow(`jump/${req.jump.x2data.id}/kml`)); - return res.json({ file: file.toJSONForJump() }); - /* - utils.fetchSkydiverIdApi(`jump/${req.jump.x2data.id}/kml`, {}).then(result => { - if (result.errors === undefined) { - console.log(`${utils.getDateTimeISOString()}`, chalk.green(`Réception de l'url du fichier kml SkydiverId`)); - } else { - console.log(`${utils.getDateTimeISOString()}`, chalk.red(`Une erreur ${result.errors.code} '${result.errors.type}' est survenue lors de la réception de l'url du fichier kml SkydiverId : ${result.errors.name} ${result.errors.message}`)); - } - if (result.url !== undefined) { - console.log(chalk.green(result.url)); - } else { - console.log(chalk.red('result.url is undefined')); - } - return res.json({ file: file.toJSONForJump() }); - }).catch(next); - - - - return file.save().then(function () { - Jump.updateOne({_id: req.jump._id}, {files: files}).then(function () { - utils.fetchSkydiverIdApi(`jump/${req.jump.x2data.id}/kml`, {}).then(result => { - if (result.errors === undefined) { - console.log(`${utils.getDateTimeISOString()}`, chalk.green(`Réception de l'url du fichier kml SkydiverId`)); - } else { - console.log(`${utils.getDateTimeISOString()}`, chalk.red(`Une erreur ${result.errors.code} '${result.errors.type}' est survenue lors de la réception de l'url du fichier kml SkydiverId : ${result.errors.name} ${result.errors.message}`)); - } - if (result.url !== undefined) { - console.log(result.url); - } else { - console.log('result.url is undefined'); - } - return res.json({ file: file.toJSONForJump() }); - }).catch(next); - }).catch(next); - }).catch(next); - */ - }).catch(next); -}); - -/** - * update a jump - */ -router.put('/:jump', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - if (req.jump.author._id.toString() !== req.payload.id.toString()) { - return res.status(403).json({ errors: { "Forbidden": "Vous ne disposez pas des autorisations suffisantes" } }); - } - if (typeof req.body.jump.date !== 'undefined') { - req.jump.date = req.body.jump.date; - } - if (typeof req.body.jump.numero !== 'undefined') { - req.jump.numero = req.body.jump.numero; - } - if (typeof req.body.jump.lieu !== 'undefined') { - req.jump.lieu = req.body.jump.lieu; - } - if (typeof req.body.jump.oaci !== 'undefined') { - req.jump.oaci = req.body.jump.oaci; - } - if (typeof req.body.jump.aeronef !== 'undefined') { - req.jump.aeronef = req.body.jump.aeronef; - } - if (typeof req.body.jump.imat !== 'undefined') { - req.jump.imat = req.body.jump.imat; - } - if (typeof req.body.jump.hauteur !== 'undefined') { - req.jump.hauteur = req.body.jump.hauteur; - } - if (typeof req.body.jump.voile !== 'undefined') { - req.jump.voile = req.body.jump.voile; - } - if (typeof req.body.jump.taille !== 'undefined') { - req.jump.taille = req.body.jump.taille; - } - if (typeof req.body.jump.categorie !== 'undefined') { - req.jump.categorie = req.body.jump.categorie; - } - if (typeof req.body.jump.module !== 'undefined') { - req.jump.module = req.body.jump.module; - } - if (typeof req.body.jump.participants !== 'undefined') { - req.jump.participants = req.body.jump.participants; - } - if (typeof req.body.jump.sautants !== 'undefined') { - req.jump.sautants = req.body.jump.sautants; - } - if (typeof req.body.jump.programme !== 'undefined') { - req.jump.programme = req.body.jump.programme; - } - if (typeof req.body.jump.accessoires !== 'undefined') { - req.jump.accessoires = req.body.jump.accessoires; - } - if (typeof req.body.jump.zone !== 'undefined') { - req.jump.zone = req.body.jump.zone; - } - if (typeof req.body.jump.dossier !== 'undefined') { - req.jump.dossier = req.body.jump.dossier; - } - if (typeof req.body.jump.video !== 'undefined') { - req.jump.video = req.body.jump.video; - } - - return req.jump.save().then(function (jump) { - return res.json({ jump: jump.toJSONFor(user) }); - }); - }).catch(next); -}); - -/** - * delete a jump - */ -router.delete('/:jump', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - if (req.jump.author._id.toString() === req.payload.id.toString()) { - return req.jump.remove().then(function () { - return res.json({ deleted: true }); - }); - } else { - return res.status(403).json({ errors: { "Forbidden": "Vous ne disposez pas des autorisations suffisantes" } }); - } - }).catch(next); -}); - -module.exports = router; diff --git a/routes/api/pages.js b/routes/api/pages.js deleted file mode 100644 index 0d21ab9..0000000 --- a/routes/api/pages.js +++ /dev/null @@ -1,285 +0,0 @@ -var router = require('express').Router(), - mongoose = require('mongoose'), - Jump = mongoose.model('Jump'), - User = mongoose.model('User'); -const auth = require('../auth'), - queries = require('../queries'), - utils = require('../utils'); - -router.get('/aeronefs', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let limit = 120; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - Promise.all([ - Jump.find({}) - .limit(1) - .skip(0) - .sort({ numero: 'desc' }) - .populate('author') - .populate('files') - .populate('x2data') - .exec(), - Jump.aggregate(queries.getAeronefsByImatQuery(user._id.toString())) - .skip(Number(offset)) - .limit(Number(limit)) - .exec(), - Jump.aggregate(queries.getAeronefsByImatByYearQuery(user._id.toString())) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - ]).then(function (results) { - if (results[0].length) { - let lastjump = results[0][0].toJSONFor(user); - let aeronefsByImat = results[1].map(function (data) { - return { aeronef: data._id.aeronef, imat: data._id.imat, count: data.count }; - }); - let aeronefsByImatByYear = results[2].map(function (data) { - return { - aeronef: data._id.aeronef, - imat: data._id.imat, - year: data._id.year, - count: data.count - }; - }); - return res.json({ - aeronefsByImat: aeronefsByImat, - aeronefsByImatByYear: aeronefsByImatByYear, - lastjump: lastjump - }); - } else { - return res.status(422).json({ errors: { lastjump: "Aucun saut enregistré pour le moment" } }); - } - }).catch(next); - }).catch(next); -}); - -router.get('/canopies', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let limit = 120; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - Promise.all([ - Jump.find({}) - .limit(1) - .skip(0) - .sort({ numero: 'desc' }) - .populate('author') - .populate('files') - .populate('x2data') - .exec(), - Jump.aggregate(queries.getCanopiesBySizeQuery(user._id.toString())) - .skip(Number(offset)) - .limit(Number(limit)) - .exec(), - Jump.aggregate(queries.getCanopiesBySizeByYearQuery(user._id.toString())) - .skip(Number(offset)) - .limit(Number(limit)) - .exec(), - Jump.aggregate(queries.getCanopiesBySizeByModelQuery(user._id.toString())) - .skip(Number(offset)) - .limit(Number(limit)) - .exec(), - Jump.aggregate(queries.getCanopiesBySizeByModelByYearQuery(user._id.toString())) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - ]).then(function (results) { - if (results[0].length) { - let lastjump = results[0][0].toJSONFor(user); - let canopiesBySize = results[1].map(function (data) { - return { taille: data._id.taille, count: data.count }; - }); - let canopiesBySizeByYear = results[2].map(function (data) { - return { - taille: data._id.taille, - year: data._id.year, - count: data.count - }; - }); - let canopiesBySizeByModel = results[3].map(function (data) { - return { - taille: data._id.taille, - voile: data._id.voile, - count: data.count - }; - }); - let canopiesBySizeByModelByYear = results[4].map(function (data) { - return { - taille: data._id.taille, - voile: data._id.voile, - year: data._id.year, - count: data.count - }; - }); - return res.json({ - canopiesBySize: canopiesBySize, - canopiesBySizeByYear: canopiesBySizeByYear, - canopiesBySizeByModel: canopiesBySizeByModel, - canopiesBySizeByModelByYear: canopiesBySizeByModelByYear, - lastjump: lastjump - }); - } else { - return res.status(422).json({ errors: { lastjump: "Aucun saut enregistré pour le moment" } }); - } - }).catch(next); - }).catch(next); -}); - -router.get('/dropzones', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let limit = 120; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - Promise.all([ - Jump.find({}) - .limit(1) - .skip(0) - .sort({ numero: 'desc' }) - .populate('author') - .populate('files') - .populate('x2data') - .exec(), - Jump.aggregate(queries.getDropZonesByOaciQuery(user._id.toString())) - .skip(Number(offset)) - .limit(Number(limit)) - .exec(), - Jump.aggregate(queries.getDropZonesByOaciByYearQuery(user._id.toString())) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - ]).then(function (results) { - if (results[0].length) { - let lastjump = results[0][0].toJSONFor(user); - let dropZonesByOaci = results[1].map(function (data) { - return { lieu: data._id.lieu, oaci: data._id.oaci, count: data.count }; - }); - let dropZonesByOaciByYear = results[2].map(function (data) { - return { - lieu: data._id.lieu, - oaci: data._id.oaci, - year: data._id.year, - count: data.count - }; - }); - return res.json({ - dropZonesByOaci: dropZonesByOaci, - dropZonesByOaciByYear: dropZonesByOaciByYear, - lastjump: lastjump - }); - } else { - return res.status(422).json({ errors: { lastjump: "Aucun saut enregistré pour le moment" } }); - } - }).catch(next); - }).catch(next); -}); - -router.get('/jumps', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - let limit = 120; - let offset = 0; - if (typeof req.query.limit !== 'undefined') { - limit = req.query.limit; - } - if (typeof req.query.offset !== 'undefined') { - offset = req.query.offset; - } - Promise.all([ - Jump.find({}) - .limit(1) - .skip(0) - .sort({ numero: 'desc' }) - .populate('author') - .populate('files') - .populate('x2data') - .exec(), - Jump.aggregate(queries.getJumpByYearsQuery(user._id.toString())) - .skip(Number(offset)) - .limit(Number(limit)) - .exec(), - Jump.aggregate(queries.getJumpsByCategoryQuery(user._id.toString())) - .skip(Number(offset)) - .limit(Number(limit)) - .exec(), - Jump.aggregate(queries.getJumpsByModuleQuery(user._id.toString())) - .skip(Number(offset)) - .limit(Number(limit)) - .exec(), - Jump.aggregate(queries.getJumpsByDateQuery(user._id.toString())) - .skip(Number(offset)) - .limit(Number(limit)) - .exec(), - Jump.aggregate(queries.getJumpsByModuleByDateQuery(user._id.toString())) - .skip(Number(offset)) - .limit(Number(limit)) - .exec() - //utils.fetchSkydiverIdApi('jumps') - ]).then(function (results) { - if (results[0].length) { - let lastjump = results[0][0].toJSONFor(user); - let jumpsByYears = results[1].map(function (data) { - return { year: data._id.year, count: data.count }; - }); - let jumpsByCategory = results[2].map(function (data) { - return { categorie: data._id.categorie, count: data.count }; - }); - let jumpsByModule = results[3].map(function (data) { - return { categorie: data._id.categorie, module: data._id.module, count: data.count }; - }); - let jumpsByDate = results[4].map(function (data) { - return { year: data._id.year, month: data._id.month, count: data.count }; - }); - let jumpsByDateByModule = results[5].map(function (data) { - return { - categorie: data._id.categorie, - module: data._id.module, - year: data._id.year, - month: data._id.month, - count: data.count - }; - }); - //let jumpsFromSkydiverIdApi = results[6]; - return res.json({ - jumpsByCategory: jumpsByCategory, - jumpsByDate: jumpsByDate, - jumpsByDateByModule: jumpsByDateByModule, - jumpsByModule: jumpsByModule, - jumpsByYears: jumpsByYears, - //jumpsFromSkydiverIdApi: jumpsFromSkydiverIdApi, - lastjump: lastjump - }); - } else { - return res.status(422).json({ errors: { lastjump: "Aucun saut enregistré pour le moment" } }); - } - }).catch(next); - }).catch(next); -}); - -module.exports = router; diff --git a/routes/api/profiles.js b/routes/api/profiles.js deleted file mode 100644 index 3fb26be..0000000 --- a/routes/api/profiles.js +++ /dev/null @@ -1,57 +0,0 @@ -var router = require('express').Router(), - mongoose = require('mongoose'), - User = mongoose.model('User'); -const auth = require('../auth'); - -// Preload user profile on routes with ':username' -router.param('username', function (req, res, next, username) { - User.findOne({ username: username }).then(function (user) { - if (!user) { - return res.sendStatus(404); - } - req.profile = user; - - return next(); - }).catch(next); -}); - -router.get('/:username', auth.optional, function (req, res) { - if (req.payload) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.json({ profile: req.profile.toProfileJSONFor(false) }); - } - return res.json({ profile: req.profile.toProfileJSONFor(user) }); - }); - } else { - return res.json({ profile: req.profile.toProfileJSONFor(false) }); - } -}); - -router.post('/:username/follow', auth.required, function (req, res, next) { - let profileId = req.profile._id; - - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - return user.follow(profileId).then(function () { - return res.json({ profile: req.profile.toProfileJSONFor(user) }); - }); - }).catch(next); -}); - -router.delete('/:username/follow', auth.required, function (req, res, next) { - let profileId = req.profile._id; - - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - return user.unfollow(profileId).then(function () { - return res.json({ profile: req.profile.toProfileJSONFor(user) }); - }); - }).catch(next); -}); - -module.exports = router; diff --git a/routes/api/qcm.js b/routes/api/qcm.js deleted file mode 100644 index 3c2dad6..0000000 --- a/routes/api/qcm.js +++ /dev/null @@ -1,157 +0,0 @@ -var router = require('express').Router(), - mongoose = require('mongoose'), - Qcm = mongoose.model('Qcm'), - QcmCategory = mongoose.model('QcmCategory'), - QcmQuestion = mongoose.model('QcmQuestion'), - QcmChoice = mongoose.model('QcmChoice'), - User = mongoose.model('User'); -const auth = require('../auth'); - -// Preload qcm objects on routes with ':type' -router.param('type', function (req, res, next, type) { - Qcm.findOne({ name: type }) - .populate('categories') - .then(qcm => { - if (!qcm) { - return res.status(404).json({ errors: { "Not Found": "Le QCM est introuvable ou inexistant." } }); - } - req.qcm = qcm; - Promise.all( - req.qcm.categories.map(category => { - return category.populate('questions').then(() => { - return Promise.all( - category.questions.map(question => question.populate('choices')) - ).then(() => { - return category; - }).catch(next); - }); - }) - ).then(() => { - return next(); - }).catch(next); - }).catch(next); -}); - -/** - * return all qcm - */ -router.get('/', auth.required, function (req, res, next) { - Promise.all([ - req.payload ? User.findById(req.payload.id) : null - ]).then(function (results) { - let user = results[0]; - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - return res.json({ qcm: [] }); - }).catch(next); -}); - -/** - * return a qcm - */ -router.get('/type/:type', auth.required, function (req, res, next) { - Promise.all([ - req.payload ? User.findById(req.payload.id) : null - ]).then(function (results) { - let user = results[0]; - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - return res.json({ qcm: req.qcm.toJSONFor() }); - }).catch(next); -}); - -/** - * save an array of qcm question choice - */ -router.post('/choices/', auth.required, function (req, res, next) { - Promise.all([ - req.payload ? User.findById(req.payload.id) : null, - QcmQuestion - .findOne({num: req.body.question.num}) - .populate('choices') - .exec() - ]).then(async function (results) { - const user = results[0]; - //let numero = (results[1][0].numero + 1); - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - if (user.role !== 'Admin') { - return res.status(403).json({ errors: { "Forbidden": "Vous ne disposez pas des autorisations suffisantes" } }); - } - const question = results[1]; - if (!question) { - return res.status(422).json({ errors: { question: "question introuvable" } }); - } - let choices = []; - Promise.all( - req.body.question.choices.map(data => { - const choiceId = new mongoose.Types.ObjectId(); - const choice = new QcmChoice({ _id: choiceId, index: data.index, libelle: data.libelle, correct: data.correct}); - choices.push(choiceId); - return choice.save(); - }) - ).then(function () { - question.choices = [...choices]; - question.save().then(function () { - QcmQuestion - .findOne({num: req.body.question.num}) - .populate('choices') - .exec() - .then(function (question) { - return res.json({ question: question.toJSONFor() }); - }).catch(next); - }).catch(next); - }).catch(next); - }).catch(next); -}); - -/** - * save an array of qcm category questions - */ -router.post('/questions/', auth.required, function (req, res, next) { - Promise.all([ - req.payload ? User.findById(req.payload.id) : null, - QcmCategory - .findOne({num: req.body.category.num}) - .populate('questions') - .exec() - ]).then(async function (results) { - const user = results[0]; - //let numero = (results[1][0].numero + 1); - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - if (user.role !== 'Admin') { - return res.status(403).json({ errors: { "Forbidden": "Vous ne disposez pas des autorisations suffisantes" } }); - } - const category = results[1]; - if (!category) { - return res.status(422).json({ errors: { category: "catégorie introuvable" } }); - } - let questions = []; - Promise.all( - req.body.category.questions.map(data => { - const questionId = new mongoose.Types.ObjectId(); - const question = new QcmQuestion({ _id: questionId, num: data.num, libelle: data.libelle, choices: []}); - questions.push(questionId); - return question.save(); - }) - ).then(function () { - category.questions = [...questions]; - category.save().then(function () { - QcmCategory - .findOne({num: req.body.category.num}) - .populate('questions') - .exec() - .then(function (category) { - return res.json({ category: category.toJSONFor() }); - }).catch(next); - }).catch(next); - }).catch(next); - }).catch(next); -}); - -module.exports = router; \ No newline at end of file diff --git a/routes/api/tags.js b/routes/api/tags.js deleted file mode 100755 index 8f9c4a6..0000000 --- a/routes/api/tags.js +++ /dev/null @@ -1,12 +0,0 @@ -var router = require('express').Router(); -var mongoose = require('mongoose'); -var Article = mongoose.model('Article'); - -// return a list of tags -router.get('/', function(req, res, next) { - Article.find().distinct('tagList').then( tags => { - return res.json({tags: tags}); - }).catch(next); -}); - -module.exports = router; diff --git a/routes/api/users.js b/routes/api/users.js deleted file mode 100644 index f904be4..0000000 --- a/routes/api/users.js +++ /dev/null @@ -1,126 +0,0 @@ -var router = require('express').Router(), - mongoose = require('mongoose'), - User = mongoose.model('User'); -const passport = require('passport'), - auth = require('../auth'); - -router.get('/user', auth.required, function (req, res, next) { - //console.log(req.payload); - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - return res.json({ user: user.toAuthJSON() }); - }).catch(next); -}); - -router.put('/user', auth.required, function (req, res, next) { - User.findById(req.payload.id).then(function (user) { - if (!user) { - return res.status(401).json({ errors: { "Unauthorized": "autentification requise" } }); - } - if (typeof req.body.user.username !== 'undefined') { - user.username = req.body.user.username; - } - if (typeof req.body.user.email !== 'undefined') { - user.email = req.body.user.email; - } - if (typeof req.body.user.firstname !== 'undefined') { - user.firstname = req.body.user.firstname; - } - if (typeof req.body.user.lastname !== 'undefined') { - user.lastname = req.body.user.lastname; - } - if (typeof req.body.user.phone !== 'undefined') { - user.phone = req.body.user.phone; - } - if (typeof req.body.user.licence !== 'undefined') { - user.licence = req.body.user.licence; - } - if (typeof req.body.user.poids !== 'undefined') { - user.poids = req.body.user.poids; - } - if (typeof req.body.user.image !== 'undefined') { - user.image = req.body.user.image; - } - if (typeof req.body.user.bg_image !== 'undefined') { - user.bg_image = req.body.user.bg_image; - } - if (typeof req.body.user.password !== 'undefined') { - user.setPassword(req.body.user.password); - } - if (typeof req.body.user.role !== 'undefined') { - user.role = req.body.user.role; - } - - return user.save().then(function () { - return res.json({ user: user.toAuthJSON() }); - }); - }).catch(next); -}); - -router.post('/users/login', function (req, res, next) { - console.log(req.body.user); - if (!req.body.user.email) { - return res.status(422).json({ errors: { email: "email can't be blank" } }); - } - if (!req.body.user.password) { - return res.status(422).json({ errors: { password: " password can't be blank" } }); - } - passport.authenticate('local', { session: false }, function (err, user, info) { - if (err) { - return next(err); - } - if (user) { - user.token = user.generateJWT(); - return res.json({ user: user.toAuthJSON() }); - } else { - return res.status(422).json(info); - } - })(req, res, next); -}); - -router.get('/authenticate', function (req, res, next) { - passport.authenticate('headerapikey', { session: false }, function (err, application, info) { - if (err) { - return res.status(err.status || 500).json({message: "An authentication error occured.", err: err.message}); - //return next(err); - } - if (!application) { - return res.status(401).json({message: "Unauthorized - You are not allowed to access this resource.", err: err, info: info}); - } - if (application.author) { - application.author.token = application.author.generateJWT(); - return res.json({ user: application.author.toAuthJSON(), application: application.toAuthJSON() }); - } else { - return res.status(422).json(info); - } - })(req, res, next); -}); -router.post('/users', function (req, res, next) { - console.log('ici post users'); - let user = new User(); - if (typeof req.body.user.username !== 'undefined') { - user.username = req.body.user.username; - } else { - user.username = `${req.body.user.firstname}_${req.body.user.lastname}`; - } - user.email = req.body.user.email; - user.firstname = req.body.user.firstname; - user.lastname = req.body.user.lastname; - user.phone = req.body.user.phone; - if (typeof req.body.user.licence !== 'undefined') { - user.licence = req.body.user.licence; - } - if (typeof req.body.user.poids !== 'undefined') { - user.poids = req.body.user.poids; - } - user.setPassword(req.body.user.password); - user.role = 'User'; - - user.save().then(function () { - return res.json({ user: user.toAuthJSON() }); - }).catch(next); -}); - -module.exports = router; diff --git a/routes/auth.js b/routes/auth.js deleted file mode 100644 index fa912c3..0000000 --- a/routes/auth.js +++ /dev/null @@ -1,94 +0,0 @@ - -//var jwt = require('express-jwt'); -var { expressjwt: jwt } = require("express-jwt"), - secret = require('../src/config').secret, - bcrypt = require('bcrypt'); -const { v4 } = require('uuid'), - passport = require('passport'), - auths = ['Api-Key', 'Basic', 'Bearer', 'Token']; - -function getTokenFromHeader(req) { - if(req.headers.authorization && auths.indexOf(req.headers.authorization.split(' ')[0]) !== -1) { - return req.headers.authorization.split(' ')[1]; - } - return null; -} - -const auth = { - requiredJwt: jwt({ - secret: secret, - algorithms: ['HS256'], - requestProperty: 'payload', - getToken: getTokenFromHeader - }), - optional: jwt({ - secret: secret, - algorithms: ['HS256'], - requestProperty: 'payload', - credentialsRequired: false, - getToken: getTokenFromHeader - }), - required: async (req, res, next) => { - if(req.headers.authorization && req.headers.authorization.split(' ')[0] === process.env.AUTHORIZATION_PREFIX) { - passport.authenticate('headerapikey', { session: false }, function (err, application, info) { - if (err) { - //return res.json({message: "An authentication error occured (required).", err: err.message}); - //return res.status(err.status || 500).json({message: "An authentication error occured (required).", err: err.message}); - return next({message: "An authentication error occured.", err: err.message}); - } - if (!application) { - return res.status(401).json({message: "Unauthorized - You are not allowed to access this resource.", err: err, info: info}); - } - req.application = application; - req.payload = {id: application.author._id}; - //console.log(application); - //console.log(application.author._id); - return next(); - /* - return jwt({ - secret: secret, - algorithms: ['HS256'], - requestProperty: 'payload', - getToken: application.author.toAuthJSON().token - })(req, res, next); - */ - })(req, res, next); - } else { - return jwt({ - secret: secret, - algorithms: ['HS256'], - requestProperty: 'payload', - getToken: getTokenFromHeader - })(req, res, next); - } - }, - getAuthType: (req) => { - if(req.headers.authorization && auths.indexOf(req.headers.authorization.split(' ')[0]) !== -1) { - let value = req.headers.authorization.split(' ')[0]; - return value; - } - return null; - }, - generateAPIKey: async () => { - const key = v4().replace(/-/g, ''); - const salt = secret; - // Génération d'un salt aléatoire : const salt = await Promise.resolve(bcrypt.genSalt(10)); - const maskedKey = `${key.slice(0, 4)}...${key.slice(-4)}`; - const encryptedKey = await Promise.resolve(bcrypt.hash(key, salt)); - return { key: key, masked: maskedKey, encrypted: encryptedKey}; - }, - authenticateKey: async (req, res, next) => { - passport.authenticate('headerapikey', { session: false }, function (err, application, info) { - if (err) { - return res.status(err.status || 500).json({message: "An authentication error occured (authenticateKey).", err: err.message}); - } - if (!application) { - return res.status(401).json({message: "Unauthorized - You are not allowed to access this resource.", err: err, info: info}); - } - req.application = application; - return next(); - })(req, res, next); - } -}; - -module.exports = auth; diff --git a/routes/index.js b/routes/index.js deleted file mode 100644 index 77f8a4d..0000000 --- a/routes/index.js +++ /dev/null @@ -1,4 +0,0 @@ -var routes = require('express').Router(); -routes.use('/api', require('./api')); - -module.exports = routes; diff --git a/routes/queries.js b/routes/queries.js deleted file mode 100644 index 1ae0654..0000000 --- a/routes/queries.js +++ /dev/null @@ -1,507 +0,0 @@ -const queries = { - getJumpsByCategoryQuery: (userId) => { - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': userId } ] - } - } - }, { - '$group': { - '_id': { - 'categorie': '$categorie' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': { - '_id': 1 - } - } - ]; - - return query; - }, - getJumpsByDateQuery: (userId) => { - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': userId } ] - } - } - }, { - '$project': { - '_id': 0, - 'year': { - '$year': '$date' - }, - 'month': { - '$month': '$date' - } - } - }, { - '$group': { - '_id': { - 'year': '$year', - 'month': '$month' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': { - '_id': 1 - } - } - ]; - - return query; - }, - getJumpsByModuleByDateQuery: (userId) => { - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': userId } ] - } - } - }, { - '$project': { - '_id': 0, - 'module': 1, - 'categorie': 1, - 'year': { - '$year': '$date' - }, - 'month': { - '$month': '$date' - } - } - }, { - '$group': { - '_id': { - 'module': '$module', - 'categorie': '$categorie', - 'year': '$year', - 'month': '$month' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': { - '_id': 1 - } - } - ]; - return query; - }, - getJumpsByModuleQuery: (userId) => { - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': userId } ] - } - } - }, { - '$project': { - '_id': 0, - 'categorie': 1, - 'module': 1 - } - }, { - '$group': { - '_id': { - 'categorie': '$categorie', - 'module': '$module' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': { - '_id': 1 - } - } - ]; - return query; - }, - getJumpByYearsQuery: (userId) => { - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': userId } ] - } - } - }, { - '$project': { - '_id': 0, - 'year': { - '$year': '$date' - } - } - }, { - '$group': { - '_id': { - 'year': '$year' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': { - '_id': 1 - } - } - ]; - - return query; - }, - getAeronefsByImatQuery: (userId) => { - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': userId } ] - } - } - }, { - '$group': { - '_id': { - 'aeronef': '$aeronef', - 'imat': '$imat' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': - { - 'count': -1 - }, - } - ]; - - return query; - }, - getAeronefsByImatByYearQuery: (userId) => { - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': userId } ] - } - } - }, { - '$project': { - '_id': 0, - 'aeronef': 1, - 'imat': 1, - 'year': { - '$year': '$date' - } - } - }, { - '$group': { - '_id': { - 'aeronef': '$aeronef', - 'imat': '$imat', - 'year': '$year' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': { - '_id': 1 - } - } - ]; - - return query; - }, - getCanopiesBySizeQuery: (userId) => { - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': userId } ] - } - } - }, { - '$group': { - '_id': { - 'taille': '$taille' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': - { - '_id': 1 - }, - } - ]; - - return query; - }, - getCanopiesBySizeByYearQuery: (userId) => { - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': userId } ] - } - } - }, { - '$project': { - '_id': 0, - 'taille': 1, - 'year': { - '$year': '$date' - } - } - }, { - '$group': { - '_id': { - 'taille': '$taille', - 'year': '$year' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': { - '_id': 1 - } - } - ]; - - return query; - }, - getCanopiesBySizeByModelQuery: (userId) => { - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': userId } ] - } - } - }, { - '$group': { - '_id': { - 'taille': '$taille', - 'voile': '$voile' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': - { - '_id': 1 - }, - } - ]; - - return query; - }, - getCanopiesBySizeByModelByYearQuery: (userId) => { - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': userId } ] - } - } - }, { - '$project': { - '_id': 0, - 'voile': 1, - 'taille': 1, - 'year': { - '$year': '$date' - } - } - }, { - '$group': { - '_id': { - 'taille': '$taille', - 'voile': '$voile', - 'year': '$year' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': { - '_id': 1 - } - } - ]; - - return query; - }, - getDropZonesByOaciQuery: (userId) => { - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': userId } ] - } - } - }, { - '$group': { - '_id': { - 'lieu': '$lieu', - 'oaci': '$oaci' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': - { - '_id': 1 - }, - } - ]; - - return query; - }, - getDropZonesByOaciByYearQuery: (userId) => { - let query = [ - { - '$match': { - '$expr': { - '$eq': [ '$author' , { '$toObjectId': userId } ] - } - } - }, { - '$project': { - '_id': 0, - 'lieu': 1, - 'oaci': 1, - 'year': { - '$year': '$date' - } - } - }, { - '$group': { - '_id': { - 'lieu': '$lieu', - 'oaci': '$oaci', - 'year': '$year' - }, - 'count': { - '$sum': 1 - } - } - }, { - '$sort': { - '_id': 1 - } - } - ]; - - return query; - }, - getJumpsByDayQuery: (userId, dateRangeStart = null, dateRangeEnd = null) => { - if (dateRangeStart === null) { - dateRangeStart = '1970-01-01 00:00:00'; - } - if (dateRangeEnd === null) { - const year = new Date().getFullYear(); - dateRangeEnd = `${year}-12-31 23:59:59`; - } - let query = [ - { - $match: { - $expr: { - $and: [ - { - $eq: [ '$author' , { '$toObjectId': userId } ] - }, - { - $gte: ['$date', new Date(dateRangeStart)] - }, - { - $lte: ['$date', new Date(dateRangeEnd)] - } - ] - } - } - }, { - $project: { - _id: 1, - slug: "$slug", - numero: "$numero", - date: "$date", - year: { - $year: "$date" - }, - month: { - $month: "$date" - }, - day: { - $dayOfMonth: "$date" - } - } - }, - { - $group: { - _id: { - year: "$year", - month: "$month", - day: "$day" - }, - jumps: { - $addToSet: { - _id: "$_id", - numero: "$numero", - slug: "$slug", - date: "$date" - } - }, - count: { - $sum: 1 - } - } - }, - { - $sort: { - _id: 1, - } - }, - { - $project: { - _id: 0, - jumps: 1, - count: 1 - } - } - ]; - - return query; - } -}; - -module.exports = queries; diff --git a/src/config/index.js b/src/config/index.js index 3346025..8a25051 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -1,6 +1,15 @@ + + const config = { secret: process.env.SECRET || 'acapisecret', - session_lifetime: process.env.SESSION_LIFETIME || 21600 // 21600 secondes = 6 heures + session_lifetime: parseInt(process.env.SESSION_LIFETIME) || 21600, // 21600 secondes = 6 heures + initAuth: () => { + require('./passport-local'); + }, + initApiKey: () => { + require('./passport-headerapikey'); + } }; + module.exports = config; diff --git a/src/config/passport-headerapikey.js b/src/config/passport-headerapikey.js new file mode 100644 index 0000000..f555fc8 --- /dev/null +++ b/src/config/passport-headerapikey.js @@ -0,0 +1,25 @@ +var secret = require('.').secret, + bcrypt = require('bcrypt'); +const passport = require('passport'); +var HeaderAPIKeyStrategy = require('passport-headerapikey').HeaderAPIKeyStrategy; +var mongoose = require('mongoose'); +var Application = mongoose.model('Application'); + + +passport.use('headerapikey', new HeaderAPIKeyStrategy( + { header: 'Authorization', prefix: `${process.env.AUTHORIZATION_PREFIX} ` }, + false, + function (apikey, done) { + const salt = secret; + Promise.resolve(bcrypt.hash(apikey, salt)).then(function (encryptedKey) { + Application.findOne({ encryptedKey: encryptedKey }) + .populate('author') + .then(function (application) { + if (!application) { + return done({message: "Application can't be found.", status: 404}, false, false); + } + return done(null, application); + }); + }).catch(done); + } +)); diff --git a/src/config/passport-local.js b/src/config/passport-local.js new file mode 100644 index 0000000..6a41297 --- /dev/null +++ b/src/config/passport-local.js @@ -0,0 +1,18 @@ +const passport = require('passport'); +var LocalStrategy = require('passport-local').Strategy; + +const { UserService } = require('../services'); + +passport.use('local', new LocalStrategy({ + usernameField: 'user[email]', + passwordField: 'user[password]' +}, function (email, password, done) { + UserService.getUserByEmail({ email }).then(function (user) { + //User.findOne({ email: email }).then(function (user) { + //console.log(user); + if (!user || !user.validPassword(password)) { + return done(null, false, { errors: { 'email ou mot de passe': 'invalide' } }); + } + return done(null, user); + }).catch(done); +})); diff --git a/src/database/connectDb.js b/src/database/connectDb.js index dd8982e..4e24655 100644 --- a/src/database/connectDb.js +++ b/src/database/connectDb.js @@ -2,8 +2,7 @@ const chalk = require('chalk'); const mongoose = require('mongoose'); - -const DB = require('.'); +const DB = require('./mysql'); const sequelize = require('./config/sequelize'); const associate = require('./relationships'); const utils = require('../utils'); diff --git a/src/database/models/mongo/User.js b/src/database/models/mongo/User.js index 8709c61..9d2e0e4 100644 --- a/src/database/models/mongo/User.js +++ b/src/database/models/mongo/User.js @@ -2,8 +2,7 @@ var mongoose = require('mongoose'); var uniqueValidator = require('mongoose-unique-validator'); var crypto = require('crypto'); var jwt = require('jsonwebtoken'), - secret = require('../../../config').secret, - session_lifetime = require('../../../config').session_lifetime; + config = require('../../../config'); var UserSchema = new mongoose.Schema({ email: { type: String, lowercase: true, unique: true, required: [true, "email can't be blank"], match: [/\S+@\S+\.\S+/, 'is invalid'], index: true }, @@ -36,13 +35,13 @@ UserSchema.methods.setPassword = function (password) { UserSchema.methods.generateJWT = function () { var today = new Date(); - var exp = new Date(today.getTime() + (session_lifetime * 1000)); + var exp = new Date(today.getTime() + (config.session_lifetime * 1000)); return jwt.sign({ id: this._id, username: this.username, exp: parseInt(exp.getTime() / 1000) - }, secret, { algorithm: 'HS256' }); + }, config.secret, { algorithm: 'HS256' }); }; UserSchema.methods.toAuthJSON = function () { diff --git a/src/database/models/mysql/User.js b/src/database/models/mysql/User.js index 14d80f8..13201bc 100644 --- a/src/database/models/mysql/User.js +++ b/src/database/models/mysql/User.js @@ -1,8 +1,7 @@ const { DataTypes, Model } = require("sequelize"); var crypto = require('crypto'); var jwt = require('jsonwebtoken'), - secret = require('../../../config').secret, - session_lifetime = require('../../../config').session_lifetime; + config = require('../../../config') const sequelize = require("../../config/sequelize"); @@ -100,13 +99,13 @@ const UserModel = () => { User.prototype.generateJWT = function () { var today = new Date(); - var exp = new Date(today.getTime() + (session_lifetime * 1000)); + var exp = new Date(today.getTime() + (config.session_lifetime * 1000)); return jwt.sign({ id: this.id, username: this.username, exp: parseInt(exp.getTime() / 1000) - }, secret, { algorithm: 'HS256' }); + }, config.secret, { algorithm: 'HS256' }); }; User.prototype.toAuthJSON = function () { diff --git a/src/database/models/mysql/index.js b/src/database/models/mysql/index.js new file mode 100644 index 0000000..09b1eac --- /dev/null +++ b/src/database/models/mysql/index.js @@ -0,0 +1,8 @@ +exports.Article = require('./Article'); +exports.ArticleTag = require('./ArticleTag'); +exports.Comment = require('./Comment'); +exports.Favorite = require('./Favorite'); +exports.Follower = require('./Follower'); +exports.Tag = require('./Tag'); +exports.TagList = require('./TagList'); +exports.User = require('./User'); \ No newline at end of file diff --git a/src/database/index.js b/src/database/mysql.js similarity index 56% rename from src/database/index.js rename to src/database/mysql.js index 8407c78..017fec9 100644 --- a/src/database/index.js +++ b/src/database/mysql.js @@ -1,3 +1,4 @@ +var DataTypes = require("sequelize").DataTypes; const sequelize = require('./config/sequelize'); const ArticleModel = require('./models/mysql/Article'); const ArticleTageModel = require('./models/mysql/ArticleTag'); @@ -10,14 +11,14 @@ const UserModel = require('./models/mysql/User'); const DB = { sequelize, - User: UserModel(sequelize), - Article: ArticleModel(sequelize), - ArticleTag: ArticleTageModel(sequelize), - Comment: CommentModel(sequelize), - Favorite: FavoriteModel(sequelize), - Follower: FollowerModel(sequelize), - Tag: TagModel(sequelize), - TagList: TagListModel(sequelize), + User: UserModel(sequelize, DataTypes), + Article: ArticleModel(sequelize, DataTypes), + ArticleTag: ArticleTageModel(sequelize, DataTypes), + Comment: CommentModel(sequelize, DataTypes), + Favorite: FavoriteModel(sequelize, DataTypes), + Follower: FollowerModel(sequelize, DataTypes), + Tag: TagModel(sequelize, DataTypes), + TagList: TagListModel(sequelize, DataTypes), }; module.exports = DB; diff --git a/src/database/relationships/index.js b/src/database/relationships/index.js index 7be5a1c..8e7939e 100644 --- a/src/database/relationships/index.js +++ b/src/database/relationships/index.js @@ -1,4 +1,4 @@ -const DB = require('../index'); +const DB = require('../mysql'); const associate = () => { /* diff --git a/src/routes/index.js b/src/routes/index.js index 4e1fb5d..77f8a4d 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -2,16 +2,3 @@ var routes = require('express').Router(); routes.use('/api', require('./api')); module.exports = routes; - -/* -const express = require('express'); -const articleRouter = require('./api/article.routes'); -const userRouter = require('./api/user.routes'); - -const routes = express.Router(); - -routes.use('/user', userRouter); -routes.use('/article', articleRouter); - -module.exports = routes; -*/ \ No newline at end of file diff --git a/src/services/article.service.js b/src/services/article.service.js index 044c7a8..ca2f9a7 100644 --- a/src/services/article.service.js +++ b/src/services/article.service.js @@ -1,4 +1,4 @@ -const DB = require('../database'); +const DB = require('../database/mysql'); const { Article } = DB; diff --git a/src/services/comment.service.js b/src/services/comment.service.js index e2c8e79..b21eab9 100644 --- a/src/services/comment.service.js +++ b/src/services/comment.service.js @@ -1,4 +1,4 @@ -const DB = require('../database'); +const DB = require('../database/mysql'); const { Comment } = DB; diff --git a/src/services/tag.service.js b/src/services/tag.service.js index 34acb57..0f4602f 100644 --- a/src/services/tag.service.js +++ b/src/services/tag.service.js @@ -1,4 +1,4 @@ -const DB = require('../database'); +const DB = require('../database/mysql'); const { Tag } = DB; diff --git a/src/services/user.service.js b/src/services/user.service.js index 3dd22c0..089e380 100644 --- a/src/services/user.service.js +++ b/src/services/user.service.js @@ -1,4 +1,4 @@ -const DB = require('../database'); +const DB = require('../database/mysql'); const { User } = DB;