You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
2.6 KiB

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<Key extends keyof Settings> extends Model<Setting<Key>> {
protected static table = 'p5x_settings'
protected static key = 'id'
public static load<Key extends keyof Settings>(key: Key): Promise<Collection<Settings[Key]>> {
return Setting.query<Setting<Key>>()
.where('setting_key', '=', key)
.get()
.map(x => x.value)
}
public static async loadRequired<Key extends keyof Settings>(key: Key): Promise<Collection<Settings[Key]>> {
const load = await this.load(key)
if ( load.isEmpty() ) {
throw new MissingRequiredSettingError(key)
}
return load
}
public static loadOneRequired<Key extends keyof Settings>(key: Key): Promise<Settings[Key]> {
return this.loadRequired(key).then(x => x.first()!)
}
public static async set<Key extends keyof Settings>(key: Key, value: Settings[Key]): Promise<void> {
// Delete any existing records w/ this key
await Setting.query().where('settingKey', '=', key).delete()
// Insert a new one
const setting = Application.getContainer().makeNew<Setting<Key>>(Setting);
setting.settingKey = key
setting.value = value
await setting.save()
}
public static async add<Key extends keyof Settings>(key: Key, value: Settings[Key]): Promise<void> {
// 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<Key>;
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
}
}