UNPKG

apeman-app-rest

Version:
94 lines (78 loc) 1.97 kB
/** * Endpoint for create * @augments Endpoint * @class CreateEndpoint */ 'use strict' const Endpoint = require('./endpoint') const BulkCreateEndpoint = require('./bulk/bulk_create_endpoint') const validateDataType = require('../validating/validate_data_type') const validateDataGiven = require('../validating/validate_data_given') const { toType, toData, defineCreate } = require('apemanmodel') const co = require('co') /** @lends CreateEndpoint */ class CreateEndpoint extends Endpoint { /** * @override */ getDefaultConfig () { return { name: 'create' } } /** * @override */ handle (ctx, next) { const s = this let succeed = s.bindSucceed(ctx) let fail = s.bindFail(ctx) return co(function * create () { let { state } = ctx let { data, model } = 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.create(data, state) return succeed( { status: 201 }, toData(model, created, {}), { self: `./${created.id}` } ) }) } /** * @override */ validate (data, state) { let type = toType(state.model) let dataGivenError = validateDataGiven(data) if (dataGivenError) { return dataGivenError } let typeErrors = validateDataType(data, type) if (typeErrors) { return typeErrors } return null } create (data, state) { const s = this let { transaction, model } = state let create = defineCreate(model, transaction) return co(function * () { return yield create(data) }) } handleBulk (ctx, next) { const s = this let config = Object.assign({}, s.config, { name: 'bulkCreate' }) return new BulkCreateEndpoint(config).handle(ctx, next) } } module.exports = CreateEndpoint