2
0
Просмотр исходного кода

✨ feat(chat): 支持聊天消息关联文件功能

- 数据库层面添加file_id字段和file关联关系
- API层面添加文件信息响应和文件ID输入
- 支持通过file_id关联图片等文件资源
yourname 6 месяцев назад
Родитель
Сommit
b6213a5bc3

+ 1 - 1
src/server/api/chat-messages/index.ts

@@ -17,7 +17,7 @@ const crudRoutes = createCrudRoutes({
   getSchema: ChatMessageSchema,
   listSchema: ChatMessageSchema,
   searchFields: ['content', 'senderName'],
-  relations: [],
+  relations: ['file'],
   middleware: [authMiddleware],
   userTracking: {
     createdByField: 'createdBy',

+ 18 - 1
src/server/modules/chat/chat-message.entity.ts

@@ -1,4 +1,5 @@
-import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn } from 'typeorm';
+import { File } from '@/server/modules/files/file.entity';
 
 @Entity('chat_messages')
 export class ChatMessage {
@@ -19,6 +20,22 @@ export class ChatMessage {
   @Column({ name: 'content', type: 'text', comment: '消息内容' })
   content!: string;
 
+  @Column({ 
+    name: 'file_id', 
+    type: 'int', 
+    unsigned: true, 
+    nullable: true, 
+    comment: '关联文件ID(用于图片消息)' 
+  })
+  fileId!: number | null;
+
+  @ManyToOne(() => File, { nullable: true })
+  @JoinColumn({ 
+    name: 'file_id', 
+    referencedColumnName: 'id' 
+  })
+  file!: File | null;
+
   @Column({ 
     name: 'sender_id', 
     type: 'varchar', 

+ 16 - 0
src/server/modules/chat/chat-message.schema.ts

@@ -1,4 +1,5 @@
 import { z } from '@hono/zod-openapi';
+import { FileSchema } from '@/server/modules/files/file.schema';
 
 // 基础消息Schema
 export const ChatMessageSchema = z.object({
@@ -30,6 +31,13 @@ export const ChatMessageSchema = z.object({
     example: 1704067200000,
     description: '消息时间戳'
   }),
+  fileId: z.number().int().positive().nullable().openapi({
+    example: 1,
+    description: '关联文件ID(用于图片消息)'
+  }),
+  file: FileSchema.nullable().optional().openapi({
+    description: '关联文件信息(用于图片消息)'
+  }),
   createdBy: z.number().int().positive().nullable().openapi({
     example: 1,
     description: '创建用户ID'
@@ -73,6 +81,10 @@ export const CreateChatMessageDto = z.object({
   timestamp: z.coerce.number().int().positive().openapi({
     example: 1704067200000,
     description: '消息时间戳(毫秒)'
+  }),
+  fileId: z.coerce.number().int().positive().nullable().optional().openapi({
+    example: 1,
+    description: '关联文件ID(用于图片消息)'
   })
 });
 
@@ -101,6 +113,10 @@ export const UpdateChatMessageDto = z.object({
   timestamp: z.coerce.number().int().positive().optional().openapi({
     example: 1704067200000,
     description: '消息时间戳'
+  }),
+  fileId: z.coerce.number().int().positive().nullable().optional().openapi({
+    example: 1,
+    description: '关联文件ID(用于图片消息)'
   })
 });