Files
zipline/src/server/decorators/dbFile.ts
2023-10-08 11:06:16 -07:00

41 lines
1.2 KiB
TypeScript

import { File } from '@prisma/client';
import { FastifyInstance, FastifyReply } from 'fastify';
import fastifyPlugin from 'fastify-plugin';
import exts from 'lib/exts';
function dbFileDecorator(fastify: FastifyInstance, _, done) {
fastify.decorateReply('dbFile', dbFile);
done();
async function dbFile(this: FastifyReply, file: File) {
const { download } = this.request.query as { download?: string };
const ext = file.name.split('.').pop();
if (Object.keys(exts).includes(ext)) return this.server.nextHandle(this.request.raw, this.raw);
const data = await this.server.datasource.get(file.name);
if (!data) return this.notFound();
const size = await this.server.datasource.size(file.name);
this.header('Content-Length', size);
this.header('Content-Type', download ? 'application/octet-stream' : file.mimetype);
this.header('Content-Disposition', `inline; filename="${encodeURI(file.originalName || file.name)}"`);
return this.send(data);
}
}
export default fastifyPlugin(dbFileDecorator, {
name: 'dbFile',
decorators: {
fastify: ['prisma', 'datasource', 'nextHandle', 'logger'],
},
});
declare module 'fastify' {
interface FastifyReply {
dbFile: (file: File) => Promise<void>;
}
}