Skip to content

Commit

Permalink
refactor(entityRoutes): Add createOrEditHandler-s
Browse files Browse the repository at this point in the history
A function called `makeEntityCreateOrEditHandler` encapsulates
the similarities in entity /create/handler and /edit/:bbid/handler-s.
  • Loading branch information
naiveai committed Dec 28, 2017
1 parent d1ac2f6 commit a5e051d
Show file tree
Hide file tree
Showing 6 changed files with 100 additions and 154 deletions.
57 changes: 57 additions & 0 deletions src/server/helpers/entityRouteUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@

import * as Immutable from 'immutable';
import * as entityEditorHelpers from '../../client/entity-editor/helpers';
import * as entityRoutes from '../routes/entity/entity';
import * as error from './error';
import * as propHelpers from '../../client/helpers/props';
import * as utils from './utils';
import EntityEditor from '../../client/entity-editor/entity-editor';
Expand Down Expand Up @@ -94,3 +96,58 @@ export function entityEditorMarkup(

return markup;
}


/**
* Callback for any transformations to the request body
* @callback transformCallback
* @param {object} body - request body
*/

/**
* Handler for create or edit actions
* @callback transformCallback
* @param {object} req - request object
* @param {object} res - response object
*/

/**
* Additional callback to pass data to createEntity
* @callback createCallback
* @param {object} req - request object
* @param {object} res - response object
*/

/**
* Makes a middleware handler for create or edit actions on entities.
* @param {string} entityType - entity type
* @param {transformCallback} transformNewForm - callback
* @param {(string|string[])} propertiesToPick - props from transformed
* request body to pick.
* @param {createCallback} createCallback - a callback that returns any
* additional data for createEntity.
* @returns {createOrEditHandler} createOrEditHandler - middleware handler
*/
export function makeEntityCreateOrEditHandler(
entityType: string,
transformNewForm: Function,
propertiesToPick: string | string[],
createCallback?: (req: Object, res: Object) => any =
(req, res) => null) {
const entityName = _.capitalize(entityType);
return function createOrEditHandler(
req: express.request,
res: express.response) {
const validate = getValidator(entityType);
if (!validate(req.body)) {
const err = new error.FormSubmissionError();
error.sendErrorAsJSON(res, err);
}

req.body = transformNewForm(req.body);
return entityRoutes.createEntity(
req, res, entityName, _.pick(req.body, propertiesToPick),
createCallback(req, res)
);
};
}
37 changes: 9 additions & 28 deletions src/server/routes/entity/creator.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@
import * as auth from '../../helpers/auth';
import * as entityEditorHelpers from '../../../client/entity-editor/helpers';
import * as entityRoutes from './entity';
import * as error from '../../helpers/error';
import * as middleware from '../../helpers/middleware';
import * as utils from '../../helpers/utils';
import {
entityEditorMarkup,
generateEntityProps
generateEntityProps,
makeEntityCreateOrEditHandler
} from '../../helpers/entityRouteUtils';
import _ from 'lodash';
import {escapeProps} from '../../helpers/props';
Expand Down Expand Up @@ -254,33 +254,14 @@ function transformNewForm(data) {
};
}

router.post('/create/handler', auth.isAuthenticatedForHandler, (req, res) => {
const validate = getValidator('creator');
if (!validate(req.body)) {
const err = new error.FormSubmissionError();
error.sendErrorAsJSON(res, err);
}
const createOrEditHandler = makeEntityCreateOrEditHandler(
'creator', transformNewForm, additionalCreatorProps
);

req.body = transformNewForm(req.body);
return entityRoutes.createEntity(
req, res, 'Creator', _.pick(req.body, additionalCreatorProps)
);
});
router.post('/create/handler', auth.isAuthenticatedForHandler,
createOrEditHandler);

