139 lines
3.5 KiB
TypeScript
139 lines
3.5 KiB
TypeScript
import { prisma } from "./prisma";
|
|
export const MAINTENANCE_MODE_KEY = "maintenance_mode";
|
|
export {
|
|
SITE_NAME_KEY,
|
|
SITE_SETTINGS_DEFAULT_OG_IMAGE_FIELD_KEY,
|
|
SITE_SETTINGS_ENTITY_ID,
|
|
SITE_SETTINGS_ENTITY_TYPE,
|
|
SITE_SETTINGS_FAVICON_FIELD_KEY,
|
|
SITE_SETTINGS_KEY,
|
|
DEFAULT_SITE_NAME,
|
|
buildDefaultSiteSettings,
|
|
getDefaultSiteSettingsMediaBindings,
|
|
parseSiteSettingsValue,
|
|
type SiteSettings,
|
|
type SiteSettingsMediaBindings,
|
|
} from "./site-settings";
|
|
import {
|
|
DEFAULT_SITE_NAME,
|
|
SITE_NAME_KEY,
|
|
SITE_SETTINGS_DEFAULT_OG_IMAGE_FIELD_KEY,
|
|
SITE_SETTINGS_ENTITY_ID,
|
|
SITE_SETTINGS_ENTITY_TYPE,
|
|
SITE_SETTINGS_FAVICON_FIELD_KEY,
|
|
SITE_SETTINGS_KEY,
|
|
buildDefaultSiteSettings,
|
|
getDefaultSiteSettingsMediaBindings,
|
|
parseSiteSettingsValue,
|
|
type SiteSettings,
|
|
type SiteSettingsMediaBindings,
|
|
} from "./site-settings";
|
|
|
|
export async function getMaintenanceMode(): Promise<boolean> {
|
|
try {
|
|
const config = await prisma.appConfig.findUnique({
|
|
where: { key: MAINTENANCE_MODE_KEY },
|
|
select: { value: true },
|
|
});
|
|
|
|
return config?.value === "true";
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export async function setMaintenanceMode(enabled: boolean): Promise<void> {
|
|
await prisma.appConfig.upsert({
|
|
where: { key: MAINTENANCE_MODE_KEY },
|
|
update: {
|
|
value: enabled ? "true" : "false",
|
|
},
|
|
create: {
|
|
key: MAINTENANCE_MODE_KEY,
|
|
value: enabled ? "true" : "false",
|
|
},
|
|
});
|
|
}
|
|
|
|
export async function getSiteSettings(): Promise<SiteSettings> {
|
|
try {
|
|
const configs = await prisma.appConfig.findMany({
|
|
where: {
|
|
key: {
|
|
in: [SITE_SETTINGS_KEY, SITE_NAME_KEY],
|
|
},
|
|
},
|
|
select: {
|
|
key: true,
|
|
value: true,
|
|
},
|
|
});
|
|
|
|
const configMap = new Map(configs.map((config) => [config.key, config.value]));
|
|
const fallbackName = configMap.get(SITE_NAME_KEY) ?? DEFAULT_SITE_NAME;
|
|
|
|
return parseSiteSettingsValue(configMap.get(SITE_SETTINGS_KEY), fallbackName);
|
|
} catch {
|
|
return buildDefaultSiteSettings();
|
|
}
|
|
}
|
|
|
|
export async function updateSiteSettings(settings: SiteSettings): Promise<void> {
|
|
await prisma.appConfig.upsert({
|
|
where: { key: SITE_SETTINGS_KEY },
|
|
update: {
|
|
value: JSON.stringify(settings),
|
|
},
|
|
create: {
|
|
key: SITE_SETTINGS_KEY,
|
|
value: JSON.stringify(settings),
|
|
},
|
|
});
|
|
}
|
|
|
|
export async function getSiteSettingsMediaBindings(): Promise<SiteSettingsMediaBindings> {
|
|
try {
|
|
const usages = await prisma.mediaUsage.findMany({
|
|
where: {
|
|
entityType: SITE_SETTINGS_ENTITY_TYPE,
|
|
entityId: SITE_SETTINGS_ENTITY_ID,
|
|
},
|
|
select: {
|
|
fieldKey: true,
|
|
updatedAt: true,
|
|
asset: {
|
|
select: {
|
|
id: true,
|
|
url: true,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
return usages.reduce<SiteSettingsMediaBindings>(
|
|
(result, usage) => {
|
|
if (usage.fieldKey === SITE_SETTINGS_FAVICON_FIELD_KEY) {
|
|
result.favicon = {
|
|
assetId: usage.asset.id,
|
|
url: usage.asset.url,
|
|
version: usage.updatedAt.toISOString(),
|
|
};
|
|
}
|
|
|
|
if (usage.fieldKey === SITE_SETTINGS_DEFAULT_OG_IMAGE_FIELD_KEY) {
|
|
result.defaultOgImage = {
|
|
assetId: usage.asset.id,
|
|
url: usage.asset.url,
|
|
version: usage.updatedAt.toISOString(),
|
|
};
|
|
}
|
|
|
|
return result;
|
|
},
|
|
getDefaultSiteSettingsMediaBindings(),
|
|
);
|
|
} catch {
|
|
return getDefaultSiteSettingsMediaBindings();
|
|
}
|
|
}
|