UNPKG

generator-restgoose

Version:

Modern, Lightweight, and Powerfull Rest API Code generator. Out-Of-Box NodeJS REST API Server generator built on top of Mongoose, Express, Cors, Passport, JWT and many more.

178 lines (159 loc) 7.64 kB
'use strict'; const express = require('express'); const router = express.Router(); const passport = require('passport'); // const debug = require('debug')('App:API:auth') const Config = require('../config'); const Util = require('../library').Util; const Constants = require('../library').Constants; const ApiModule = 'auth'; const Service = require('../apiObjects/auth'); // Middleware to require login/auth const routeSanity = require('../middleware/routeSanity'); const rbac = require('../middleware').RBAC; const requireLogin = passport.authenticate('local', { session: false }); const Response = Util.Response; const Execute = Util.ExecuteService; /* =====================[ ROUTE API : CORE ]===================== */ // Core Operations const API = { Check: async (req, res) => { const result = await Execute(Service.Check(req.user)); res.status(200).json(Response(result.err, result.data)); }, Register: async (req, res) => { const data = req.body.data; if (!data.email || !data.password || !data.firstName) { return res.status(402).json(Response('Invalid Params Given', 'email password and firstName is required')); } const result = await Execute(Service.Register(data.email, data.password, data.firstName, data.lastName)); res.status(201).json(Response(result.err, result.data)); }, RegisterVendor: async (req, res) => { const data = req.body.data; if (!data.email || !data.password || !data.firstName) { return res.status(402).json(Response('Invalid Params Given', 'email password and firstName is required')); } const result = await Execute(Service.RegisterVendor(data.email, data.password, data.firstName, data.lastName)); res.status(201).json(Response(result.err, result.data)); }, RegisterTeam: async (req, res) => { const data = req.body.data; if (!data.email || !data.password || !data.firstName) { return res.status(402).json(Response('Invalid Params Given', 'email password and firstName is required')); } const result = await Execute(Service.RegisterTeam(data.email, data.password, data.firstName, data.lastName)); res.status(201).json(Response(result.err, result.data)); }, Login: async (req, res) => { const result = await Execute(Service.Login(req.user)); res.status(200).json(Response(result.err, result.data)); }, Logout: async (req, res) => { const result = await Execute(Service.Logout(req.get('Authorization'))); res.status(200).json(Response(result.err, result.data)); }, OAuth: async (req, res) => { const data = req.body.data; if (!data.provider || !data.token) { return res.status(402).json(Response('Invalid Params Given', 'provider and token is required')); } const result = await Execute(Service.OAuth(data.provider, data.token)); res.status(200).json(Response(result.err, result.data)); }, OAuthCallback: async (req, res) => { const result = await Execute(Service.OAuthCallback(req.params.provider, req.query)); res.status(200).json(Response(result.err, result.data)); }, OAuthEmbed: (req, res) => { res.render('login', { title: 'yoyo' }); } }; /* =====================[ ROUTE API : PASSWORD ]===================== */ const APIPassword = { Validate: async (req, res) => { const result = await Execute(Service.ValidatePassword(req.user, req.body.data.password)); res.status(200).json(Response(result.err, result.data)); }, Change: async (req, res) => { const result = await Execute(Service.ChangePassword(req.user, req.body.data.old, req.body.data.new)); res.status(200).json(Response(result.err, result.data)); }, RequestForgotPasswordToken: async (req, res) => { const result = await Execute(Service.RequestForgotPasswordToken(req.params.email)); res.status(200).json(Response(result.err, result.data)); }, ResetWithToken: async (req, res) => { if (!req.body.data.password) { return res.status(422).json(Response('Invalid Params Given', ' password is required')); } const result = await Execute(Service.ResetWithToken(req.params.email, req.params.token, req.body.data.password)); res.status(200).json(Response(result.err, result.data)); }, ResetByAdmin: async (req, res) => { const result = await Execute(Service.ResetByAdmin(req.params.email, req.body.data.password)); res.status(200).json(Response(result.err, result.data)); } }; /* =====================[ ROUTE API : ACCOUNT ]===================== */ const APIAccount = { VerifyEmail: async (req, res) => { const result = await Execute(Service.VerifyEmail(req.params.token)); res.status(200).json(Response(result.err, result.data)); }, ChangeRole: async (req, res) => { const role = req.body.data.role; if (Config.auth.roles.indexOf(role) < 0) { return res.status(422).json(Response('Invalid Role Assigned!', role, 'Change the role to what is specified in the server')); } const result = await Execute(Service.ChangeRole(req.params.userid, role)); res.status(200).json(Response(result.err, result.data)); }, ChangeStatus: async (req, res) => { const status = req.body.data.status; if (Object.values(Constants.Status).indexOf(status) < 0) { return res.status(422).json(Response('Invalid Status updated!', status, 'Change the status to what is specified in the server')); } const result = await Execute(Service.ChangeStatus(req.params.userid, status)); res.status(200).json(Response(result.err, result.data)); }, SuspendAccount: async (req, res) => { const result = await Execute(Service.SuspendAccount(req.params.userid)); res.status(200).json(Response(result.err, result.data)); } }; // ================================[ ROUTES ]================================ /* =====================[ ROUTE : CORE ]===================== */ router.get(`/${ApiModule}/check`, API.Check); router.post(`/${ApiModule}/register`, routeSanity.checkData, API.Register); router.post(`/${ApiModule}/register/team`, rbac.AuthorizeAdmin, routeSanity.checkData, API.RegisterTeam); router.post(`/${ApiModule}/register/vendor`, rbac.AuthorizeAdmin, routeSanity.checkData, API.RegisterVendor); router.post(`/${ApiModule}/login`, requireLogin, API.Login); router.post(`/${ApiModule}/logout`, API.Logout); router.post(`/${ApiModule}/login/oauth`, API.OAuth); router.get(`/${ApiModule}/login/oauth/:provider/callback`, API.OAuthCallback); router.get(`/${ApiModule}/login/oauth/embed`, API.OAuthEmbed); /* =====================[ ROUTE : PASSWORD ]===================== */ router.post(`/${ApiModule}/password/validate`, APIPassword.Validate); router.post(`/${ApiModule}/password/change`, routeSanity.checkData, APIPassword.Change); router.get(`/${ApiModule}/password/forgot/:email`, APIPassword.RequestForgotPasswordToken); router.post(`/${ApiModule}/password/forgot/:email/:token`, APIPassword.ResetWithToken); router.post(`/${ApiModule}/password/change/:email/admin`, rbac.AuthorizeAdmin, APIPassword.ResetByAdmin); /* =====================[ ROUTE : ACCOUNT ]===================== */ router.get(`/${ApiModule}/account/verify/:token`, APIAccount.VerifyEmail); router.post(`/${ApiModule}/account/:userid/role`, rbac.AuthorizeAdmin, routeSanity.checkId('userid'), routeSanity.checkData, APIAccount.ChangeRole); router.post(`/${ApiModule}/account/:userid/status`, rbac.AuthorizeAdmin, routeSanity.checkId('userid'), routeSanity.checkData, APIAccount.ChangeStatus); router.post(`/${ApiModule}/account/:userid/suspend`, rbac.AuthorizeAdmin, routeSanity.checkId('userid'), APIAccount.SuspendAccount); module.exports = router;