apeman-app-rest
Version:
apeman app to handle restful endpoint.
94 lines (78 loc) • 1.97 kB
JavaScript
/**
* Endpoint for create
* @augments Endpoint
* @class CreateEndpoint
*/
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