apeman-app-rest
Version:
apeman app to handle restful endpoint.
90 lines (72 loc) • 1.96 kB
JavaScript
/**
* Endpoint for update
* @augments Endpoint
* @class UpdateEndpoint
*/
const Endpoint = require('./endpoint')
const validateDataGiven = require('../validating/validate_data_given')
const validateDataVr = require('../validating/validate_data_vr')
const validateDataType = require('../validating/validate_data_type')
const validateModelExists = require('../validating/validate_model_exists')
const { toType, toData, defineUpdate } = require('apemanmodel')
const co = require('co')
/** @lends UpdateEndpoint */
class UpdateEndpoint extends Endpoint {
getDefaultConfig () {
return {
name: 'update'
}
}
handle (ctx, next) {
const s = this
let succeed = s.bindSucceed(ctx)
let fail = s.bindFail(ctx)
return co(function * () {
let { state } = ctx
let { instance, data, model } = state
let error = s.validate(data, state)
if (error) {
return fail(error)
}
let updated = yield s.update(instance, data, state)
return succeed(
{},
toData(model, updated),
{
self: '.'
}
)
})
}
validate (data, state) {
let { instance, model, id } = state
let type = toType(model)
let dataGivenError = validateDataGiven(data)
if (dataGivenError) {
return dataGivenError
}
let typeErrors = validateDataType(data, type)
if (typeErrors) {
return typeErrors
}
let existsError = validateModelExists(model, id, instance)
if (existsError) {
return existsError
}
let vrError = validateDataVr(data, instance.vr)
if (vrError) {
return vrError
}
return null
}
update (instance, data, state) {
const s = this
return co(function * () {
let { model, transaction } = state
let update = defineUpdate(model, transaction)
return yield update(instance, data.attributes)
})
}
}
module.exports = UpdateEndpoint