Skip to content

Commit cf53bd8

Browse files
committed
refactor: getting config from server
1 parent 5e365a4 commit cf53bd8

File tree

9 files changed

+58
-55
lines changed

9 files changed

+58
-55
lines changed

app.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
</template>
66

77
<script setup lang="ts">
8-
const siteConfig = useSiteConfig()
8+
const { $settings } = useNuxtApp()
99
const colorMode = useColorMode()
1010
const { locale } = useI18n()
1111
12-
colorMode.preference = siteConfig.theme || 'system'
13-
locale.value = siteConfig.lang
12+
colorMode.preference = $settings.theme || 'system'
13+
locale.value = $settings.lang
1414
1515
useHead({
16-
title: siteConfig.title,
16+
title: $settings.title,
1717
})
1818
</script>

pages/index.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
2-
<template v-if="siteConfig.services.length">
2+
<template v-if="$services.length">
33
<Group
4-
v-for="(group, key) in siteConfig.services"
4+
v-for="(group, key) in $services"
55
:key="key"
66
v-bind="group"
77
/>
@@ -19,5 +19,5 @@
1919
</template>
2020

2121
<script setup lang="ts">
22-
const siteConfig = useSiteConfig()
22+
const { $services } = useNuxtApp()
2323
</script>

plugins/settings.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import type { CompleteConfig } from '~/types'
2+
3+
export default defineNuxtPlugin(async () => {
4+
const asyncData = await useFetch<CompleteConfig>('/api/settings')
5+
const { services, ...settings } = asyncData.data.value!
6+
7+
return {
8+
provide: { services, settings },
9+
}
10+
})

server/api/settings.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import type { CompleteConfig } from '~/types'
2+
3+
export default defineEventHandler(async () => {
4+
const storage = useStorage('main')
5+
6+
return await storage.getItem<CompleteConfig>('config')
7+
})

server/plugins/0.update-checker.ts

Lines changed: 0 additions & 25 deletions
This file was deleted.

server/plugins/1.config-loader.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
1-
export default defineNitroPlugin(async (nitroApp) => {
2-
const localConfig = await getLocalConfig()
1+
export default defineNitroPlugin(async () => {
2+
const localConfig = await loadLocalConfig()
33

44
if (!localConfig) {
5-
console.error('Config not loaded!')
5+
logger.error('Config not loaded!')
66
return
77
}
88

9-
// Provide full config to backend
10-
const storage = useStorage()
9+
const storage = useStorage('main')
10+
await storage.setItem('config', localConfig)
1111
await storage.setItem('services', extractServicesFromConfig(localConfig))
12-
13-
// Provide safely config to frontend
14-
nitroApp.hooks.hook('site-config:init', ({ siteConfig }) => {
15-
siteConfig.push(extractSafelyConfig(localConfig))
16-
})
1712
})

server/utils/config.ts

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import crypto from 'node:crypto'
22
import yaml from 'yaml'
3-
import type { BaseService, Config } from '~/types'
3+
import defu from 'defu'
4+
import type { BaseService, CompleteConfig } from '~/types'
45

56
type draftService = Omit<BaseService, 'id'>
67

@@ -11,18 +12,27 @@ function determineServiceId(items: draftService[]): BaseService[] {
1112
}))
1213
}
1314

14-
export async function getLocalConfig(): Promise<Config | null> {
15+
export function getDefaultConfig(): CompleteConfig {
16+
return {
17+
title: 'Mafl',
18+
lang: 'en',
19+
theme: 'system',
20+
services: [],
21+
}
22+
}
23+
24+
export async function loadLocalConfig(): Promise<CompleteConfig> {
1525
const storage = useStorage('data')
1626
const file = 'config.yml'
1727

1828
try {
1929
if (!await storage.hasItem(file)) {
20-
return null
30+
return getDefaultConfig()
2131
}
2232

2333
const raw = await storage.getItem<string>(file)
2434
const config = yaml.parse(raw || '') || {}
25-
const services: Config['services'] = []
35+
const services: CompleteConfig['services'] = []
2636

2737
if (Array.isArray(config.services)) {
2838
services.push({
@@ -39,22 +49,26 @@ export async function getLocalConfig(): Promise<Config | null> {
3949
}
4050
}
4151

42-
return {
43-
...config,
44-
services,
45-
}
52+
return defu({ ...config, services }, getDefaultConfig())
4653
} catch (e) {
4754
// ...
4855
}
4956

50-
return null
57+
return getDefaultConfig()
58+
}
59+
60+
export async function getLocalConfig(): Promise<CompleteConfig | null> {
61+
const storage = useStorage('main')
62+
await storage.getKeys()
63+
64+
return storage.getItem<CompleteConfig>('config')
5165
}
5266

5367
/**
5468
* Safely retrieves a list of services for frontend.
5569
* Omit "secrets" fields.
5670
*/
57-
export function extractSafelyConfig(config: Config) {
71+
export function extractSafelyConfig(config: CompleteConfig) {
5872
return JSON.parse(JSON.stringify(
5973
config, (key, val) => key === 'secrets' ? undefined : val,
6074
))
@@ -63,7 +77,7 @@ export function extractSafelyConfig(config: Config) {
6377
/**
6478
* Create Map services
6579
*/
66-
export function extractServicesFromConfig(config: Config): Record<string, BaseService> {
80+
export function extractServicesFromConfig(config: CompleteConfig): Record<string, BaseService> {
6781
return config.services.reduce<Record<string, BaseService>>((acc, group) => {
6882
for (const item of group.items) {
6983
acc[item.id] = item

server/utils/services.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export async function getService<T>(event: H3Event): Promise<T> {
1010
})
1111
}
1212

13-
const storage = useStorage()
13+
const storage = useStorage('main')
1414
const services = await storage.getItem<Record<string, T>>('services')
1515

1616
if (!services || !Object.hasOwn(services, id)) {

types/config.d.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ export interface ServicesGroup {
77

88
export interface Config {
99
title?: string
10-
lang: 'en' | 'ru',
10+
lang: 'en' | 'ru'
1111
theme?: 'system' | 'light' | 'dark' | 'deep'
1212
services: ServicesGroup[]
1313
}
14+
15+
export type CompleteConfig = Required<Config>

0 commit comments

Comments
 (0)