sourcebot/packages/backend/src/db.ts

82 lines
2.1 KiB
TypeScript
Raw Normal View History

2024-10-17 20:31:18 +00:00
import { JSONFilePreset } from "lowdb/node";
import { type Low } from "lowdb";
import { AppContext, Repository, Settings } from "./types.js";
import { DEFAULT_SETTINGS } from "./constants.js";
import { createLogger } from "./logger.js";
2024-10-17 20:31:18 +00:00
const logger = createLogger('db');
export type Schema = {
settings: Settings,
2024-10-17 20:31:18 +00:00
repos: {
[key: string]: Repository;
}
}
export type Database = Low<Schema>;
export const loadDB = async (ctx: AppContext): Promise<Database> => {
const db = await JSONFilePreset<Schema>(`${ctx.cachePath}/db.json`, {
repos: {},
settings: DEFAULT_SETTINGS,
});
await applyMigrations(db);
2024-10-17 20:31:18 +00:00
return db;
}
2024-11-01 17:51:14 +00:00
export const updateRepository = async (repoId: string, data: Repository, db: Database) => {
2024-10-17 20:31:18 +00:00
db.data.repos[repoId] = {
...db.data.repos[repoId],
...data,
}
await db.write();
}
export const updateSettings = async (settings: Settings, db: Database) => {
db.data.settings = settings;
await db.write();
}
2024-10-17 20:31:18 +00:00
export const createRepository = async (repo: Repository, db: Database) => {
db.data.repos[repo.id] = repo;
await db.write();
}
export const applyMigrations = async (db: Database) => {
const log = (name: string) => {
logger.info(`Applying migration '${name}'`);
}
await db.update((schema) => {
// @NOTE: please ensure new migrations are added after older ones!
schema = migration_addSettings(schema, log);
schema = migration_addMaxFileSize(schema, log);
return schema;
});
}
/**
* @see: https://github.com/sourcebot-dev/sourcebot/pull/118
*/
export const migration_addSettings = (schema: Schema, log?: (name: string) => void) => {
if (!schema.settings) {
log?.("addSettings");
schema.settings = DEFAULT_SETTINGS;
}
return schema;
}
/**
* @see: https://github.com/sourcebot-dev/sourcebot/pull/118
*/
export const migration_addMaxFileSize = (schema: Schema, log?: (name: string) => void) => {
if (!schema.settings.maxFileSize) {
log?.("addMaxFileSize");
schema.settings.maxFileSize = DEFAULT_SETTINGS.maxFileSize;
}
return schema;
2024-10-17 20:31:18 +00:00
}