UNPKG

@avonjs/avonjs

Version:

A fluent Node.js API generator.

51 lines (50 loc) 2.59 kB
"use strict"; 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 ResourceUpdateResponse_1 = __importDefault(require("../Responses/ResourceUpdateResponse")); const Controller_1 = __importDefault(require("./Controller")); class ResourceUpdateController extends Controller_1.default { /** * Default route handler */ async __invoke(request) { request .logger() ?.dump(`Searching on "${request.resourceName()}" repository ...`); const resource = await request.findResourceOrFail(); const previous = request.newModel({ ...resource.resource.getAttributes() }); request .logger() ?.dump(`Authorizing user for "${Contracts_1.Ability.update}" access on "${request.resourceName()}".`); await resource.authorizeTo(request, Contracts_1.Ability.update); request.logger()?.dump('Validating request payload for update ...'); await resource.validateForUpdate(request, resource); request.logger()?.dump(`Updating "${request.resourceName()}" ...`); const newResource = await request.transaction(async (repository, transaction) => { const [model, callbacks] = request .resource() .fillForUpdate(request, resource.resource); const newResource = request.newResource(model); await newResource.beforeUpdate(request); await repository.update(model); // 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); await newResource.afterUpdate(request, previous); await newResource.recordUpdateEvent(previous, request.all(), transaction, Avon_1.default.userId(request)); return newResource; }); request.logger()?.dump(`Updated "${request.resourceName()}" ...`); await newResource.updated(request, previous); request.logger()?.dump('Preparing response ...'); return new ResourceUpdateResponse_1.default(await newResource.serializeForUpdate(request)); } } exports.default = ResourceUpdateController;