34 lines
900 B
TypeScript
34 lines
900 B
TypeScript
import type { FastifyInstance } from 'fastify';
|
|
import fp from 'fastify-plugin';
|
|
import { Kysely } from 'kysely';
|
|
import { createDatabaseDialect, type DatabaseConfig } from '@/db/config.js';
|
|
import type { Database } from '@/db/types.js';
|
|
|
|
declare module 'fastify' {
|
|
interface FastifyInstance {
|
|
db: Kysely<Database>;
|
|
}
|
|
}
|
|
|
|
export type KyselyPluginOptions = DatabaseConfig;
|
|
|
|
/**
|
|
* Kysely plugin generates an OpenAPI spec and hosts a UI for browsing and trying the API
|
|
*/
|
|
async function _kyselyPlugin(fastify: FastifyInstance, options: KyselyPluginOptions) {
|
|
const dialect = createDatabaseDialect(options);
|
|
|
|
const db = new Kysely<Database>({
|
|
dialect,
|
|
});
|
|
|
|
fastify.decorate('db', db);
|
|
|
|
fastify.addHook('onClose', async (instance) => {
|
|
await instance.db.destroy();
|
|
instance.log.info('Database connection closed');
|
|
});
|
|
}
|
|
|
|
export const kyselyPlugin = fp(_kyselyPlugin, { name: 'kysely' });
|