apeman-app-rest
Version:
apeman app to handle restful endpoint.
89 lines (72 loc) • 2.13 kB
JavaScript
/**
* Endpoint for relation update
* @augments Endpoint
* @class RelationUpdateEndpoint
*/
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