Add: permissions #11

Merged
joeybaker merged 1 commits from add-permissions into master 2016-07-22 17:28:36 +00:00
2 changed files with 102 additions and 34 deletions

View File

@ -29,11 +29,37 @@ await register({
options: { options: {
prefix: '/v1', prefix: '/v1',
name: 'db', // the same name you used for configuring `hapi-sequelize` (options.name) name: 'db', // the same name you used for configuring `hapi-sequelize` (options.name)
defaultConfig: { ... } // passed as `config` to all routes created defaultConfig: { ... }, // passed as `config` to all routes created
// You can specify which models must have routes defined for using the
// `models` property. If you omit this property, all models will have
// models defined for them. e.g.
models: ['cat', 'dog'] // only the cat and dog models will have routes created
// or
models: {
// possible methods: list, get, scope, create, destroy, destroyAll, destroyScope, update
cat: ['get', 'list'], // the cat model only has get and list methods enabled
dog: true, // the dog model has all methods enabled
bat: {
methods: ['list'],
config: { ... } // if provided, overrides the default config
}
}
} }
}); });
``` ```
### Methods
* list: get all rows in a table
* get: get a single row
* scope: reference a [sequelize scope](http://docs.sequelizejs.com/en/latest/api/model/#scopeoptions-model)
* create: create a new row
* destroy: delete a row
* destroyAll: delete all models in the table
* destroyScope: use a [sequelize scope](http://docs.sequelizejs.com/en/latest/api/model/#scopeoptions-model) to find rows, then delete them
* update: update a row
Please note that you should register `hapi-sequelize-crud` after defining your Please note that you should register `hapi-sequelize-crud` after defining your
associations. associations.

View File

@ -3,25 +3,66 @@ import error from './error';
import _ from 'lodash'; import _ from 'lodash';
import { parseInclude, parseWhere } from './utils'; import { parseInclude, parseWhere } from './utils';
import { notFound } from 'boom'; import { notFound } from 'boom';
import * as associations from './associations/index';
let prefix; const createAll = ({ server, model, prefix, config }) => {
let defaultConfig; Object.keys(methods).forEach((method) => {
methods[method]({ server, model, prefix, config });
export default (server, model, options) => { });
prefix = options.prefix;
defaultConfig = options.defaultConfig;
list(server, model);
get(server, model);
scope(server, model);
create(server, model);
destroy(server, model);
destroyAll(server, model);
destroyScope(server, model);
update(server, model);
}; };
export const list = (server, model) => { export { associations };
/*
The `models` option, becomes `permissions`, and can look like:
```
models: ['cat', 'dog']
```
or
```
models: {
cat: ['list', 'get']
, dog: true // all
}
```
*/
export default (server, model, { prefix, defaultConfig: config, models: permissions }) => {
const modelName = model._singular;
if (!permissions) {
createAll({ server, model, prefix, config });
} else if (Array.isArray(permissions) && permissions.includes(modelName)) {
createAll({ server, model, prefix, config });
} else if (_.isPlainObject(permissions)) {
const permittedModels = Object.keys(permissions);
if (permissions[modelName] === true) {
createAll({ server, model, prefix, config });
} else if (permittedModels.includes(modelName)) {
if (Array.isArray(permissions[modelName])) {
permissions[modelName].forEach((method) => {
methods[method]({ server, model, prefix, config });
});
} else if (_.isPlainObject(permissions[modelName])) {
permissions[modelName].methods.forEach((method) => {
methods[method]({
server,
model,
prefix,
config: permissions[modelName].config || config,
});
});
}
}
}
};
export const list = ({ server, model, prefix, config }) => {
server.route({ server.route({
method: 'GET', method: 'GET',
path: `${prefix}/${model._plural}`, path: `${prefix}/${model._plural}`,
@ -40,11 +81,11 @@ export const list = (server, model) => {
reply(list); reply(list);
}, },
config: defaultConfig, config,
}); });
}; };
export const get = (server, model) => { export const get = ({ server, model, prefix, config }) => {
server.route({ server.route({
method: 'GET', method: 'GET',
path: `${prefix}/${model._singular}/{id?}`, path: `${prefix}/${model._singular}/{id?}`,
@ -68,11 +109,11 @@ export const get = (server, model) => {
id: joi.any(), id: joi.any(),
}), }),
}, },
}, defaultConfig), }, config),
}); });
}; };
export const scope = (server, model) => { export const scope = ({ server, model, prefix, config }) => {
const scopes = Object.keys(model.options.scopes); const scopes = Object.keys(model.options.scopes);
server.route({ server.route({
@ -94,11 +135,11 @@ export const scope = (server, model) => {
scope: joi.string().valid(...scopes), scope: joi.string().valid(...scopes),
}), }),
}, },
}, defaultConfig), }, config),
}); });
}; };
export const create = (server, model) => { export const create = ({ server, model, prefix, config }) => {
server.route({ server.route({
method: 'POST', method: 'POST',
path: `${prefix}/${model._singular}`, path: `${prefix}/${model._singular}`,
@ -110,11 +151,11 @@ export const create = (server, model) => {
reply(instance); reply(instance);
}, },
config: defaultConfig, config,
}); });
}; };
export const destroy = (server, model) => { export const destroy = ({ server, model, prefix, config }) => {
server.route({ server.route({
method: 'DELETE', method: 'DELETE',
path: `${prefix}/${model._singular}/{id?}`, path: `${prefix}/${model._singular}/{id?}`,
@ -131,11 +172,11 @@ export const destroy = (server, model) => {
reply(list.length === 1 ? list[0] : list); reply(list.length === 1 ? list[0] : list);
}, },
config: defaultConfig, config,
}); });
}; };
export const destroyAll = (server, model) => { export const destroyAll = ({ server, model, prefix, config }) => {
server.route({ server.route({
method: 'DELETE', method: 'DELETE',
path: `${prefix}/${model._plural}`, path: `${prefix}/${model._plural}`,
@ -151,11 +192,11 @@ export const destroyAll = (server, model) => {
reply(list.length === 1 ? list[0] : list); reply(list.length === 1 ? list[0] : list);
}, },
config: defaultConfig, config,
}); });
}; };
export const destroyScope = (server, model) => { export const destroyScope = ({ server, model, prefix, config }) => {
const scopes = Object.keys(model.options.scopes); const scopes = Object.keys(model.options.scopes);
server.route({ server.route({
@ -179,11 +220,11 @@ export const destroyScope = (server, model) => {
scope: joi.string().valid(...scopes), scope: joi.string().valid(...scopes),
}), }),
}, },
}, defaultConfig), }, config),
}); });
}; };
export const update = (server, model) => { export const update = ({ server, model, prefix, config }) => {
server.route({ server.route({
method: 'PUT', method: 'PUT',
path: `${prefix}/${model._singular}/{id}`, path: `${prefix}/${model._singular}/{id}`,
@ -208,9 +249,10 @@ export const update = (server, model) => {
validate: { validate: {
payload: joi.object().required(), payload: joi.object().required(),
}, },
}, defaultConfig), }, config),
}); });
}; };
import * as associations from './associations/index'; const methods = {
export { associations }; list, get, scope, create, destroy, destroyAll, destroyScope, update,
};