const express = require(`express`); const pino = require(`pino`); const pinoHttp = require("pino-http"); const app = express(); const passport = require(`passport`); const { users } = require(`./controllers`); /** * logging */ let logger = pino(); if (process.env.name === `test`) { logger = pino(pino.destination({ dest: `../logs/api.json`, sync: false })); } app.use( pinoHttp({ logger: logger, }) ); /** * Configure Passport */ try { require(`./config/passport`)(passport); } catch (error) { console.log(error); } /** * Configure Express.js Middleware */ // Enable CORS app.use(function (req, res, next) { res.header(`Access-Control-Allow-Origin`, `*`); res.header(`Access-Control-Allow-Methods`, `*`); res.header(`Access-Control-Allow-Headers`, `*`); res.header(`x-powered-by`, `serverless-express`); next(); }); // Initialize Passport and restore authentication state, if any, from the session app.use(passport.initialize()); app.use(passport.session()); // Enable JSON use app.use(express.json()); // Since Express doesn't support error handling of promises out of the box, // this handler enables that const asyncHandler = (fn) => (req, res, next) => { return Promise.resolve(fn(req, res, next)).catch(next); }; /** * Routes - Public */ app.options(`*`, (req, res) => { res.status(200).send(); }); app.post(`/users/register`, asyncHandler(users.register)); app.post(`/users/login`, asyncHandler(users.login)); app.get(`/test/`, (req, res) => { res.status(200).send(`Request received`); }); /** * Routes - Protected */ app.post( `/user`, passport.authenticate(`jwt`, { session: false }), asyncHandler(users.get) ); /** * Routes - Catch-All */ app.get(`/*`, (req, res) => { res.status(404).send(`Route not found`); }); /** * Error Handler */ app.use(function (err, req, res, next) { if (res.headersSent) { return next(err); } req.log.error(err); res.status(err.code || 500); res.json({ error: err.message || `Internal Server Error - "${err.message}"`, }); }); module.exports = app;