UNPKG

@opengis/fastify-table

Version:

core-plugins

90 lines (71 loc) 2.82 kB
import path from 'node:path'; import officeWrapper from '../../../plugins/grpc/office2pdf.js'; import { downloadFile, isFileExists, uploadFile, logger, pgClients, } from '../../../../utils.js'; const { officeToPdf } = officeWrapper(); const mimeTypes = { png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif', webp: 'image/webp', bmp: 'image/bmp', svg: 'image/svg+xml', tiff: 'image/tiff', pdf: 'application/pdf', }; export default async function filePreview({ pg = pgClients.client, query = {} }, reply) { const { id, nocache } = query; if (!id) { return reply.status(400).send('not enough params: id'); } const filePath = await pg.query('select file_path from crm.files where file_id = $1', [id.replace(/.pdf/, '')]) .then((el) => el.rows?.[0]?.file_path); if (!filePath) { logger.file('/file-preview', { error: 'File with provided id does not found', id }); return reply.status(404).send('File not found'); } const { base, ext } = path.parse(filePath); const fileExt = ext.substring(1).toLowerCase(); const filePathPreview = filePath.replace('files/', 'files/preview/'); const previewExists = await isFileExists(filePathPreview); if (previewExists && !nocache) { const buffer = await downloadFile(filePathPreview, { buffer: true }); return reply .status(200) .headers({ 'Content-Type': 'application/pdf', 'Content-Disposition': `inline; filename="${base}.pdf"`, }) .send(buffer); } const fileData = await downloadFile(filePath, { buffer: true }); if (!fileData) { logger.file('/file-preview', { error: 'File with provided id does not found', id, filePath }); return reply.status(404).send('File not found'); } if (!mimeTypes[fileExt] && !['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx', 'csv'].includes(fileExt)) { logger.file('/file-preview', { error: 'Unsupported file type', id, filePath }); return reply.status(415).send('Unsupported file type'); } if (!['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx', 'csv'].includes(fileExt)) { return reply .status(200) .headers({ 'Content-Type': mimeTypes[fileExt] || 'application/octet-stream', 'Content-Disposition': `inline; filename="${base}"`, }) .send(Buffer.from(fileData, 'base64')); } const { file } = await officeToPdf({ file: Buffer.from(fileData).toString('base64'), ext: fileExt }); const buffer = Buffer.from(file, 'base64'); await uploadFile(filePathPreview, buffer); return reply .status(200) .headers({ 'Content-Type': 'application/pdf', 'Content-Disposition': `inline; filename="${base}.pdf"`, }) .send(buffer); }