mirror of
https://gitlab.com/soapbox-pub/ditto.git
synced 2025-12-06 11:29:46 +00:00
67 lines
1.9 KiB
TypeScript
67 lines
1.9 KiB
TypeScript
import type { ElixirTuple, ElixirValue, PleromaConfig } from '@/schemas/pleroma-api.ts';
|
|
|
|
export class PleromaConfigDB {
|
|
constructor(private configs: PleromaConfig[]) {}
|
|
|
|
get(group: string, key: string): PleromaConfig | undefined {
|
|
return this.configs.find((c) => c.group === group && c.key === key);
|
|
}
|
|
|
|
getIn(group: string, key: string, ...paths: string[]): ElixirValue | undefined {
|
|
const config = this.get(group, key);
|
|
if (!config) return undefined;
|
|
|
|
let value = config.value;
|
|
|
|
for (const path of paths) {
|
|
if (Array.isArray(value)) {
|
|
const tuple = value.find((item): item is ElixirTuple => {
|
|
return PleromaConfigDB.isTuple(item) && item.tuple[0] === path;
|
|
});
|
|
if (tuple) {
|
|
value = tuple.tuple[1];
|
|
} else {
|
|
return;
|
|
}
|
|
} else if (PleromaConfigDB.isTuple(value) && value.tuple[0] === path) {
|
|
value = value.tuple[1];
|
|
} else if (!PleromaConfigDB.isTuple(value) && value && typeof value === 'object' && path in value) {
|
|
value = value[path];
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
set(group: string, key: string, value: PleromaConfig): void {
|
|
const index = this.configs.findIndex((c) => c.group === group && c.key === key);
|
|
if (index === -1) {
|
|
this.configs.push(value);
|
|
} else {
|
|
this.configs[index] = value;
|
|
}
|
|
}
|
|
|
|
merge(configs: PleromaConfig[]): void {
|
|
for (const { group, key, value } of configs) {
|
|
this.set(group, key, { group, key, value });
|
|
}
|
|
}
|
|
|
|
toJSON(): PleromaConfig[] {
|
|
return this.configs;
|
|
}
|
|
|
|
private static isTuple(value: ElixirValue): value is ElixirTuple {
|
|
return Boolean(
|
|
value &&
|
|
typeof value === 'object' &&
|
|
'tuple' in value &&
|
|
Array.isArray(value.tuple) &&
|
|
value.tuple.length === 2 &&
|
|
typeof value.tuple[0] === 'string',
|
|
);
|
|
}
|
|
}
|