You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					80 lines
				
				3.4 KiB
			
		
		
			
		
	
	
					80 lines
				
				3.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", { value: true });
							 | 
						||
| 
								 | 
							
								exports.buildRouter = void 0;
							 | 
						||
| 
								 | 
							
								const tslib_1 = require("tslib");
							 | 
						||
| 
								 | 
							
								const adminjs_1 = require("adminjs");
							 | 
						||
| 
								 | 
							
								const path_1 = tslib_1.__importDefault(require("path"));
							 | 
						||
| 
								 | 
							
								const errors_1 = require("./errors");
							 | 
						||
| 
								 | 
							
								const logger_1 = require("./logger");
							 | 
						||
| 
								 | 
							
								const lodash_1 = require("lodash");
							 | 
						||
| 
								 | 
							
								const promises_1 = require("fs/promises");
							 | 
						||
| 
								 | 
							
								const mime = tslib_1.__importStar(require("mime-types"));
							 | 
						||
| 
								 | 
							
								const multipart_1 = tslib_1.__importDefault(require("@fastify/multipart"));
							 | 
						||
| 
								 | 
							
								const INVALID_ADMIN_JS_INSTANCE = 'You have to pass an instance of AdminJS to the buildRouter() function';
							 | 
						||
| 
								 | 
							
								const getFile = (fileField) => {
							 | 
						||
| 
								 | 
							
								    if (!(fileField === null || fileField === void 0 ? void 0 : fileField.file)) {
							 | 
						||
| 
								 | 
							
								        return null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    const { file, filename } = fileField;
							 | 
						||
| 
								 | 
							
								    file.name = filename;
							 | 
						||
| 
								 | 
							
								    return file;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								const buildRouter = async (admin, fastifyApp) => {
							 | 
						||
| 
								 | 
							
								    var _a;
							 | 
						||
| 
								 | 
							
								    const { assets } = adminjs_1.Router;
							 | 
						||
| 
								 | 
							
								    if (((_a = admin === null || admin === void 0 ? void 0 : admin.constructor) === null || _a === void 0 ? void 0 : _a.name) !== 'AdminJS') {
							 | 
						||
| 
								 | 
							
								        throw new errors_1.WrongArgumentError(INVALID_ADMIN_JS_INSTANCE);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    await fastifyApp.register(multipart_1.default, { attachFieldsToBody: true });
							 | 
						||
| 
								 | 
							
								    admin.initialize().then(() => {
							 | 
						||
| 
								 | 
							
								        logger_1.log.debug('AdminJS: bundle ready');
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    const { routes } = adminjs_1.Router;
							 | 
						||
| 
								 | 
							
								    routes.forEach(route => {
							 | 
						||
| 
								 | 
							
								        // we have to change routes defined in AdminJS from {recordId} to :recordId
							 | 
						||
| 
								 | 
							
								        const path = route.path.replace(/{/g, ':').replace(/}/g, '');
							 | 
						||
| 
								 | 
							
								        const handler = async (request, reply) => {
							 | 
						||
| 
								 | 
							
								            var _a;
							 | 
						||
| 
								 | 
							
								            const controller = new route.Controller({ admin }, (_a = request.session) === null || _a === void 0 ? void 0 : _a.adminUser);
							 | 
						||
| 
								 | 
							
								            const { params, query } = request;
							 | 
						||
| 
								 | 
							
								            const method = request.method.toLowerCase();
							 | 
						||
| 
								 | 
							
								            const body = request.body;
							 | 
						||
| 
								 | 
							
								            const fields = (0, lodash_1.fromPairs)(Object.keys((body !== null && body !== void 0 ? body : {})).map(key => {
							 | 
						||
| 
								 | 
							
								                var _a;
							 | 
						||
| 
								 | 
							
								                return [
							 | 
						||
| 
								 | 
							
								                    key,
							 | 
						||
| 
								 | 
							
								                    (_a = getFile(body[key])) !== null && _a !== void 0 ? _a : body[key].value,
							 | 
						||
| 
								 | 
							
								                ];
							 | 
						||
| 
								 | 
							
								            }));
							 | 
						||
| 
								 | 
							
								            const html = await controller[route.action](Object.assign(Object.assign({}, request), { params,
							 | 
						||
| 
								 | 
							
								                query, payload: fields !== null && fields !== void 0 ? fields : {}, method }), reply);
							 | 
						||
| 
								 | 
							
								            if (route.contentType) {
							 | 
						||
| 
								 | 
							
								                reply.type(route.contentType);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else if (typeof html === 'string') {
							 | 
						||
| 
								 | 
							
								                reply.type('text/html');
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if (html) {
							 | 
						||
| 
								 | 
							
								                return reply.send(html);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								        if (route.method === 'GET') {
							 | 
						||
| 
								 | 
							
								            fastifyApp.get(`${admin.options.rootPath}${path}`, handler);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (route.method === 'POST') {
							 | 
						||
| 
								 | 
							
								            fastifyApp.post(`${admin.options.rootPath}${path}`, handler);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    assets.forEach(asset => {
							 | 
						||
| 
								 | 
							
								        fastifyApp.get(`${admin.options.rootPath}${asset.path}`, async (_req, reply) => {
							 | 
						||
| 
								 | 
							
								            const mimeType = mime.lookup(asset.src);
							 | 
						||
| 
								 | 
							
								            const file = await (0, promises_1.readFile)(path_1.default.resolve(asset.src));
							 | 
						||
| 
								 | 
							
								            if (mimeType) {
							 | 
						||
| 
								 | 
							
								                return reply.type(mimeType).send(file);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return reply.send(file);
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								exports.buildRouter = buildRouter;
							 |