From 644f6900f2f05d6a92f0c418224ef047d77dfc12 Mon Sep 17 00:00:00 2001 From: hywax Date: Fri, 29 Dec 2023 01:00:26 +0500 Subject: [PATCH] chore(skeleton): obtaining and customizing application config --- server/utils/config.ts | 56 ++++++++++++++++++++++++++++++++++++++++ server/utils/services.ts | 24 +++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 server/utils/config.ts create mode 100644 server/utils/services.ts diff --git a/server/utils/config.ts b/server/utils/config.ts new file mode 100644 index 0000000..53833ce --- /dev/null +++ b/server/utils/config.ts @@ -0,0 +1,56 @@ +import fs from 'node:fs' +import crypto from 'node:crypto' +import yaml from 'yaml' +import type { BaseService, Config } from '~/types' + +export function getLocalConfig(): Config | null { + try { + if (!fs.existsSync('assets/config.yaml')) { + return null + } + + const config = yaml.parse(fs.readFileSync('assets/config.yaml', 'utf8')) || {} + const services = Object + .entries[]>((config.services || [])) + .reduce((acc, [title, items]) => { + acc.push({ + title, + items: items.map((item) => ({ ...item, id: crypto.randomUUID() })), + }) + + return acc + }, []) + + return { + ...config, + services, + } + } catch (e) { + // ... + } + + return null +} + +/** + * Safely retrieves a list of services for frontend. + * Omit "secrets" fields. + */ +export function extractSafelyConfig(config: Config) { + return JSON.parse(JSON.stringify( + config, (key, val) => key === 'secrets' ? undefined : val, + )) +} + +/** + * Create Map services + */ +export function extractServicesFromConfig(config: Config): Record { + return config.services.reduce>((acc, group) => { + for (const item of group.items) { + acc[item.id] = item + } + + return acc + }, {}) +} diff --git a/server/utils/services.ts b/server/utils/services.ts new file mode 100644 index 0000000..8c278ca --- /dev/null +++ b/server/utils/services.ts @@ -0,0 +1,24 @@ +import type { H3Event } from 'h3' + +export async function getService(event: H3Event): Promise { + const { id } = getQuery<{ id?: string }>(event) + + if (!id) { + throw createError({ + statusCode: 400, + statusMessage: 'ID can not be null', + }) + } + + const storage = useStorage() + const services = await storage.getItem>('services') + + if (!services || !Object.hasOwn(services, id)) { + throw createError({ + statusCode: 404, + statusMessage: `Service with ID "${id}" does not exist`, + }) + } + + return services[id] +}