@itrocks/framework
Version:
RAD framework for intuitive web application development, blending data and domain-driven design with modular architecture
86 lines • 4.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.servers = void 0;
exports.run = run;
const action_1 = require("@itrocks/action");
const action_2 = require("@itrocks/action");
const action_request_1 = require("@itrocks/action-request");
const action_request_2 = require("@itrocks/action-request");
const app_dir_1 = require("@itrocks/app-dir");
const class_type_1 = require("@itrocks/class-type");
const config_1 = require("@itrocks/config");
const fastify_1 = require("@itrocks/fastify");
const fastify_file_session_store_1 = require("@itrocks/fastify-file-session-store");
const request_response_1 = require("@itrocks/request-response");
const route_1 = require("@itrocks/route");
const store_1 = require("@itrocks/store");
const template_1 = require("@itrocks/template");
const node_path_1 = require("node:path");
const node_path_2 = require("node:path");
template_1.frontScripts.push('/lib/air-datepicker/locale/en.js', '/lib/air-datepicker/locale/fr.js');
async function execute(request) {
// Access control
if ((config_1.config.access?.free !== '*')
&& !request.request.session.user
&& !config_1.config.access?.free?.includes(request.route + '/' + request.action)) {
request.action = 'login';
request.route = '/user';
}
// Resolve action class or function module
const module = route_1.routes.resolve(request.route + '/' + request.action);
// undefined module
if (!module) {
console.error('Action ' + request.route + '/' + request.action + ' not found');
throw 'Action ' + request.route + '/' + request.action + ' not found';
}
// ActionClass module
if ((0, class_type_1.isAnyType)(module)) {
const action = (new module);
if (request.format in action) {
const need = (0, action_2.needOf)(action);
if (need.alternative
&& (need.alternative !== request.action)
&& (((need.need === 'object') && !request.ids.length)
|| ((need.need === 'Store') && !(0, store_1.storeOf)(request.type)))) {
request.action = need.alternative;
return execute(request);
}
if ((need.need === 'object') && !request.ids.length && !request.request.data.confirm) {
console.error('Action ' + request.route + '/' + request.action + ' needs at least one object');
throw 'Action ' + request.route + '/' + request.action + ' needs at least one ';
}
return toResponse(await action[request.format](request));
}
}
// ActionFunction module
return toResponse(await module(request));
}
async function run() {
await (0, route_1.loadRoutes)(route_1.routes, config_1.config.routes ?? {});
(0, action_request_1.actionRequestDependsOn)({
getModule: route_1.routes.resolve.bind(route_1.routes),
isDomainObject: object => (0, class_type_1.isAnyType)(object) && !(object.prototype instanceof action_1.Action)
});
const server = new fastify_1.FastifyServer({
assetPath: app_dir_1.appDir,
execute: request => execute(new action_request_2.Request(request)),
favicon: config_1.config.container?.favicon ?? (0, node_path_2.normalize)((0, node_path_1.join)(__dirname, '../favicon.png')),
frontScripts: template_1.frontScripts,
host: config_1.config.server.host,
manifest: config_1.config.container?.manifest,
port: config_1.config.server.port,
scriptCalls: ['loadCss', 'loadScript'],
secret: config_1.config.session.secret ?? config_1.config.secret ?? 'defaultSecretHaving32CharactersOrGreater',
secure: config_1.config.server.secure ?? 'auto',
store: new fastify_file_session_store_1.FileStore((0, node_path_2.normalize)((0, node_path_1.join)(app_dir_1.appDir, config_1.config.session.path)))
});
server.run();
exports.servers.push(server);
}
exports.servers = new Array();
function toResponse(mixedResponse) {
return (typeof mixedResponse === 'string')
? new request_response_1.Response(mixedResponse)
: mixedResponse;
}
//# sourceMappingURL=main.js.map