UNPKG

apeman-app-rest

Version:
97 lines (82 loc) 2.37 kB
/** * Endpoint for related create * @augments Endpoint * @class RelationCreateEndpoint */ 'use strict' const Endpoint = require('./endpoint') const BulkRelationCreateEndpoint = require('./bulk/bulk_relation_create_endpoint') const validateDataType = require('../validating/validate_data_type') const validateModelExists = require('../validating/validate_model_exists') const validateDataGiven = require('../validating/validate_data_given') const { toType, toData, defineRelationCreate } = require('apemanmodel') const co = require('co') /** @lends RelationCreateEndpoint */ class RelationCreateEndpoint extends Endpoint { /** * @override */ getDefaultConfig () { return { name: 'relatedCreate' } } /** * @override */ handle (ctx, next) { const s = this let succeed = s.bindSucceed(ctx) let fail = s.bindFail(ctx) return co(function * () { let { state } = ctx let { id, data, association } = state let isBulk = Array.isArray(data) if (isBulk) { return yield s.handleBulk(ctx, next) } let error = s.validate(data, state) if (error) { return fail(error) } let created = yield s.relationCreate(id, data, state) return succeed( {}, toData.withoutAttributes(association.target, created, {}) ) }) } /** * @override */ validate (data, state) { let { association, model, id, instance } = state let type = toType(association.target) let dataGivenError = validateDataGiven(data) if (dataGivenError) { return dataGivenError } let relatedTypeError = validateDataType(data, type) if (relatedTypeError) { return relatedTypeError } let existsError = validateModelExists(model, id, instance) if (existsError) { return existsError } return null } relationCreate (id, data, state) { let { model, association, transaction } = state return co(function * () { let relationCreate = defineRelationCreate(model, association, transaction) return yield relationCreate(id, data) }) } handleBulk (ctx, next) { const s = this let config = Object.assign({}, s.config, { name: 'bulkRelationCreate' }) return new BulkRelationCreateEndpoint(config).handle(ctx, next) } } module.exports = RelationCreateEndpoint