feat(include): include query parameter, passed to sequelize query
fix(associations): one-to-many associations -> destroyScope and get
This commit is contained in:
parent
aebff50d0b
commit
6cfe877884
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "hapi-sequelize-crud",
|
"name": "hapi-sequelize-crud",
|
||||||
"version": "1.3.1",
|
"version": "1.4.0",
|
||||||
"description": "Hapi plugin that automatically generates RESTful API for CRUD",
|
"description": "Hapi plugin that automatically generates RESTful API for CRUD",
|
||||||
"main": "build/index.js",
|
"main": "build/index.js",
|
||||||
"config": {
|
"config": {
|
||||||
|
@ -1,18 +1,50 @@
|
|||||||
import joi from 'joi';
|
import joi from 'joi';
|
||||||
import error from '../error';
|
import error from '../error';
|
||||||
|
import _ from 'lodash';
|
||||||
|
|
||||||
let prefix;
|
let prefix;
|
||||||
|
|
||||||
export default (server, a, b, options) => {
|
export default (server, a, b, options) => {
|
||||||
prefix = options.prefix;
|
prefix = options.prefix;
|
||||||
|
|
||||||
|
get(server, a, b);
|
||||||
list(server, a, b);
|
list(server, a, b);
|
||||||
scope(server, a, b);
|
scope(server, a, b);
|
||||||
scopeScope(server, a, b);
|
scopeScope(server, a, b);
|
||||||
destroy(server, a, b);
|
destroy(server, a, b);
|
||||||
|
destroyScope(server, a, b);
|
||||||
update(server, a, b);
|
update(server, a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const get = (server, a, b) => {
|
||||||
|
server.route({
|
||||||
|
method: 'GET',
|
||||||
|
path: `${prefix}/${a._singular}/{aid}/${b._singular}/{bid}`,
|
||||||
|
|
||||||
|
@error
|
||||||
|
async handler(request, reply) {
|
||||||
|
let include = [];
|
||||||
|
if (request.query.include)
|
||||||
|
include = [request.models[request.query.include]];
|
||||||
|
|
||||||
|
let instance = await b.findOne({
|
||||||
|
where: {
|
||||||
|
id: request.params.bid
|
||||||
|
},
|
||||||
|
|
||||||
|
include: include.concat({
|
||||||
|
where: {
|
||||||
|
id: request.params.aid
|
||||||
|
},
|
||||||
|
model: a
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
reply(list);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export const list = (server, a, b) => {
|
export const list = (server, a, b) => {
|
||||||
server.route({
|
server.route({
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
@ -20,15 +52,21 @@ export const list = (server, a, b) => {
|
|||||||
|
|
||||||
@error
|
@error
|
||||||
async handler(request, reply) {
|
async handler(request, reply) {
|
||||||
let list = await b.findAll({
|
let include = [];
|
||||||
include: [{
|
if (request.query.include)
|
||||||
model: a,
|
include = [request.models[request.query.include]];
|
||||||
where: {
|
|
||||||
id: request.params.aid,
|
|
||||||
|
|
||||||
...request.query
|
let where = _.omit(request.query, 'include');
|
||||||
}
|
|
||||||
}]
|
let list = await b.findAll({
|
||||||
|
where,
|
||||||
|
|
||||||
|
include: include.concat({
|
||||||
|
where: {
|
||||||
|
id: request.params.aid
|
||||||
|
},
|
||||||
|
model: a
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
reply(list);
|
reply(list);
|
||||||
@ -45,15 +83,20 @@ export const scope = (server, a, b) => {
|
|||||||
|
|
||||||
@error
|
@error
|
||||||
async handler(request, reply) {
|
async handler(request, reply) {
|
||||||
let list = await b.scope(request.params.scope).findAll({
|
let include = [];
|
||||||
include: [{
|
if (request.query.include)
|
||||||
model: a,
|
include = [request.models[request.query.include]];
|
||||||
where: {
|
|
||||||
id: request.params.aid,
|
|
||||||
|
|
||||||
...request.query
|
let where = _.omit(request.query, 'include');
|
||||||
}
|
|
||||||
}]
|
let list = await b.scope(request.params.scope).findAll({
|
||||||
|
where,
|
||||||
|
include: include.concat({
|
||||||
|
where: {
|
||||||
|
id: request.params.aid
|
||||||
|
},
|
||||||
|
model: a
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
reply(list);
|
reply(list);
|
||||||
@ -82,13 +125,17 @@ export const scopeScope = (server, a, b) => {
|
|||||||
|
|
||||||
@error
|
@error
|
||||||
async handler(request, reply) {
|
async handler(request, reply) {
|
||||||
|
let include = [];
|
||||||
|
if (request.query.include)
|
||||||
|
include = [request.models[request.query.include]];
|
||||||
|
|
||||||
|
let where = _.omit(request.query, 'include');
|
||||||
|
|
||||||
let list = await b.scope(request.params.scopeb).findAll({
|
let list = await b.scope(request.params.scopeb).findAll({
|
||||||
include: [{
|
where,
|
||||||
model: a.scope(request.params.scopea),
|
include: include.concat({
|
||||||
where: {
|
model: a.scope(request.params.scopea)
|
||||||
...request.query
|
})
|
||||||
}
|
|
||||||
}]
|
|
||||||
})
|
})
|
||||||
|
|
||||||
reply(list);
|
reply(list);
|
||||||
@ -112,24 +159,63 @@ export const destroy = (server, a, b) => {
|
|||||||
|
|
||||||
@error
|
@error
|
||||||
async handler(request, reply) {
|
async handler(request, reply) {
|
||||||
|
let where = _.omit(request.query, 'include');
|
||||||
|
|
||||||
let list = await b.findAll({
|
let list = await b.findAll({
|
||||||
include: [{
|
where,
|
||||||
|
include: {
|
||||||
model: a,
|
model: a,
|
||||||
where: {
|
where: {
|
||||||
id: request.params.aid,
|
id: request.params.aid
|
||||||
|
|
||||||
...request.query
|
|
||||||
}
|
}
|
||||||
}]
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
await* list.map(instance => instance.destroy());
|
await* list.map(instance => instance.destroy());
|
||||||
|
|
||||||
reply();
|
reply(list);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const destroyScope = (server, a, b) => {
|
||||||
|
let scopes = Object.keys(b.options.scopes);
|
||||||
|
|
||||||
|
server.route({
|
||||||
|
method: 'DELETE',
|
||||||
|
path: `${prefix}/${a._singular}/{aid}/${b._plural}/{scope}`,
|
||||||
|
|
||||||
|
@error
|
||||||
|
async handler(request, reply) {
|
||||||
|
let where = _.omit(request.query, 'include');
|
||||||
|
|
||||||
|
let list = await b.scope(request.params.scope).findAll({
|
||||||
|
where,
|
||||||
|
|
||||||
|
include: {
|
||||||
|
model: a,
|
||||||
|
where: {
|
||||||
|
id: request.params.aid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await* list.map(instance => instance.destroy());
|
||||||
|
|
||||||
|
reply(list);
|
||||||
|
},
|
||||||
|
|
||||||
|
config: {
|
||||||
|
validate: {
|
||||||
|
params: joi.object().keys({
|
||||||
|
scope: joi.string().valid(...scopes),
|
||||||
|
aid: joi.number().integer().required()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export const update = (server, a, b) => {
|
export const update = (server, a, b) => {
|
||||||
server.route({
|
server.route({
|
||||||
method: 'PUT',
|
method: 'PUT',
|
||||||
@ -138,14 +224,14 @@ export const update = (server, a, b) => {
|
|||||||
@error
|
@error
|
||||||
async handler(request, reply) {
|
async handler(request, reply) {
|
||||||
let list = await b.findOne({
|
let list = await b.findOne({
|
||||||
include: [{
|
include: {
|
||||||
model: a,
|
model: a,
|
||||||
where: {
|
where: {
|
||||||
id: request.params.aid,
|
id: request.params.aid,
|
||||||
|
|
||||||
...request.query
|
...request.query
|
||||||
}
|
}
|
||||||
}]
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
await* list.map(instance => instance.update(request.payload));
|
await* list.map(instance => instance.update(request.payload));
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import joi from 'joi';
|
import joi from 'joi';
|
||||||
import error from '../error';
|
import error from '../error';
|
||||||
|
import _ from 'lodash';
|
||||||
|
|
||||||
let prefix;
|
let prefix;
|
||||||
|
|
||||||
@ -19,13 +20,17 @@ export const get = (server, a, b) => {
|
|||||||
|
|
||||||
@error
|
@error
|
||||||
async handler(request, reply) {
|
async handler(request, reply) {
|
||||||
|
let include = [];
|
||||||
|
if (request.query.include)
|
||||||
|
include = [request.models[request.query.include]];
|
||||||
|
|
||||||
let instance = await b.findOne({
|
let instance = await b.findOne({
|
||||||
include: [{
|
include: include.concat({
|
||||||
model: a,
|
model: a,
|
||||||
where: {
|
where: {
|
||||||
id: request.params.aid
|
id: request.params.aid
|
||||||
}
|
}
|
||||||
}]
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
reply(instance);
|
reply(instance);
|
||||||
@ -70,7 +75,7 @@ export const destroy = (server, a, b) => {
|
|||||||
|
|
||||||
await instance.destroy();
|
await instance.destroy();
|
||||||
|
|
||||||
reply();
|
reply(instance);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
57
src/crud.js
57
src/crud.js
@ -1,5 +1,6 @@
|
|||||||
import joi from 'joi';
|
import joi from 'joi';
|
||||||
import error from './error';
|
import error from './error';
|
||||||
|
import _ from 'lodash';
|
||||||
|
|
||||||
let prefix;
|
let prefix;
|
||||||
|
|
||||||
@ -11,6 +12,7 @@ export default (server, model, options) => {
|
|||||||
scope(server, model);
|
scope(server, model);
|
||||||
create(server, model);
|
create(server, model);
|
||||||
destroy(server, model);
|
destroy(server, model);
|
||||||
|
destroyScope(server, model);
|
||||||
update(server, model);
|
update(server, model);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -21,8 +23,13 @@ export const list = (server, model) => {
|
|||||||
|
|
||||||
@error
|
@error
|
||||||
async handler(request, reply) {
|
async handler(request, reply) {
|
||||||
|
if (request.query.include)
|
||||||
|
var include = [request.models[request.query.include]];
|
||||||
|
|
||||||
|
let where = _.omit(request.query, 'include');
|
||||||
|
|
||||||
let list = await model.findAll({
|
let list = await model.findAll({
|
||||||
where: request.query
|
where, include
|
||||||
});
|
});
|
||||||
|
|
||||||
reply(list);
|
reply(list);
|
||||||
@ -37,9 +44,12 @@ export const get = (server, model) => {
|
|||||||
|
|
||||||
@error
|
@error
|
||||||
async handler(request, reply) {
|
async handler(request, reply) {
|
||||||
let where = request.params.id ? { id : request.params.id } : request.query;
|
if (request.query.include)
|
||||||
|
var include = [request.models[request.query.include]];
|
||||||
|
|
||||||
let instance = await model.findOne({ where });
|
let where = request.params.id ? { id : request.params.id } : _.omit(request.query, 'include');
|
||||||
|
|
||||||
|
let instance = await model.findOne({ where, include });
|
||||||
|
|
||||||
reply(instance);
|
reply(instance);
|
||||||
},
|
},
|
||||||
@ -62,7 +72,12 @@ export const scope = (server, model) => {
|
|||||||
|
|
||||||
@error
|
@error
|
||||||
async handler(request, reply) {
|
async handler(request, reply) {
|
||||||
let list = await model.scope(request.params.scope).findAll();
|
if (request.query.include)
|
||||||
|
var include = [request.models[request.query.include]];
|
||||||
|
|
||||||
|
let where = _.omit(request.query, 'include');
|
||||||
|
|
||||||
|
let list = await model.scope(request.params.scope).findAll({ include, where });
|
||||||
|
|
||||||
reply(list);
|
reply(list);
|
||||||
},
|
},
|
||||||
@ -103,15 +118,45 @@ export const destroy = (server, model) => {
|
|||||||
|
|
||||||
await* list.map(instance => instance.destroy());
|
await* list.map(instance => instance.destroy());
|
||||||
|
|
||||||
reply();
|
reply(list.length === 1 ? list[0] : list);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const destroyScope = (server, model) => {
|
||||||
|
let scopes = Object.keys(model.options.scopes);
|
||||||
|
|
||||||
|
server.route({
|
||||||
|
method: 'DELETE',
|
||||||
|
path: `${prefix}/${model._plural}/{scope}`,
|
||||||
|
|
||||||
|
@error
|
||||||
|
async handler(request, reply) {
|
||||||
|
if (request.query.include)
|
||||||
|
var include = [request.models[request.query.include]];
|
||||||
|
|
||||||
|
let where = _.omit(request.query, 'include');
|
||||||
|
|
||||||
|
let list = await model.scope(request.params.scope).findAll({ include, where });
|
||||||
|
|
||||||
|
await* list.map(instance => instance.destroy());
|
||||||
|
|
||||||
|
reply(list);
|
||||||
|
},
|
||||||
|
config: {
|
||||||
|
validate: {
|
||||||
|
params: joi.object().keys({
|
||||||
|
scope: joi.string().valid(...scopes)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export const update = (server, model) => {
|
export const update = (server, model) => {
|
||||||
server.route({
|
server.route({
|
||||||
method: 'PUT',
|
method: 'PUT',
|
||||||
path: `/v1/${model._singular}/{id}`,
|
path: `${prefix}/${model._singular}/{id}`,
|
||||||
|
|
||||||
@error
|
@error
|
||||||
async handler(request, reply) {
|
async handler(request, reply) {
|
||||||
|
Loading…
Reference in New Issue
Block a user