UNPKG

apeman-app-rest

Version:
89 lines (72 loc) 2.13 kB
/** * Endpoint for relation update * @augments Endpoint * @class RelationUpdateEndpoint */ 'use strict' const Endpoint = require('./endpoint') const validateModelExists = require('../validating/validate_model_exists') const { defineRelatedGet, defineRelationUpdate } = require('apemanmodel') const co = require('co') /** @lends RelationUpdateEndpoint */ class RelationUpdateEndpoint extends Endpoint { /** * @override */ getDefaultConfig () { return { name: 'relationUpdate' } } /** * @override */ handle (ctx, next) { const s = this let succeed = s.bindSucceed(ctx) let fail = s.bindFail(ctx) let { state } = ctx let { id, data } = state return co(function * () { let error = s.validate(data, state) if (error) { return fail(error) } let result = yield s.relationUpdate(id, data, state) return succeed(result) }) } /** * @override */ validate (data, state) { let { model, id, instance } = state let existsError = validateModelExists(model, id, instance) if (existsError) { return existsError } return null } relationUpdate (id, data, state) { let { model, association, transaction, instance } = state let relatedGet = defineRelatedGet(model, association, transaction) let relationUpdate = defineRelationUpdate(model, association, transaction) return co(function * () { let related = yield relatedGet(instance) let relatedIds = [].concat(related || []).map((related) => String(related.id)) let dataIds = [].concat(data || []).map((data) => String(data.id)) let removing = [].concat(related || []).filter((related) => !~dataIds.indexOf(String(related.id)) ).map((related) => related.toJSON()) let adding = [].concat(data || []).filter((data) => !~relatedIds.indexOf(String(data.id)) ) let { added, removed } = yield relationUpdate(id, adding, removing) return { added: added, removed: removed.length } }) } } module.exports = RelationUpdateEndpoint