Skip to content

Instantly share code, notes, and snippets.

@juampi92
Created October 16, 2017 21:27
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save juampi92/d91fc964be47a0788b7f266059cd7e20 to your computer and use it in GitHub Desktop.
Save juampi92/d91fc964be47a0788b7f266059cd7e20 to your computer and use it in GitHub Desktop.
Express Controllers
import joi from 'joi'
import validate from 'express-validation'
import middleware from 'middleware'
import AuthService from 'auth.service'
/**
* Controller's generic middleware
*/
export const middleware = [middleware.authenticate('token')]
/**
* POST auth/login endpoint
*
* @export
* @param {any} req
* @param {any} res
*/
login.middleware = [middleware.guest('token'), validate({
body: {
type: joi.string().required(),
token: joi.string().required()
}
})]
export async function login(req, res, next) {
const service = new AuthService(req)
try {
await service.login()
} catch(e) {
return next(e)
}
res.status(200).send({
data: {
token: service.getUserToken().token,
profile: service.getUser()
}
})
}
login.posmiddleware = []
/**
*
*
* @export
* @param {any} req
* @param {any} res
*/
logout.middleware = [middleware.authenticated('token')]
export async function logout(req, res, next) {
const service = new AuthService(req, next)
await service.logout()
res.status(200).send({
data: 'success'
})
}
import requireDirectory from 'require-directory'
import {
namespace,
slashNotation
} from '../core/utils'
/**
* Formats every controller inside the directory 'controllers' into an object.
* folder:
* - app
* - auth.controller
*
* output:
* {
* App: {
* AuthController: (file exports)
* }
* }
*/
export const controllers = requireDirectory(module, './', {
rename: namespace
})
/**
* Transform slash notation to the controller's method, appending/prepending any middleware required
*
* @export
* @param {any} ctrllr
* @returns
*/
export default function (ctrllr) {
const [controllerName, methodName] = ctrllr.split('@')
const controller = slashNotation(controllerName, controllers)
const method = controller[methodName]
const { middleware:ctrlrmiddleware = [] } = controller
const {
middleware = [], posmiddleware = []
} = method
return [...ctrlrmiddleware, ...middleware, method, ...posmiddleware]
}
export function namespace(name) {
return name.replace(/(\b|\.)\w/g, l => l.toUpperCase()).replace('.', '')
}
export function slashNotation(string, object) {
return string.split('/').reduce((o, i) => o[i], object)
}
import {
Router
} from 'express';
import Ctrlrs from '../controllers'
const routes = Router();
routes.post('/auth/login', Ctrlrs('App/AuthController@login'))
routes.post('/auth/logout', Ctrlrs('App/AuthController@logout'))
export default routes;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment