victorpopkov/universal-redux

View on GitHub
api/api.js

Summary

Maintainability
A
0 mins
Test Coverage
import Express from 'express';
import PrettyError from 'pretty-error';
import bodyParser from 'body-parser';
import config from '../config'; // eslint-disable-line import/no-unresolved
import * as actions from './actions'; // eslint-disable-line sort-imports
import mapUrl from './utils/url';

const pretty = new PrettyError();
const app = new Express();

app.use(bodyParser.json()).use((req, res) => {
  const splittedUrlPath = req.url.split('?')[0].split('/').slice(1);
  const { action, params } = mapUrl(actions, splittedUrlPath);

  res.header('Access-Control-Allow-Origin', '*');

  if (action) {
    action(req, params).then(
      (result) => {
        if (result instanceof Function) {
          result(res);
        } else {
          res.json(result);
        }
      },
      (reason) => {
        if (reason && reason.redirect) {
          res.redirect(reason.redirect);
        } else {
          console.error('API ERROR:', pretty.render(reason));
          res.status(reason.code || 500).json(reason);
        }
      },
    );
  } else {
    res.status(404).json({
      code: 404,
      message: 'Not found',
    });
  }
});

if (config.appApiPort) {
  app.listen(config.appApiPort, (err) => {
    if (err) {
      console.error(err);
    }

    console.info('---\n==> API is running on port %s', config.appApiPort);
    console.info('==> Send requests to %s', config.appApiTarget);
  });
} else {
  console.error(
    '==> ERROR: No APP_API_PORT environment variable has been specified',
  );
}