@avonjs/avonjs
Version:
A fluent Node.js API generator.
150 lines (149 loc) • 8.35 kB
JavaScript
;
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;