75 lines
1.8 KiB
TypeScript
75 lines
1.8 KiB
TypeScript
/**
|
|
* Settings repository - key/value storage for runtime configuration.
|
|
*/
|
|
|
|
import { eq } from 'drizzle-orm'
|
|
import { db, schema } from '../db/index.js'
|
|
|
|
const { settings } = schema
|
|
|
|
export type SettingKey = 'model'
|
|
| 'modelScorer'
|
|
| 'modelTailoring'
|
|
| 'modelProjectSelection'
|
|
| 'pipelineWebhookUrl'
|
|
| 'jobCompleteWebhookUrl'
|
|
| 'resumeProjects'
|
|
| 'rxresumeBaseResumeId'
|
|
| 'ukvisajobsMaxJobs'
|
|
| 'gradcrackerMaxJobsPerTerm'
|
|
| 'searchTerms'
|
|
| 'jobspyLocation'
|
|
| 'jobspyResultsWanted'
|
|
| 'jobspyHoursOld'
|
|
| 'jobspyCountryIndeed'
|
|
| 'jobspySites'
|
|
| 'jobspyLinkedinFetchDescription'
|
|
| 'showSponsorInfo'
|
|
| 'openrouterApiKey'
|
|
| 'rxresumeEmail'
|
|
| 'rxresumePassword'
|
|
| 'basicAuthUser'
|
|
| 'basicAuthPassword'
|
|
| 'ukvisajobsEmail'
|
|
| 'ukvisajobsPassword'
|
|
| 'webhookSecret'
|
|
|
|
export async function getSetting(key: SettingKey): Promise<string | null> {
|
|
const [row] = await db.select().from(settings).where(eq(settings.key, key))
|
|
return row?.value ?? null
|
|
}
|
|
|
|
export async function getAllSettings(): Promise<Partial<Record<SettingKey, string>>> {
|
|
const rows = await db.select().from(settings)
|
|
return rows.reduce((acc, row) => {
|
|
acc[row.key as SettingKey] = row.value
|
|
return acc
|
|
}, {} as Partial<Record<SettingKey, string>>)
|
|
}
|
|
|
|
export async function setSetting(key: SettingKey, value: string | null): Promise<void> {
|
|
const now = new Date().toISOString()
|
|
|
|
if (value === null) {
|
|
await db.delete(settings).where(eq(settings.key, key))
|
|
return
|
|
}
|
|
|
|
const [existing] = await db.select({ key: settings.key }).from(settings).where(eq(settings.key, key))
|
|
|
|
if (existing) {
|
|
await db
|
|
.update(settings)
|
|
.set({ value, updatedAt: now })
|
|
.where(eq(settings.key, key))
|
|
return
|
|
}
|
|
|
|
await db.insert(settings).values({
|
|
key,
|
|
value,
|
|
createdAt: now,
|
|
updatedAt: now,
|
|
})
|
|
}
|