UNPKG

apeman-app-rest

Version:
90 lines (72 loc) 1.96 kB
/** * Endpoint for update * @augments Endpoint * @class UpdateEndpoint */ 'use strict' 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