+12








fcd7c979df
Co-authored-by: Artur <145776561+arturict@users.noreply.github.com> Co-authored-by: arturict <arturict@users.noreply.github.com> Co-authored-by: Thomas <thomas@ajnart.fr> Co-authored-by: Afonso Jorge Ramos <afonsojorgeramos@gmail.com> Co-authored-by: Danura30082 <danura30082+github@gmail.com> Co-authored-by: Kushie <122986913+kushiemoon-dev@users.noreply.github.com> Co-authored-by: ajnart <thomas@ajnart.fr> Co-authored-by: ajnart <thomas@ajnart.dev> Co-authored-by: chenjun <chenjun@foxmail.com> Co-authored-by: Wikibear <wikibear@users.noreply.github.com> Co-authored-by: Bergasha <bergasha@gmail.com> Co-authored-by: leafyelin <43306196+leafyelin@users.noreply.github.com> Co-authored-by: Lucas Araujo <lucas.lra@gmail.com> Co-authored-by: GreenMonito <86085570+GreenMonito@users.noreply.github.com> Co-authored-by: Nerdy-Technician <roffo@nerdy-technician.social> Co-authored-by: Jun <34545896+jcstrong@users.noreply.github.com> Co-authored-by: Edmond Abraham <54119952+gitedmond@users.noreply.github.com> Co-authored-by: thrawnx <tight.bulb9384@fastmail.com> Co-authored-by: Chris <58918656+nordada@users.noreply.github.com> Co-authored-by: yi111 <153097222+Yi-111-a@users.noreply.github.com> Co-authored-by: Yanis <naamaneyanis@gmail.com> Co-authored-by: Wikibear <me@sej.de> Co-authored-by: alessiottavo <93441886+alessiottavo@users.noreply.github.com>
102 lines
3.2 KiB
TypeScript
102 lines
3.2 KiB
TypeScript
import { parse, stringify } from "superjson";
|
|
|
|
import type { ServerSettings } from "@homarr/server-settings";
|
|
import { defaultServerSettings, defaultServerSettingsKeys, parseBrandingSettings } from "@homarr/server-settings";
|
|
|
|
import type { Database } from "..";
|
|
import { and, eq } from "..";
|
|
import { serverSettings } from "../schema";
|
|
|
|
export const getServerSettingsAsync = async (db: Database) => {
|
|
const settings = await db.query.serverSettings.findMany();
|
|
|
|
return defaultServerSettingsKeys.reduce((acc, settingKey) => {
|
|
const setting = settings.find((setting) => setting.settingKey === settingKey);
|
|
if (!setting) {
|
|
// Typescript is not happy because the key is a union and it does not know that they are the same
|
|
acc[settingKey] = defaultServerSettings[settingKey] as never;
|
|
return acc;
|
|
}
|
|
|
|
const parsedSetting = parse<Record<string, unknown>>(setting.value);
|
|
if (settingKey === "branding") {
|
|
acc[settingKey] = parseBrandingSettings(parsedSetting) as never;
|
|
return acc;
|
|
}
|
|
acc[settingKey] = {
|
|
...defaultServerSettings[settingKey],
|
|
...parsedSetting,
|
|
} as never;
|
|
return acc;
|
|
}, {} as ServerSettings);
|
|
};
|
|
|
|
export const getServerSettingByKeyAsync = async <TKey extends keyof ServerSettings>(db: Database, key: TKey) => {
|
|
const dbSettings = await db.query.serverSettings.findFirst({
|
|
where: eq(serverSettings.settingKey, key),
|
|
});
|
|
|
|
if (!dbSettings) {
|
|
return defaultServerSettings[key];
|
|
}
|
|
|
|
const parsedSetting = parse<ServerSettings[TKey]>(dbSettings.value);
|
|
if (key === "branding") {
|
|
return parseBrandingSettings(parsedSetting) as ServerSettings[TKey];
|
|
}
|
|
return {
|
|
...defaultServerSettings[key],
|
|
...parsedSetting,
|
|
} as ServerSettings[TKey];
|
|
};
|
|
|
|
export const updateServerSettingByKeyAsync = async <TKey extends keyof ServerSettings>(
|
|
db: Database,
|
|
key: TKey,
|
|
value: ServerSettings[TKey],
|
|
) => {
|
|
await db
|
|
.update(serverSettings)
|
|
.set({
|
|
value: stringify(value),
|
|
})
|
|
.where(eq(serverSettings.settingKey, key));
|
|
};
|
|
|
|
export const updateAnalyticsServerSettingAsync = async (
|
|
db: Database,
|
|
update: (current: ServerSettings["analytics"]) => ServerSettings["analytics"],
|
|
) => {
|
|
for (let attempt = 0; attempt < 5; attempt++) {
|
|
const row = await db.query.serverSettings.findFirst({
|
|
where: eq(serverSettings.settingKey, "analytics"),
|
|
});
|
|
if (!row) throw new Error("Analytics server settings are missing");
|
|
|
|
const current = {
|
|
...defaultServerSettings.analytics,
|
|
...parse<ServerSettings["analytics"]>(row.value),
|
|
};
|
|
const next = update(current);
|
|
const updated = await db
|
|
.update(serverSettings)
|
|
.set({ value: stringify(next) })
|
|
.where(and(eq(serverSettings.settingKey, "analytics"), eq(serverSettings.value, row.value)))
|
|
.returning({ settingKey: serverSettings.settingKey });
|
|
if (updated.length > 0) return next;
|
|
}
|
|
|
|
throw new Error("Analytics server settings changed too often to update");
|
|
};
|
|
|
|
export const insertServerSettingByKeyAsync = async <TKey extends keyof ServerSettings>(
|
|
db: Database,
|
|
key: TKey,
|
|
value: ServerSettings[TKey],
|
|
) => {
|
|
await db.insert(serverSettings).values({
|
|
settingKey: key,
|
|
value: stringify(value),
|
|
});
|
|
};
|