diff options
author | Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> | 2021-09-25 23:24:16 +0200 |
---|---|---|
committer | Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> | 2021-09-25 23:24:16 +0200 |
commit | e0b526e7de810fd0fcfde45d22bb7edc72fe71ce (patch) | |
tree | aa07838c6b527e13909a42e38f51ebce19c323f2 | |
parent | :bug: fix #392 (diff) | |
download | server-e0b526e7de810fd0fcfde45d22bb7edc72fe71ce.tar.xz |
:sparkles: key value config
-rw-r--r-- | util/src/entities/Config.ts | 29 | ||||
-rw-r--r-- | util/src/util/Config.ts | 58 | ||||
-rw-r--r-- | util/src/util/Database.ts | 2 |
3 files changed, 70 insertions, 19 deletions
diff --git a/util/src/entities/Config.ts b/util/src/entities/Config.ts index a460b437..6d9db470 100644 --- a/util/src/entities/Config.ts +++ b/util/src/entities/Config.ts @@ -1,12 +1,15 @@ -import { Column, Entity, JoinColumn, ManyToOne } from "typeorm"; -import { BaseClass } from "./BaseClass"; +import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm"; +import { BaseClass, BaseClassWithoutId } from "./BaseClass"; import crypto from "crypto"; import { Snowflake } from "../util/Snowflake"; @Entity("config") -export class ConfigEntity extends BaseClass { - @Column({ type: "simple-json" }) - value: ConfigValue; +export class ConfigEntity extends BaseClassWithoutId { + @PrimaryColumn() + key: string; + + @Column({ type: "simple-json", nullable: true }) + value: number | boolean | null | string | undefined; } export interface RateLimitOptions { @@ -37,14 +40,16 @@ export interface KafkaBroker { export interface ConfigValue { gateway: { endpointClient: string | null; - endpoint: string | null; + endpointPrivate: string | null; + endpointPublic: string | null; }; cdn: { endpointClient: string | null; - endpoint: string | null; + endpointPublic: string | null; + endpointPrivate: string | null; }; general: { - instance_id: string; + instanceId: string; }; permissions: { user: { @@ -149,14 +154,16 @@ export interface ConfigValue { export const DefaultConfigOptions: ConfigValue = { gateway: { endpointClient: null, - endpoint: null, + endpointPrivate: null, + endpointPublic: null, }, cdn: { endpointClient: null, - endpoint: null, + endpointPrivate: null, + endpointPublic: null, }, general: { - instance_id: Snowflake.generate(), + instanceId: Snowflake.generate(), }, permissions: { user: { diff --git a/util/src/util/Config.ts b/util/src/util/Config.ts index c87d598e..6a9e0e5a 100644 --- a/util/src/util/Config.ts +++ b/util/src/util/Config.ts @@ -1,22 +1,66 @@ import "missing-native-js-functions"; import { ConfigValue, ConfigEntity, DefaultConfigOptions } from "../entities/Config"; -var config: ConfigEntity; +var config: ConfigValue; +var pairs: ConfigEntity[]; + // TODO: use events to inform about config updates +// Config keys are separated with _ export const Config = { init: async function init() { if (config) return config; - config = (await ConfigEntity.findOne({ id: "0" })) || new ConfigEntity({ id: "0" }); + pairs = await ConfigEntity.find(); + config = pairsToConfig(pairs); - return this.set((config.value || {}).merge(DefaultConfigOptions)); + return this.set((config || {}).merge(DefaultConfigOptions)); }, get: function get() { - return config.value as ConfigValue; + return config; }, set: function set(val: Partial<ConfigValue>) { - if (!config) return; - config.value = val.merge(config?.value || {}); - return config.save(); + if (!config || !val) return; + config = val.merge(config); + console.log(config); + + return applyConfig(config); }, }; + +function applyConfig(val: ConfigValue) { + async function apply(obj: any, key = ""): Promise<any> { + if (typeof obj === "object" && obj !== null) + return Promise.all(Object.keys(obj).map((k) => apply(obj[k], key ? `${key}_${k}` : k))); + + let pair = pairs.find((x) => x.key === key); + if (!pair) pair = new ConfigEntity(); + + pair.key = key; + pair.value = obj; + return pair.save(); + } + + return apply(val); +} + +function pairsToConfig(pairs: ConfigEntity[]) { + var value: any = {}; + + pairs.forEach((p) => { + const keys = p.key.split("_"); + let prev = ""; + let obj = value; + let i = 0; + + for (const key of keys) { + if (Number(key) && !obj[prev]) obj = obj[prev] = []; + if (i++ === keys.length - 1) obj[key] = p.value; + else if (!obj[key]) obj[key] = {}; + + prev = key; + obj = obj[key]; + } + }); + + return value as ConfigValue; +} diff --git a/util/src/util/Database.ts b/util/src/util/Database.ts index 0c3d7cef..ab7c70c5 100644 --- a/util/src/util/Database.ts +++ b/util/src/util/Database.ts @@ -22,7 +22,7 @@ export function initDatabase() { // entities: Object.values(Models).filter((x) => x.constructor.name !== "Object"), synchronize: true, - logging: true, + logging: false, cache: { duration: 1000 * 3, // cache all find queries for 3 seconds }, |