import { Injectable } from '@nestjs/common'; import { Insertable, Kysely } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; import { readFile } from 'node:fs/promises'; import { DB, SystemMetadata as DbSystemMetadata } from 'src/db'; import { GenerateSql } from 'src/decorators'; import { SystemMetadata } from 'src/types'; type Upsert = Insertable; @Injectable() export class SystemMetadataRepository { constructor(@InjectKysely() private db: Kysely) {} @GenerateSql({ params: ['metadata_key'] }) async get(key: T): Promise { const metadata = await this.db .selectFrom('system_metadata') .select('value') .where('key', '=', key) .executeTakeFirst(); if (!metadata) { return null; } return metadata.value as SystemMetadata[T]; } @GenerateSql({ params: ['metadata_key', { foo: 'bar' }] }) async set(key: T, value: SystemMetadata[T]): Promise { await this.db .insertInto('system_metadata') .values({ key, value } as Upsert) .onConflict((oc) => oc.columns(['key']).doUpdateSet({ value } as Upsert)) .execute(); } @GenerateSql({ params: ['metadata_key'] }) async delete(key: T): Promise { await this.db.deleteFrom('system_metadata').where('key', '=', key).execute(); } readFile(filename: string): Promise { return readFile(filename, { encoding: 'utf8' }); } }