import { createRoute, OpenAPIHono } from '@hono/zod-openapi' import { AuthService } from '../../../modules/auth/auth.service' import { UserService } from '../../../modules/users/user.service' import { z } from '@hono/zod-openapi' import { ErrorSchema } from '../../../utils/errorHandler' import { AppDataSource } from '../../../data-source' import { AuthContext } from '../../../types/context' import { UserSchema } from '@/server/modules/users/user.schema' const userService = new UserService(AppDataSource) const authService = new AuthService(userService) const LoginSchema = z.object({ username: z.string().min(3).openapi({ example: 'admin', description: '用户名' }), password: z.string().min(6).openapi({ example: 'admin123', description: '密码' }) }) const UserResponseSchema = UserSchema const TokenResponseSchema = z.object({ token: z.string().openapi({ example: 'jwt.token.here', description: 'JWT Token' }), user: UserResponseSchema }) const loginRoute = createRoute({ method: 'post', path: '/login', request: { body: { content: { 'application/json': { schema: LoginSchema } } } }, responses: { 200: { description: '登录成功', content: { 'application/json': { schema: TokenResponseSchema } } }, 401: { description: '用户名或密码错误', content: { 'application/json': { schema: ErrorSchema } } }, 500: { description: '服务器内部错误', content: { 'application/json': { schema: ErrorSchema } } } } }) const app = new OpenAPIHono().openapi(loginRoute, async (c) => { try { const { username, password } = c.req.valid('json') const result = await authService.login(username, password) return c.json(result, 200) } catch (error) { // 认证相关错误返回401 if (error instanceof Error && (error.message.includes('User not found') || error.message.includes('Invalid password'))) { return c.json( { code: 401, message: '用户名或密码错误' }, 401 ) } // 其他错误重新抛出,由错误处理中间件处理 throw error } }); export default app