feat: add hub

This commit is contained in:
huaqo
2026-10-03 23:57:41 +02:00
parent 5452f72087
commit fb7b560696
52 changed files with 290 additions and 162 deletions
+1 -1
View File
@@ -11,7 +11,7 @@ export default defineEventHandler(async (event) => {
if (!(await passwordMatches(event, password))) {
await new Promise(resolve => setTimeout(resolve, FAILED_LOGIN_DELAY_MS))
throw createError({ statusCode: 401, statusMessage: 'Wrong password' })
throw createError({ statusCode: 401, statusMessage: 'Falsches Passwort' })
}
const session = await authSession(event)
+1 -1
View File
@@ -6,6 +6,6 @@ export default defineEventHandler(async (event) => {
const session = await authSession(event)
if (!session.data.unlocked) {
throw createError({ statusCode: 401, statusMessage: 'Locked' })
throw createError({ statusCode: 401, statusMessage: 'Gesperrt' })
}
})
+2 -2
View File
@@ -10,7 +10,7 @@ const SESSION_MAX_AGE_S = 60 * 60 * 24 * 30
export function authSession(event: H3Event) {
const { sessionSecret } = useRuntimeConfig(event)
if (!sessionSecret || sessionSecret.length < 32) {
throw createError({ statusCode: 500, statusMessage: 'NUXT_SESSION_SECRET must be set (at least 32 characters)' })
throw createError({ statusCode: 500, statusMessage: 'NUXT_SESSION_SECRET muss gesetzt sein (mindestens 32 Zeichen)' })
}
return useSession<AuthSession>(event, {
// Kept from when only the diary had a login, so existing logins stay valid
@@ -28,7 +28,7 @@ async function sha256(text: string): Promise<Uint8Array> {
export async function passwordMatches(event: H3Event, guess: string): Promise<boolean> {
const { diaryPassword } = useRuntimeConfig(event)
if (!diaryPassword) {
throw createError({ statusCode: 500, statusMessage: 'NUXT_DIARY_PASSWORD is not set' })
throw createError({ statusCode: 500, statusMessage: 'NUXT_DIARY_PASSWORD ist nicht gesetzt' })
}
const [a, b] = await Promise.all([sha256(guess), sha256(diaryPassword)])
+2 -2
View File
@@ -17,7 +17,7 @@ async function request<T>(
): Promise<T> {
const { baserowUrl, baserowToken } = useRuntimeConfig(event)
if (!baserowUrl || !baserowToken) {
throw createError({ statusCode: 500, statusMessage: 'NUXT_BASEROW_URL and NUXT_BASEROW_TOKEN must be set' })
throw createError({ statusCode: 500, statusMessage: 'NUXT_BASEROW_URL und NUXT_BASEROW_TOKEN müssen gesetzt sein' })
}
try {
@@ -33,7 +33,7 @@ async function request<T>(
const detail = error?.data?.detail
throw createError({
statusCode: error?.statusCode ?? 502,
statusMessage: typeof detail === 'string' ? detail : 'Baserow request failed'
statusMessage: typeof detail === 'string' ? detail : 'Baserow-Anfrage fehlgeschlagen'
})
}
}
+1 -1
View File
@@ -4,7 +4,7 @@ import type { z } from 'zod'
export async function readValidBody<Schema extends z.ZodType>(event: H3Event, schema: Schema): Promise<z.output<Schema>> {
const result = schema.safeParse(await readBody(event))
if (!result.success) {
throw createError({ statusCode: 400, statusMessage: result.error.issues[0]?.message ?? 'Invalid request' })
throw createError({ statusCode: 400, statusMessage: result.error.issues[0]?.message ?? 'Ungültige Anfrage' })
}
return result.data
}