import { Hono } from 'hono' import { cors } from 'hono/cors' import type { Context as HonoContext } from 'hono' import { Auth } from '@d8d-appcontainer/auth' import type { User as AuthUser } from '@d8d-appcontainer/auth' import { APIClient } from '@d8d-appcontainer/api' import type { SystemSettingRecord } from '../client/share/types.ts' import debug from "debug" const log = { auth: debug('auth:server') } // 定义自定义上下文类型 export interface Variables { auth: Auth user?: AuthUser apiClient: APIClient moduleDir: string systemSettings?: SystemSettingRecord } // 认证中间件 export const withAuth = async (c: HonoContext<{ Variables: Variables }>, next: () => Promise) => { try { const auth = c.get('auth') const token = c.req.header('Authorization')?.replace('Bearer ', '') if (token) { const userData = await auth.verifyToken(token) if (userData) { c.set('user', userData) await next() return } } return c.json({ error: '未授权' }, 401) } catch (error) { log.auth('认证失败:', error) return c.json({ error: '无效凭证' }, 401) } } // 导出withAuth类型定义 export type WithAuth = typeof withAuth; // 环境变量设置中间件 export const setEnvVariables = (apiClient: APIClient, moduleDir: string, auth: Auth) => { return async (c: HonoContext<{ Variables: Variables }>, next: () => Promise) => { c.set('apiClient', apiClient) c.set('moduleDir', moduleDir) c.set('auth', auth) c.set('systemSettings', await initSystemSettings(apiClient)) await next() } } // CORS中间件 export const corsMiddleware = cors() // 初始化系统设置 const initSystemSettings = async (apiClient: APIClient) => { try { const systemSettings = await apiClient.database.table('system_settings') .select() // 将系统设置转换为键值对形式 const settings = systemSettings.reduce((acc: Record, setting: any) => { acc[setting.key] = setting.value return acc }, {}) as SystemSettingRecord return settings } catch (error) { log.auth('获取系统设置失败:', error) return {} as SystemSettingRecord } }