@opengis/bi
Version:
BI data visualization module
90 lines (80 loc) • 2.37 kB
JavaScript
import fp from 'fastify-plugin';
import fs from 'fs';
// the use of fastify-plugin is required to be able
// to export the decorators to the outer scope
async function plugin(fastify) {
// preSerialization
fastify.addHook('preSerialization', async (req, reply, payload) => {
if (!req.session?.passport?.user?.uid) {
// return reply.redirect('/login');
}
if (req.url.includes('/suggest/') && !req.query.json) {
return payload?.data;
}
if (payload.redirect) {
return reply.redirect(payload.redirect);
}
if (reply.sent) {
return null;
}
if ([200, 400, 403, 409, 404, 500].includes(payload.status)) {
reply.status(payload.status);
}
/* if (payload.headers) {
reply.headers(payload.headers);
} */
if (payload.buffer) {
return payload.buffer;
}
if (payload.file) {
// const buffer = await readFile(payload.file);
// return reply.send(buffer);
const stream = fs.createReadStream(payload.file);
return stream;
// return reply.send(stream);
}
if (payload.message) {
return payload.message;
}
return payload;
});
// preValidation
fastify.addHook('preValidation', async (req) => {
const parseRawBody =
['POST', 'PUT'].includes(req.method) &&
req.body &&
typeof req.body === 'string' &&
req.body.trim(/\r\n/g).startsWith('{') &&
req.body.trim(/\r\n/g).endsWith('}');
if (parseRawBody) {
try {
req.body = JSON.parse(req.body || '{}');
} catch (err) {
// throw new Error('invalid body');
// return { error: 'invalid body', status: 400 };
}
}
});
// allow upload file
// const kIsMultipart = Symbol.for('[FastifyMultipart.isMultipart]');
// fastify.addContentTypeParser('multipart', (request, _, done) => {
// request[kIsMultipart] = true;
// done(null);
// });
// parse Body
function contentParser(req, body, done) {
const parseBody = decodeURIComponent(body.toString())
.split('&')
.reduce((acc, el) => {
const [key, val] = el.split('=');
return { ...acc, [key]: val };
}, {});
done(null, parseBody);
}
fastify.addContentTypeParser(
'application/x-www-form-urlencoded',
{ parseAs: 'buffer' },
contentParser
);
}
export default fp(plugin);