r2js/r2admin

View on GitHub
lib/create.js

Summary

Maintainability
B
4 hrs
Test Coverage
const _ = require('underscore');
const adminUtils = require('./utils');

module.exports = (app, conf = {}) => {
  const AdminUtils = adminUtils(app);
  const { baseUrl = 'admin' } = conf;
  const { errors } = AdminUtils;
  const { created } = app.handler;
  const { partial: p } = _;

  return {
    form(req, res) {
      const { object } = req.params;
      res.render(`admin/object/${object}/form.html`, { object });
    },

    object(req, res, next) {
      const { object } = req.params;
      const body = _.omit(req.body, _.isEmpty);
      Object.assign(body, {
        actor: req.session.adminUser.userId,
        i18n: req.body.i18n || 'en',
      });

      let responseData;
      AdminUtils.getModel(object).create(body)
        .then((modelData) => {
          responseData = modelData;
          return modelData.applyPatch ? modelData.applyPatch() : Promise.resolve();
        })
        .then(() => {
          if (req.xhr) {
            return created(responseData, res);
          }

          req.flash('info', { type: 'objectCreated' });

          let redirect = `/${baseUrl}/${object}`;
          if (req.query.redirect) {
            redirect = req.query.redirect;
          } else if (req.body.redirect) {
            redirect = req.body.redirect;
          }

          return res.redirect(redirect);
        })
        .catch((err) => {
          if (req.xhr) {
            return p(errors, next)(err);
          }

          return res.render(`admin/object/${object}/form.html`, {
            errors: err.errors,
            data: req.body,
            object,
          });
        });
    },
  };
};