post.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
  2. import { z } from '@hono/zod-openapi';
  3. import { AppDataSource } from '@/server/data-source';
  4. import { ContactService } from '@/server/modules/contacts/contact.service';
  5. import { ContactSchema } from '@/server/modules/contacts/contact.entity';
  6. import { ErrorSchema } from '@/server/utils/errorHandler';
  7. import { authMiddleware } from '@/server/middleware/auth';
  8. import { logger } from '@/server/utils/logger';
  9. import { AuthContext } from '@/server/types/context';
  10. // Initialize service
  11. const contactService = new ContactService(AppDataSource);
  12. // Create request schema (omit auto-generated fields)
  13. const CreateContactSchema = ContactSchema.omit({
  14. id: true,
  15. createdAt: true,
  16. updatedAt: true,
  17. isDeleted: true
  18. });
  19. // Success response schema
  20. const SuccessResponseSchema = z.object({
  21. code: z.number().openapi({ example: 200 }),
  22. message: z.string().openapi({ example: '联系人创建成功' }),
  23. data: ContactSchema
  24. });
  25. // Route definition
  26. const routeDef = createRoute({
  27. method: 'post',
  28. path: '/',
  29. middleware: [authMiddleware],
  30. request: {
  31. body: {
  32. content: {
  33. 'application/json': { schema: CreateContactSchema }
  34. }
  35. }
  36. },
  37. responses: {
  38. 200: {
  39. description: '联系人创建成功',
  40. content: {
  41. 'application/json': { schema: SuccessResponseSchema }
  42. }
  43. },
  44. 400: {
  45. description: '客户端错误',
  46. content: { 'application/json': { schema: ErrorSchema } }
  47. },
  48. 401: {
  49. description: '未授权访问',
  50. content: { 'application/json': { schema: ErrorSchema } }
  51. },
  52. 500: {
  53. description: '服务器错误',
  54. content: { 'application/json': { schema: ErrorSchema } }
  55. }
  56. }
  57. });
  58. // Create route instance
  59. const postRoute = new OpenAPIHono<AuthContext>().openapi(routeDef, async (c) => {
  60. try {
  61. const contactData = c.req.valid('json');
  62. const user = c.get('user');
  63. if (!user) {
  64. return c.json({
  65. code: 401,
  66. message: '未授权访问'
  67. }, 401);
  68. }
  69. logger.api(`用户 ${user.id} 创建联系人: %o`, contactData);
  70. const newContact = await contactService.create(contactData);
  71. return c.json({
  72. code: 200,
  73. message: '联系人创建成功',
  74. data: newContact
  75. }, 200);
  76. } catch (err) {
  77. const error = err as Error;
  78. logger.error('创建联系人失败:', error);
  79. // Handle validation errors
  80. if (error instanceof z.ZodError) {
  81. return c.json({
  82. code: 400,
  83. message: '参数验证失败: ' + error.errors.map(e => e.message).join(', ')
  84. }, 400);
  85. }
  86. return c.json({
  87. code: 500,
  88. message: error.message || '创建联系人失败'
  89. }, 500);
  90. }
  91. });
  92. export default postRoute;