router.post(
'/:bbid/edit/handler', auth.isAuthenticatedForHandler,
(req, res) => {
const validate = getValidator('creator');
if (!validate(req.body)) {
const err = new error.FormSubmissionError();
error.sendErrorAsJSON(res, err);
}

req.body = transformNewForm(req.body);
return entityRoutes.editEntity(
req, res, 'Creator', _.pick(req.body, additionalCreatorProps)
);
}
);
router.post('/:bbid/edit/handler', auth.isAuthenticatedForHandler,
createOrEditHandler);

export default router;
49 changes: 9 additions & 40 deletions src/server/routes/entity/edition.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@
import * as auth from '../../helpers/auth';
import * as entityEditorHelpers from '../../../client/entity-editor/helpers';
import * as entityRoutes from './entity';
import * as error from '../../helpers/error';
import * as middleware from '../../helpers/middleware';
import * as utils from '../../helpers/utils';
import {
entityEditorMarkup,
generateEntityProps
generateEntityProps,
makeEntityCreateOrEditHandler
} from '../../helpers/entityRouteUtils';
import Promise from 'bluebird';
import _ from 'lodash';
Expand Down Expand Up @@ -369,45 +369,14 @@ function getAdditionalEditionSets(orm) {
];
}

router.post('/create/handler', auth.isAuthenticatedForHandler, (req, res) => {
const {orm} = req.app.locals;
const createOrEditHandler = makeEntityCreateOrEditHandler(
'edition', transformNewForm, additionalEditionProps, (req, res) =>
getAdditionalEditionSets(req.app.locals.orm));

const validate = getValidator('edition');
if (!validate(req.body)) {
const err = new error.FormSubmissionError();
error.sendErrorAsJSON(res, err);
}

req.body = transformNewForm(req.body);
return entityRoutes.createEntity(
req,
res,
'Edition',
_.pick(req.body, additionalEditionProps),
getAdditionalEditionSets(orm)
);
});

router.post(
'/:bbid/edit/handler', auth.isAuthenticatedForHandler,
(req, res) => {
const {orm} = req.app.locals;

const validate = getValidator('edition');
if (!validate(req.body)) {
const err = new error.FormSubmissionError();
error.sendErrorAsJSON(res, err);
}
router.post('/create/handler', auth.isAuthenticatedForHandler,
createOrEditHandler);

req.body = transformNewForm(req.body);
return entityRoutes.editEntity(
req,
res,
'Edition',
_.pick(req.body, additionalEditionProps),
getAdditionalEditionSets(orm)
);
}
);
router.post('/:bbid/edit/handler', auth.isAuthenticatedForHandler,
createOrEditHandler);

export default router;
35 changes: 8 additions & 27 deletions src/server/routes/entity/publication.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ import * as middleware from '../../helpers/middleware';
import * as utils from '../../helpers/utils';
import {
entityEditorMarkup,
generateEntityProps
generateEntityProps,
makeEntityCreateOrEditHandler
} from '../../helpers/entityRouteUtils';
import _ from 'lodash';
import {escapeProps} from '../../helpers/props';
Expand Down Expand Up @@ -221,33 +222,13 @@ function transformNewForm(data) {
};
}

router.post('/create/handler', auth.isAuthenticatedForHandler, (req, res) => {
const validate = getValidator('publication');
if (!validate(req.body)) {
const err = new error.FormSubmissionError();
error.sendErrorAsJSON(res, err);
}
const createOrEditHandler = makeEntityCreateOrEditHandler(
'publication', transformNewForm, 'typeId');

req.body = transformNewForm(req.body);
return entityRoutes.createEntity(
req, res, 'Publication', _.pick(req.body, 'typeId')
);
});
router.post('/create/handler', auth.isAuthenticatedForHandler,
createOrEditHandler);

router.post(
'/:bbid/edit/handler', auth.isAuthenticatedForHandler,
(req, res) => {
const validate = getValidator('publication');
if (!validate(req.body)) {
const err = new error.FormSubmissionError();
error.sendErrorAsJSON(res, err);
}

req.body = transformNewForm(req.body);
return entityRoutes.editEntity(
req, res, 'Publication', _.pick(req.body, 'typeId')
);
}
);
router.post('/:bbid/edit/handler', auth.isAuthenticatedForHandler,
createOrEditHandler);

