@avonjs/avonjs
Version:
A fluent Node.js API generator.
51 lines (50 loc) • 2.59 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 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;