UNPKG

@avonjs/avonjs

Version:

A fluent Node.js API generator.

150 lines (149 loc) 8.35 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const luxon_1 = require("luxon"); const Avon_1 = __importDefault(require("../Avon")); const ResponsableException_1 = __importDefault(require("../Exceptions/ResponsableException")); const ActionIndexController_1 = __importDefault(require("../Http/Controllers/ActionIndexController")); const ActionStoreController_1 = __importDefault(require("../Http/Controllers/ActionStoreController")); const AssociableController_1 = __importDefault(require("../Http/Controllers/AssociableController")); const ResourceDeleteController_1 = __importDefault(require("../Http/Controllers/ResourceDeleteController")); const ResourceDetailController_1 = __importDefault(require("../Http/Controllers/ResourceDetailController")); const ResourceForceDeleteController_1 = __importDefault(require("../Http/Controllers/ResourceForceDeleteController")); const ResourceIndexController_1 = __importDefault(require("../Http/Controllers/ResourceIndexController")); const ResourceLookupByFieldController_1 = __importDefault(require("../Http/Controllers/ResourceLookupByFieldController")); const ResourceRestoreController_1 = __importDefault(require("../Http/Controllers/ResourceRestoreController")); const ResourceReviewController_1 = __importDefault(require("../Http/Controllers/ResourceReviewController")); const ResourceStoreController_1 = __importDefault(require("../Http/Controllers/ResourceStoreController")); const ResourceUpdateController_1 = __importDefault(require("../Http/Controllers/ResourceUpdateController")); const SchemaController_1 = __importDefault(require("../Http/Controllers/SchemaController")); const ActionRequest_1 = __importDefault(require("../Http/Requests/ActionRequest")); const AssociableRequest_1 = __importDefault(require("../Http/Requests/AssociableRequest")); const ResourceCreateOrAttachRequest_1 = __importDefault(require("../Http/Requests/ResourceCreateOrAttachRequest")); const ResourceDeleteRequest_1 = __importDefault(require("../Http/Requests/ResourceDeleteRequest")); const ResourceDetailRequest_1 = __importDefault(require("../Http/Requests/ResourceDetailRequest")); const ResourceForceDeleteRequest_1 = __importDefault(require("../Http/Requests/ResourceForceDeleteRequest")); const ResourceIndexRequest_1 = __importDefault(require("../Http/Requests/ResourceIndexRequest")); const ResourceLookupByFieldRequest_1 = __importDefault(require("../Http/Requests/ResourceLookupByFieldRequest")); const ResourceRestoreRequest_1 = __importDefault(require("../Http/Requests/ResourceRestoreRequest")); const ResourceReviewRequest_1 = __importDefault(require("../Http/Requests/ResourceReviewRequest")); const ResourceUpdateOrUpdateAttachedRequest_1 = __importDefault(require("../Http/Requests/ResourceUpdateOrUpdateAttachedRequest")); const SchemaRequest_1 = __importDefault(require("../Http/Requests/SchemaRequest")); const helpers_1 = require("../helpers"); const debug_1 = __importDefault(require("../support/debug")); const controllers = { ResourceIndexController: { controller: () => new ResourceIndexController_1.default(), request: (request) => new ResourceIndexRequest_1.default(request), }, ResourceStoreController: { controller: () => new ResourceStoreController_1.default(), request: (request) => new ResourceCreateOrAttachRequest_1.default(request), }, ResourceDetailController: { controller: () => new ResourceDetailController_1.default(), request: (request) => new ResourceDetailRequest_1.default(request), }, ResourceLookupByFieldController: { controller: () => new ResourceLookupByFieldController_1.default(), request: (request) => new ResourceLookupByFieldRequest_1.default(request), }, ResourceUpdateController: { controller: () => new ResourceUpdateController_1.default(), request: (request) => new ResourceUpdateOrUpdateAttachedRequest_1.default(request), }, ResourceDeleteController: { controller: () => new ResourceDeleteController_1.default(), request: (request) => new ResourceDeleteRequest_1.default(request), }, ResourceForceDeleteController: { controller: () => new ResourceForceDeleteController_1.default(), request: (request) => new ResourceForceDeleteRequest_1.default(request), }, ResourceRestoreController: { controller: () => new ResourceRestoreController_1.default(), request: (request) => new ResourceRestoreRequest_1.default(request), }, ResourceReviewController: { controller: () => new ResourceReviewController_1.default(), request: (request) => new ResourceReviewRequest_1.default(request), }, ActionIndexController: { controller: () => new ActionIndexController_1.default(), request: (request) => new ActionRequest_1.default(request), }, ActionStoreController: { controller: () => new ActionStoreController_1.default(), request: (request) => new ActionRequest_1.default(request), }, AssociableController: { controller: () => new AssociableController_1.default(), request: (request) => new AssociableRequest_1.default(request), }, SchemaController: { controller: () => new SchemaController_1.default(), request: (request) => new SchemaRequest_1.default(request), }, }; // TODO: may i have to export new class instance instead of static method // biome-ignore lint/complexity/noStaticOnlyClass: class Dispatcher { /** * Dispatch incoming request to correspond controller. */ static dispatch(handler) { const [controller, method] = [...handler.split('@'), '__invoke']; if (controllers[controller] === undefined) { throw Error(`AvonError: Controller ${controller} not found`); } const controllerInstance = controllers[controller].controller(); if (typeof controllerInstance[method] !== 'function') { throw Error(`AvonError: Invalid route handler ${controller}@${method}`); } return async (req, res) => { const logger = debug_1.default.extend(Dispatcher.generateRequestId()); logger.dump(`Dispatching request "${req.method}:${req.url}" to "${controller}"`); const request = controllers[controller].request(req); // set the unique logger for incoming request request.setLogger(logger); // set the unique logger for incoming request request.setUser(await Avon_1.default.resolveUser(request)); // dispatch request to the controller controllerInstance[method](request) .then((response) => { (0, helpers_1.send)(res, response); logger.dump('Response sent.'); }) .catch((error) => { logger.dump(error); if (error instanceof ResponsableException_1.default) { (0, helpers_1.send)(res, error.toResponse()); } else { Avon_1.default.handleError(error); res .status(500) .send({ message: error.message, name: 'InternalServerError' }); } }); }; } static generateRequestId() { // Generate the current date with Luxon const date = luxon_1.DateTime.now().toFormat('yyLLdd'); // e.g., "20241026" const time = luxon_1.DateTime.now().toFormat('HHmmss'); // e.g., "153023" // Generate microsecond-like precision by combining millisecond precision with a random number const microseconds = Math.floor(luxon_1.DateTime.now().millisecond * 1000 + Math.random() * 1000) .toString() .padStart(6, '0'); // e.g., "456789" // Generate a short random suffix for extra uniqueness const randomSuffix = Math.ceil(Math.random() * 10000) .toString() .padEnd(4, '0'); // e.g., "07" // Combine to form the final ID return `${date}-${time}-${microseconds}-${randomSuffix}`; } } exports.default = Dispatcher;