@avonjs/avonjs
Version:
A fluent Node.js API generator.
49 lines (48 loc) • 2.45 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const Avon_1 = __importDefault(require("../../Avon"));
const Contracts_1 = require("../../Contracts");
const ResourceStoreResponse_1 = __importDefault(require("../Responses/ResourceStoreResponse"));
const Controller_1 = __importDefault(require("./Controller"));
class ResourceStoreController extends Controller_1.default {
/**
* Default route handler
*/
async __invoke(request) {
const resourceClass = request.resource();
const resourceModel = request.model();
request
.logger()
?.dump(`Authorizing user for "${Contracts_1.Ability.create}" access on "${request.resourceName()}".`);
await resourceClass.authorizeTo(request, Contracts_1.Ability.create);
request.logger()?.dump('Validating request payload for creation ...');
await resourceClass.validateForCreation(request);
request.logger()?.dump(`Storing "${request.resourceName()}" ...`);
const resource = await request.transaction(async (repository, transaction) => {
const [data, callbacks] = request
.resource()
.fillForCreation(request, resourceModel);
const resource = request.newResource(data);
await resource.beforeCreate(request);
const model = await repository.store(data);
// Attention:
// Here we have to run the "callbacks" in order
// To avoid update/insert at the same time
// Using "Promise.all" here will give the wrong result in some scenarios
for (const callback of callbacks)
await callback(request, model);
const newResource = request.newResource(model);
await newResource.afterCreate(request);
await newResource.recordCreationEvent(request.all(), transaction, Avon_1.default.userId(request));
return newResource;
});
request.logger()?.dump(`Stored new "${request.resourceName()}" ...`);
await resource.created(request);
request.logger()?.dump('Preparing response ...');
return new ResourceStoreResponse_1.default(await resource.serializeForStore(request));
}
}
exports.default = ResourceStoreController;