import {Injectable, Model, Field, FieldType, Collection, ErrorWithContext, make, Application} from '@extollo/lib' import { JSONString, Settings } from '../types'; export class MissingRequiredSettingError extends ErrorWithContext { constructor(key: string) { super(`Missing required setting: ${key}`, { key }) } } /** * Setting Model * ----------------------------------- * Helper for loading various one-off settings. */ @Injectable() export class Setting extends Model> { protected static table = 'p5x_settings' protected static key = 'id' public static load(key: Key): Promise> { return Setting.query>() .where('setting_key', '=', key) .get() .map(x => x.value) } public static async loadRequired(key: Key): Promise> { const load = await this.load(key) if ( load.isEmpty() ) { throw new MissingRequiredSettingError(key) } return load } public static loadOneRequired(key: Key): Promise { return this.loadRequired(key).then(x => x.first()!) } public static async set(key: Key, value: Settings[Key]): Promise { // Delete any existing records w/ this key await Setting.query().where('settingKey', '=', key).delete() // Insert a new one const setting = Application.getContainer().makeNew>(Setting); setting.settingKey = key setting.value = value await setting.save() } public static async add(key: Key, value: Settings[Key]): Promise { // Delete any existing records w/ this key and value await Setting.query() .where('settingKey', '=', key) .where('settingValue', '=', JSON.stringify(value)) .delete() // Insert a new one const setting = new Setting; setting.settingKey = key setting.value = value await setting.save() } @Field(FieldType.serial) protected id?: number @Field(FieldType.varchar, 'setting_key') protected settingKey!: Key @Field(FieldType.text, 'setting_json') protected settingJson!: JSONString public get value(): Settings[Key] { return JSON.parse(this.settingJson) } public set value(v: Settings[Key]) { this.settingJson = JSON.stringify(v) as JSONString } }