export default router;
35 changes: 8 additions & 27 deletions src/server/routes/entity/publisher.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ import * as middleware from '../../helpers/middleware';
import * as utils from '../../helpers/utils';
import {
entityEditorMarkup,
generateEntityProps
generateEntityProps,
makeEntityCreateOrEditHandler
} from '../../helpers/entityRouteUtils';
import _ from 'lodash';
import {escapeProps} from '../../helpers/props';
Expand Down Expand Up @@ -260,33 +261,13 @@ const additionalPublisherProps = [
'typeId', 'areaId', 'beginDate', 'endDate', 'ended'
];

router.post('/create/handler', auth.isAuthenticatedForHandler, (req, res) => {
const validate = getValidator('publisher');
if (!validate(req.body)) {
const err = new error.FormSubmissionError();
error.sendErrorAsJSON(res, err);
}
const createOrEditHandler = makeEntityCreateOrEditHandler(
'publisher', transformNewForm, additionalPublisherProps);

req.body = transformNewForm(req.body);
return entityRoutes.createEntity(
req, res, 'Publisher', _.pick(req.body, additionalPublisherProps)
);
});
router.post('/create/handler', auth.isAuthenticatedForHandler,
createOrEditHandler);

router.post(
'/:bbid/edit/handler', auth.isAuthenticatedForHandler,
(req, res) => {
const validate = getValidator('publisher');
if (!validate(req.body)) {
const err = new error.FormSubmissionError();
error.sendErrorAsJSON(res, err);
}

req.body = transformNewForm(req.body);
return entityRoutes.editEntity(
req, res, 'Publisher', _.pick(req.body, additionalPublisherProps)
);
}
);
router.post('/:bbid/edit/handler', auth.isAuthenticatedForHandler,
createOrEditHandler);

export default router;
41 changes: 9 additions & 32 deletions src/server/routes/entity/work.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ import * as middleware from '../../helpers/middleware';
import * as utils from '../../helpers/utils';
import {
entityEditorMarkup,
generateEntityProps
generateEntityProps,
makeEntityCreateOrEditHandler
} from '../../helpers/entityRouteUtils';
import _ from 'lodash';
import {escapeProps} from '../../helpers/props';
Expand Down Expand Up @@ -240,38 +241,14 @@ function transformNewForm(data) {
};
}

router.post('/create/handler', auth.isAuthenticatedForHandler, (req, res) => {
const {orm} = req.app.locals;
const createOrEditHandler = makeEntityCreateOrEditHandler(
'work', transformNewForm, 'typeId', (req, res) =>
getAdditionalWorkSets(req.app.locals.orm));

const validate = getValidator('work');
if (!validate(req.body)) {
const err = new error.FormSubmissionError();
error.sendErrorAsJSON(res, err);
}

req.body = transformNewForm(req.body);
return entityRoutes.createEntity(
req, res, 'Work', _.pick(req.body, 'typeId'), getAdditionalWorkSets(orm)
);
});
router.post('/create/handler', auth.isAuthenticatedForHandler,
createOrEditHandler);

router.post(
'/:bbid/edit/handler', auth.isAuthenticatedForHandler,
(req, res) => {
const {orm} = req.app.locals;

const validate = getValidator('work');
if (!validate(req.body)) {
const err = new error.FormSubmissionError();
error.sendErrorAsJSON(res, err);
}

req.body = transformNewForm(req.body);
return entityRoutes.editEntity(
req, res, 'Work', _.pick(req.body, 'typeId'),
getAdditionalWorkSets(orm)
);
}
);
router.post('/:bbid/edit/handler', auth.isAuthenticatedForHandler,
createOrEditHandler);

export default router;

0 comments on commit a5e051d

Please sign in to comment.