Change: permissions must always be an array
This allows us to set different configs per model. I should have thought of this usecase when I first did permissions.
This commit is contained in:
parent
7c2b146eed
commit
f9b997b65c
18
README.md
18
README.md
@ -32,13 +32,21 @@ await register({
|
|||||||
defaultConfig: { ... }, // passed as `config` to all routes created
|
defaultConfig: { ... }, // passed as `config` to all routes created
|
||||||
models: ['cat', 'dog'] // only the cat and dog models will have routes created
|
models: ['cat', 'dog'] // only the cat and dog models will have routes created
|
||||||
// or
|
// or
|
||||||
models: {
|
models: [
|
||||||
// possible methods: list, get, scope, create, destroy, destroyAll, destroyScope, update
|
// possible methods: list, get, scope, create, destroy, destroyAll, destroyScope, update
|
||||||
cat: ['get', 'list'], // the cat model only has get and list methods enabled
|
// the cat model only has get and list methods enabled
|
||||||
dog: true, // the dog model has all methods enabled
|
{model: 'cat', methods: ['get', 'list']},
|
||||||
|
// the dog model has all methods enabled
|
||||||
|
{model: 'dog'},
|
||||||
|
// the cow model also has all methods enabled
|
||||||
|
'cow',
|
||||||
|
// the bat model as a custom config for the list method, but uses the default config for create.
|
||||||
|
// `config` if provided, overrides the default config
|
||||||
|
{model: 'bat', methods: ['list'], config: { ... }},
|
||||||
|
{model: 'bat', methods: ['create']}
|
||||||
|
]
|
||||||
|
models: {
|
||||||
bat: {
|
bat: {
|
||||||
methods: ['list'],
|
|
||||||
config: { ... } // if provided, overrides the default config
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
59
src/crud.js
59
src/crud.js
@ -4,9 +4,9 @@ import _ from 'lodash';
|
|||||||
import { parseInclude, parseWhere } from './utils';
|
import { parseInclude, parseWhere } from './utils';
|
||||||
import { notFound } from 'boom';
|
import { notFound } from 'boom';
|
||||||
|
|
||||||
const createAll = ({server, model, prefix, config}) => {
|
const createAll = ({ server, model, prefix, config }) => {
|
||||||
Object.keys(methods).forEach((method) => {
|
Object.keys(methods).forEach((method) => {
|
||||||
methods[method]({server, model, prefix, config});
|
methods[method]({ server, model, prefix, config });
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -28,42 +28,41 @@ models: {
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export default (server, model, {prefix, defaultConfig: config, models: permissions}) => {
|
export default (server, model, { prefix, defaultConfig: config, models: permissions }) => {
|
||||||
const modelName = model._singular;
|
const modelName = model._singular;
|
||||||
|
const permissionsIsArray = Array.isArray(permissions);
|
||||||
|
|
||||||
if (!permissions) {
|
if (!permissions) {
|
||||||
createAll({server, model, prefix, config});
|
createAll({ server, model, prefix, config });
|
||||||
}
|
} else if (permissionsIsArray && permissions.includes(modelName)) {
|
||||||
else if (Array.isArray(permissions) && permissions.includes(modelName)) {
|
createAll({ server, model, prefix, config });
|
||||||
createAll({server, model, prefix, config});
|
} else if (permissionsIsArray) {
|
||||||
}
|
const permissionOptions = permissions.filter((permission) => {
|
||||||
else if (_.isPlainObject(permissions)) {
|
return permission.model === modelName;
|
||||||
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])) {
|
permissionOptions.forEach((permissionOption) => {
|
||||||
permissions[modelName].methods.forEach((method) => {
|
if (_.isPlainObject(permissionOption)) {
|
||||||
|
const permissionConfig = permissionOption.config || config;
|
||||||
|
|
||||||
|
if (permissionOption.methods) {
|
||||||
|
permissionOption.methods.forEach((method) => {
|
||||||
methods[method]({
|
methods[method]({
|
||||||
server,
|
server,
|
||||||
model,
|
model,
|
||||||
prefix,
|
prefix,
|
||||||
config: permissions[modelName].config || config,
|
config: permissionConfig,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
createAll({ server, model, prefix, config: permissionConfig });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const list = ({server, model, prefix, config}) => {
|
export const list = ({ server, model, prefix, config }) => {
|
||||||
server.route({
|
server.route({
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
path: `${prefix}/${model._plural}`,
|
path: `${prefix}/${model._plural}`,
|
||||||
@ -86,7 +85,7 @@ export const list = ({server, model, prefix, config}) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const get = ({server, model, prefix, config}) => {
|
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?}`,
|
||||||
@ -114,7 +113,7 @@ export const get = ({server, model, prefix, config}) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const scope = ({server, model, prefix, config}) => {
|
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({
|
||||||
@ -140,7 +139,7 @@ export const scope = ({server, model, prefix, config}) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const create = ({server, model, prefix, config}) => {
|
export const create = ({ server, model, prefix, config }) => {
|
||||||
server.route({
|
server.route({
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
path: `${prefix}/${model._singular}`,
|
path: `${prefix}/${model._singular}`,
|
||||||
@ -156,7 +155,7 @@ export const create = ({server, model, prefix, config}) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const destroy = ({server, model, prefix, config}) => {
|
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?}`,
|
||||||
@ -177,7 +176,7 @@ export const destroy = ({server, model, prefix, config}) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const destroyAll = ({server, model, prefix, config}) => {
|
export const destroyAll = ({ server, model, prefix, config }) => {
|
||||||
server.route({
|
server.route({
|
||||||
method: 'DELETE',
|
method: 'DELETE',
|
||||||
path: `${prefix}/${model._plural}`,
|
path: `${prefix}/${model._plural}`,
|
||||||
@ -197,7 +196,7 @@ export const destroyAll = ({server, model, prefix, config}) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const destroyScope = ({server, model, prefix, config}) => {
|
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({
|
||||||
@ -225,7 +224,7 @@ export const destroyScope = ({server, model, prefix, config}) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const update = ({server, model, prefix, config}) => {
|
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}`,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user