diff --git a/backend/app/config/checkFormat.config.js b/backend/app/config/checkFormat.config.js deleted file mode 100644 index 6b74fe0..0000000 --- a/backend/app/config/checkFormat.config.js +++ /dev/null @@ -1,9 +0,0 @@ -const {sendError} = require ("./response.config"); - -function checkFormat(req, res){ - if(req.get('Content-Type') !== 'application/json') { - return sendError(res, 401, -1, "Invalid header format (please use JSON)"); - } - return true; // Is valid -} -module.exports = checkFormat diff --git a/backend/app/config/host.config.js b/backend/app/config/host.config.js new file mode 100644 index 0000000..d743011 --- /dev/null +++ b/backend/app/config/host.config.js @@ -0,0 +1,8 @@ +module.exports = { + youtube: { + baseAPIUrl: 'https://www.youtube.com/' + }, + dailymotion: { + baseAPIUrl: 'https://api.dailymotion.com/' + } +}; diff --git a/backend/app/config/role.config.js b/backend/app/config/role.config.js new file mode 100644 index 0000000..32851a0 --- /dev/null +++ b/backend/app/config/role.config.js @@ -0,0 +1,5 @@ +module.exports = { + User: 0, + Advertiser: 5, + Admin: 10 +}; diff --git a/backend/app/config/sessionJWT.config.js b/backend/app/config/sessionJWT.config.js index b5b76cb..bca0408 100644 --- a/backend/app/config/sessionJWT.config.js +++ b/backend/app/config/sessionJWT.config.js @@ -12,9 +12,10 @@ const JWTRS256_PRIVATE_KEY = Buffer.from(process.env.JWTRS256_PRIVATE_KEY, 'base const JWTRS256_PUBLIC_KEY = Buffer.from(process.env.JWTRS256_PUBLIC_KEY, 'base64').toString('utf-8'); -function createSessionJWT (login, role) { +function createSessionJWT (id, login, role) { return sessionJWTConfig.sign( { + id: id, login: login, role: role, midExp: Math.floor(Date.now() / 1000) + 1800 @@ -29,21 +30,22 @@ function createSessionJWT (login, role) { function createSessionCookie(req, res, payload) { let jwtToken; - if (typeof payload.login !== 'undefined' && + if (typeof payload.id !== 'undefined' && + typeof payload.login !== 'undefined' && typeof payload.role !== 'undefined' && typeof payload.midExp !== 'undefined' && (Math.floor(Date.now() / 1000) <= payload.midExp)) { jwtToken = req.headers.cookie; } else { - jwtToken = createSessionJWT(payload.login, payload.role); + jwtToken = createSessionJWT(payload.id, payload.login, payload.role); } res.cookie('SESSIONID', jwtToken, {httpOnly:true, secure:false}); } function decodeSessionCookie(sessionid) { if (typeof sessionid === 'undefined') { - return {login: -1, role: -1}; + return {id: -1, login: -1, role: -1}; } try { const token = sessionJWTConfig.verify( @@ -53,7 +55,7 @@ function decodeSessionCookie(sessionid) { return {token: token}; } catch (err) { - return {login: -1, role: -1}; + return {id: -1, login: -1, role: -1}; } } @@ -83,7 +85,7 @@ function checkLogin(req, res, role=null){ if(role === null){ return token; } else{ - if(token.role !== 'undefined' && token.role === role){ + if(token.role !== 'undefined' && role.includes(token.role)){ return token; } else{ return sendError(res, 500, -1, "User doesn't have permission.", token); diff --git a/backend/app/controllers/ad.controller.js b/backend/app/controllers/ad.controller.js new file mode 100644 index 0000000..5845b33 --- /dev/null +++ b/backend/app/controllers/ad.controller.js @@ -0,0 +1,53 @@ +const db = require("../models/mongodb.model"); +const {sendError, sendMessage} = require ("../config/response.config"); +const {checkLogin} = require("../config/sessionJWT.config"); +const roles = require("../config/role.config"); +const Ads = db.ads; + +// Create a new Ad +exports.create = (req, res) => { + const token = checkLogin(req, res, [roles.Admin, roles.Advertiser]); + if(token){ + return sendError(res, 501, -1, "Ads.create not Implemented", token); + } +}; + +// Retrieve all Ads +exports.findAll = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Ads.findAll not Implemented", token); + } +}; + +// Retrieve a single Ad with id +exports.findOne = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Ads.findOne not Implemented", token); + } +}; + +// Update a Ad with id +exports.update = (req, res) => { + const token = checkLogin(req, res, [roles.Admin, roles.Advertiser]); + if(token){ + return sendError(res, 501, -1, "Ads.update not Implemented", token); + } +}; + +// Delete a Ad with id +exports.delete = (req, res) => { + const token = checkLogin(req, res, [roles.Admin, roles.Advertiser]); + if(token){ + return sendError(res, 501, -1, "Ads.delete not Implemented", token); + } +}; + +// Delete all Ads +exports.deleteAll = (req, res) => { + const token = checkLogin(req, res, [roles.Admin, roles.Advertiser]); + if(token){ + return sendError(res, 501, -1, "Ads.deleteAll not Implemented", token); + } +}; diff --git a/backend/app/controllers/playlist.controller.js b/backend/app/controllers/playlist.controller.js new file mode 100644 index 0000000..1b5ae3f --- /dev/null +++ b/backend/app/controllers/playlist.controller.js @@ -0,0 +1,52 @@ +const db = require("../models/mongodb.model"); +const {sendError, sendMessage} = require ("../config/response.config"); +const {checkLogin} = require("../config/sessionJWT.config"); +const Playlist = db.playlists; + +// Create a new Playlist +exports.create = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Playlist.create not Implemented", token); + } +}; + +// Retrieve all Playlists +exports.findAll = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Playlist.findAll not Implemented", token); + } +}; + +// Retrieve a single Playlist with id +exports.findOne = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Playlist.findOne not Implemented", token); + } +}; + +// Update a Playlist with id +exports.update = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Playlist.update not Implemented", token); + } +}; + +// Delete a Playlist with id +exports.delete = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Playlist.delete not Implemented", token); + } +}; + +// Delete all Playlists +exports.deleteAll = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Playlist.deleteAll not Implemented", token); + } +}; diff --git a/backend/app/controllers/user.controller.js b/backend/app/controllers/user.controller.js index 51a01d1..2113c7f 100644 --- a/backend/app/controllers/user.controller.js +++ b/backend/app/controllers/user.controller.js @@ -1,12 +1,11 @@ const db = require("../models/mongodb.model"); const {sendError, sendMessage} = require ("../config/response.config"); -const checkFormat = require("../config/checkFormat.config"); const {checkLogin, setSessionCookie} = require("../config/sessionJWT.config"); +const roles = require("../config/role.config"); const User = db.users; -// Authenticate an User +// Authenticate a User exports.auth = (req, res) => { - checkFormat(req, res); // Validate request if (!req.body.login || !req.body.hashPass) { sendError(res, 400,-1,"Content can not be empty ! (login and hashPass needed)"); @@ -16,10 +15,10 @@ exports.auth = (req, res) => { .findOne({login: req.body.login, hashPass: req.body.hashPass}, {role: true}) .then(data => { if (data !== null){ - setSessionCookie(req, res, { login: req.body.login, role: data.role}); + setSessionCookie(req, res, {id: data._id, login: req.body.login, role: data.role}); return sendMessage(res, 1, true); } else { - setSessionCookie(req, res, { login: -1, role: -1 }); + setSessionCookie(req, res, {id: -1, login: -1, role: -1 }); return sendError(res, 500, -1, "Invalid login or password."); } }) @@ -29,19 +28,18 @@ exports.auth = (req, res) => { } }; -// Disconnect an User +// Logout a User exports.disconnect = (req, res) => { - let token; - if(checkFormat(req, res) && (token = checkLogin(req, res))) { + const token = checkLogin(req, res); + if(token){ console.log(token); - setSessionCookie(req, res, {login: -1}); + setSessionCookie(req, res, {id: -1, login: -1, role: -1}); return sendMessage(res, 1, {message: "User disconnected"}, token); } }; // Create and Save a new User exports.create = (req, res) => { - checkFormat(req, res); // Validate request if (!req.body.login || !req.body.hashPass || !req.body.mail) { sendError(res, 400,-1,"Content can not be empty ! (login, hashPass and mail needed"); @@ -77,10 +75,10 @@ exports.create = (req, res) => { } }; -// Retrieve all Users from the database. +// Retrieve all Users from the database if admin. exports.findAll = (req, res) => { - let token; - if(checkFormat(req, res) && (token = checkLogin(req, res, 10))){ + const token = checkLogin(req, res, [roles.Admin]); + if(token){ console.log(token); const login = req.query.login; let condition = login ? { login: { $regex: new RegExp(login), $options: "i" } } : {}; @@ -95,27 +93,34 @@ exports.findAll = (req, res) => { } }; -// Find a single User with an id +// Find a single User with login if admin or login from cookie session exports.findOne = (req, res) => { - checkFormat(req, res); - const id = req.params.id; + const token = checkLogin(req, res); + if(token){ + let login; + if(token.role === [roles.Admin]){ + login = req.params.login; - User.findById(id, {hashPass: false}) - .then(data => { - if (data){ - sendMessage(res, 1, data); - } else { - sendError(res,404,-1,"Not found User with id " + id ); - } - }) - .catch(err => { - sendError(res,500,-1,err.message || "Error retrieving User with id=" + id ); - }); + } else{ + login = token.login; + } + console.log(token.role, login); + User.find({login: login}, {hashPass: false}) + .then(data => { + if (data){ + sendMessage(res, 1, data); + } else { + sendError(res,404,-1,"Not found User with login " + login ); + } + }) + .catch(err => { + sendError(res,500,-1,err.message || "Error retrieving User with login=" + login ); + }); + } }; // Update a User by the id in the request exports.update = (req, res) => { - checkFormat(req, res); if (!req.body) { sendError(res,400,-1,"Data to update can not be empty!"); } else{ @@ -137,7 +142,6 @@ exports.update = (req, res) => { // Delete a User with the specified id in the request exports.delete = (req, res) => { - checkFormat(req, res); const id = req.params.id; User.findByIdAndRemove(id) @@ -155,14 +159,17 @@ exports.delete = (req, res) => { // Delete all Users from the database. exports.deleteAll = (req, res) => { - checkFormat(req, res); - User.deleteMany({}) - .then(data => { - sendMessage(res, 1,{ - message: `${data.deletedCount} Users were deleted successfully!` + const token = checkLogin(req, res, [roles.Admin]); + if(token) { + console.log(token); + User.deleteMany({}) + .then(data => { + sendMessage(res, 1, { + message: `${data.deletedCount} Users were deleted successfully!` + }); + }) + .catch(err => { + sendError(res, 500, -1, err.message || "Some error occurred while removing all Users."); }); - }) - .catch(err => { - sendError(res,500,-1,err.message || "Some error occurred while removing all Users."); - }); + } }; diff --git a/backend/app/controllers/video.controller.js b/backend/app/controllers/video.controller.js new file mode 100644 index 0000000..4383868 --- /dev/null +++ b/backend/app/controllers/video.controller.js @@ -0,0 +1,60 @@ +const db = require("../models/mongodb.model"); +const {sendError, sendMessage} = require ("../config/response.config"); +const {checkLogin} = require("../config/sessionJWT.config"); +const Video = db.video; + +// Search Video +exports.search = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Video.search not Implemented", token); + } +}; + +// Create a new Video +exports.create = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Video.create not Implemented", token); + } +}; + +// Retrieve all Videos +exports.findAll = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Video.findAll not Implemented", token); + } +}; + +// Retrieve a single Video with id +exports.findOne = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Video.findOne not Implemented", token); + } +}; + +// Update a Video with id +exports.update = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Video.update not Implemented", token); + } +}; + +// Delete a Video with id +exports.delete = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Video.delete not Implemented", token); + } +}; + +// Delete all Videos +exports.deleteAll = (req, res) => { + const token = checkLogin(req, res); + if(token){ + return sendError(res, 501, -1, "Video.deleteAll not Implemented", token); + } +}; diff --git a/backend/app/models/ad.model.js b/backend/app/models/ad.model.js new file mode 100644 index 0000000..85404bc --- /dev/null +++ b/backend/app/models/ad.model.js @@ -0,0 +1,18 @@ +module.exports = mongoose => { + let schema = mongoose.Schema({ + images: [], + text: String, + subjectTarget: [], + seen: Number + }, + { timestamps: true } + ); + + schema.method("toJSON", function() { + const { __v, _id, ...object } = this.toObject(); + object.id = _id; + return object; + }); + + return mongoose.model("ad", schema); +}; diff --git a/backend/app/models/image.model.js b/backend/app/models/image.model.js new file mode 100644 index 0000000..c966167 --- /dev/null +++ b/backend/app/models/image.model.js @@ -0,0 +1,18 @@ +module.exports = mongoose => { + let schema = mongoose.Schema({ + base64: String, + fromUrl: String, + description: String, + type: Number + }, + { timestamps: true } + ); + + schema.method("toJSON", function() { + const { __v, _id, ...object } = this.toObject(); + object.id = _id; + return object; + }); + + return mongoose.model("image", schema); +}; diff --git a/backend/app/models/mongodb.model.js b/backend/app/models/mongodb.model.js index 58cce74..1fb040b 100644 --- a/backend/app/models/mongodb.model.js +++ b/backend/app/models/mongodb.model.js @@ -7,5 +7,9 @@ const db = {}; db.mongoose = mongoose; db.url = dbConfig.url; db.users = require("./user.model")(mongoose); +db.playlists = require("./playlist.model")(mongoose); +db.videos = require("./video.model")(mongoose); +db.ads = require("./ad.model")(mongoose); +db.images = require("./image.model")(mongoose); module.exports = db; diff --git a/backend/app/models/playlist.model.js b/backend/app/models/playlist.model.js new file mode 100644 index 0000000..2d7af15 --- /dev/null +++ b/backend/app/models/playlist.model.js @@ -0,0 +1,16 @@ +module.exports = mongoose => { + let schema = mongoose.Schema({ + name: String, + videos: [] + }, + { timestamps: true } + ); + + schema.method("toJSON", function() { + const { __v, _id, ...object } = this.toObject(); + object.id = _id; + return object; + }); + + return mongoose.model("playlist", schema); +}; diff --git a/backend/app/models/subjectTarget.model.js b/backend/app/models/subjectTarget.model.js new file mode 100644 index 0000000..cded850 --- /dev/null +++ b/backend/app/models/subjectTarget.model.js @@ -0,0 +1,16 @@ +module.exports = mongoose => { + let schema = mongoose.Schema({ + name: String, + keywords: [] + }, + { timestamps: true } + ); + + schema.method("toJSON", function() { + const { __v, _id, ...object } = this.toObject(); + object.id = _id; + return object; + }); + + return mongoose.model("subjectTarget", schema); +}; diff --git a/backend/app/models/user.model.js b/backend/app/models/user.model.js index c9b97b5..071c84e 100644 --- a/backend/app/models/user.model.js +++ b/backend/app/models/user.model.js @@ -1,3 +1,5 @@ +const roles = require("../config/role.config"); + module.exports = mongoose => { let schema = mongoose.Schema({ login: String, @@ -5,8 +7,9 @@ module.exports = mongoose => { mail: String, role: { type: Number, - default: 0 - } + default: roles.User + }, + playlists: [] }, { timestamps: true } ); diff --git a/backend/app/models/video.model.js b/backend/app/models/video.model.js new file mode 100644 index 0000000..ce2769e --- /dev/null +++ b/backend/app/models/video.model.js @@ -0,0 +1,18 @@ +module.exports = mongoose => { + let schema = mongoose.Schema({ + url: String, + title: String, + description: String, + views: Number + }, + { timestamps: true } + ); + + schema.method("toJSON", function() { + const { __v, _id, ...object } = this.toObject(); + object.id = _id; + return object; + }); + + return mongoose.model("video", schema); +}; diff --git a/backend/app/routes/ad.routes.js b/backend/app/routes/ad.routes.js new file mode 100644 index 0000000..943dcc7 --- /dev/null +++ b/backend/app/routes/ad.routes.js @@ -0,0 +1,24 @@ +const ads = require("../controllers/ad.controller"); +module.exports = app => { + let router = require("express").Router(); + + // Create a new Ad + router.post("/user/ad", ads.create); + + // Retrieve all Ads + router.get("/user/ad", ads.findAll); + + // Retrieve a single Ad with id + router.get("/user/ad/:id", ads.findOne); + + // Update an Ad with id + router.put("/user/ad/:id", ads.update); + + // Delete an Ad with id + router.delete("/user/ad/:id", ads.delete); + + // Delete all Ads + router.delete("/user/ad", ads.deleteAll); + + app.use('/api', router); +}; diff --git a/backend/app/routes/playlist.routes.js b/backend/app/routes/playlist.routes.js new file mode 100644 index 0000000..1d8241a --- /dev/null +++ b/backend/app/routes/playlist.routes.js @@ -0,0 +1,24 @@ +const playlists = require("../controllers/playlist.controller"); +module.exports = app => { + let router = require("express").Router(); + + // Create a new Playlist + router.post("/user/playlist", playlists.create); + + // Retrieve all Playlists + router.get("/user/playlists", playlists.findAll); + + // Retrieve a single Playlist with id + router.get("/user/playlist/:id", playlists.findOne); + + // Update a Playlist with id + router.put("/user/playlist/:id", playlists.update); + + // Delete a Playlist with id + router.delete("/user/playlist/:id", playlists.delete); + + // Delete all Playlists + router.delete("/user/playlists", playlists.deleteAll); + + app.use('/api', router); +}; diff --git a/backend/app/routes/user.routes.js b/backend/app/routes/user.routes.js index b3ba76f..5e30e34 100644 --- a/backend/app/routes/user.routes.js +++ b/backend/app/routes/user.routes.js @@ -3,28 +3,28 @@ module.exports = app => { let router = require("express").Router(); // Create a new User - router.post("/", users.create); + router.post("/user", users.create); // Retrieve all Users - router.get("/", users.findAll); + router.get("/users", users.findAll); // Retrieve a single User with id - router.get("/:id", users.findOne); + router.get("/user/:id", users.findOne); // Update a User with id - router.put("/:id", users.update); + router.put("/user/:id", users.update); // Delete a User with id - router.delete("/:id", users.delete); + router.delete("/user/:id", users.delete); // Delete all Users - router.delete("/", users.deleteAll); + router.delete("/users", users.deleteAll); // Authenticate a User - router.post("/auth", users.auth); + router.post("/user/auth", users.auth); - // Disconnect a User - router.delete("/auth/disconnect", users.disconnect); + // Logout a User + router.delete("/user/logout", users.disconnect); - app.use('/api/users', router); + app.use('/api', router); }; diff --git a/backend/app/routes/video.routes.js b/backend/app/routes/video.routes.js new file mode 100644 index 0000000..42af7f4 --- /dev/null +++ b/backend/app/routes/video.routes.js @@ -0,0 +1,27 @@ +const videos = require("../controllers/video.controller"); +module.exports = app => { + let router = require("express").Router(); + + // Search Video + router.post("/videos", videos.search); + + // Create a new Video + router.post("/video", videos.create); + + // Retrieve all Videos + router.get("/videos", videos.findAll); + + // Retrieve a single Video with id + router.get("/video/:id", videos.findOne); + + // Update a Video with id + router.put("/video/:id", videos.update); + + // Delete a Video with id + router.delete("/video/:id", videos.delete); + + // Delete all Videos + router.delete("/videos", videos.deleteAll); + + app.use('/api', router); +}; diff --git a/backend/server.js b/backend/server.js index f349ba7..73f2ff2 100644 --- a/backend/server.js +++ b/backend/server.js @@ -28,6 +28,9 @@ db.mongoose require("./app/config/sessionJWT.config"); require("./app/routes/user.routes")(app); +require("./app/routes/playlist.routes")(app); +require("./app/routes/video.routes")(app); +require("./app/routes/ad.routes")(app); app.listen(port, '0.0.0.0',() => { console.log (`listening on port ${port}`);