From 10a2449d055b5dc55eb1ce852f938aef7f0e7454 Mon Sep 17 00:00:00 2001 From: hailin Date: Fri, 23 Jan 2026 05:06:36 -0800 Subject: [PATCH] fix(conversation): use VARCHAR instead of enum for consistency with init-db.sql - Change MessageEntity.role from enum to VARCHAR(20) - Change MessageEntity.type from enum to VARCHAR(30) - Change ConversationEntity.status from enum to VARCHAR(20) - Add nullable: true to userId to match database schema - Add length constraints to match database schema - Convert enums to const objects with type exports for type safety This ensures TypeORM entities match the database schema exactly, avoiding potential issues with enum type creation in production. Co-Authored-By: Claude Opus 4.5 --- .../domain/entities/conversation.entity.ts | 28 +++++----- .../src/domain/entities/message.entity.ts | 53 ++++++++++--------- 2 files changed, 43 insertions(+), 38 deletions(-) diff --git a/packages/services/conversation-service/src/domain/entities/conversation.entity.ts b/packages/services/conversation-service/src/domain/entities/conversation.entity.ts index 4bd8b3b..655296e 100644 --- a/packages/services/conversation-service/src/domain/entities/conversation.entity.ts +++ b/packages/services/conversation-service/src/domain/entities/conversation.entity.ts @@ -8,26 +8,28 @@ import { } from 'typeorm'; import { MessageEntity } from './message.entity'; -export enum ConversationStatus { - ACTIVE = 'ACTIVE', - ENDED = 'ENDED', - ARCHIVED = 'ARCHIVED', -} +/** + * 对话状态常量 + */ +export const ConversationStatus = { + ACTIVE: 'ACTIVE', + ENDED: 'ENDED', + ARCHIVED: 'ARCHIVED', +} as const; + +export type ConversationStatusType = + (typeof ConversationStatus)[keyof typeof ConversationStatus]; @Entity('conversations') export class ConversationEntity { @PrimaryGeneratedColumn('uuid') id: string; - @Column({ name: 'user_id', type: 'uuid' }) + @Column({ name: 'user_id', type: 'uuid', nullable: true }) userId: string; - @Column({ - type: 'enum', - enum: ConversationStatus, - default: ConversationStatus.ACTIVE, - }) - status: ConversationStatus; + @Column({ length: 20, default: 'ACTIVE' }) + status: ConversationStatusType; @Column({ nullable: true }) title: string; @@ -35,7 +37,7 @@ export class ConversationEntity { @Column({ type: 'text', nullable: true }) summary: string; - @Column({ nullable: true }) + @Column({ length: 50, nullable: true }) category: string; @Column({ name: 'message_count', default: 0 }) diff --git a/packages/services/conversation-service/src/domain/entities/message.entity.ts b/packages/services/conversation-service/src/domain/entities/message.entity.ts index 555869c..923cb50 100644 --- a/packages/services/conversation-service/src/domain/entities/message.entity.ts +++ b/packages/services/conversation-service/src/domain/entities/message.entity.ts @@ -8,21 +8,31 @@ import { } from 'typeorm'; import { ConversationEntity } from './conversation.entity'; -export enum MessageRole { - USER = 'user', - ASSISTANT = 'assistant', - SYSTEM = 'system', -} +/** + * 消息角色常量 + */ +export const MessageRole = { + USER: 'user', + ASSISTANT: 'assistant', + SYSTEM: 'system', +} as const; -export enum MessageType { - TEXT = 'TEXT', - TEXT_WITH_ATTACHMENTS = 'TEXT_WITH_ATTACHMENTS', - TOOL_CALL = 'TOOL_CALL', - TOOL_RESULT = 'TOOL_RESULT', - PAYMENT_REQUEST = 'PAYMENT_REQUEST', - ASSESSMENT_START = 'ASSESSMENT_START', - ASSESSMENT_RESULT = 'ASSESSMENT_RESULT', -} +export type MessageRoleType = (typeof MessageRole)[keyof typeof MessageRole]; + +/** + * 消息类型常量 + */ +export const MessageType = { + TEXT: 'TEXT', + TEXT_WITH_ATTACHMENTS: 'TEXT_WITH_ATTACHMENTS', + TOOL_CALL: 'TOOL_CALL', + TOOL_RESULT: 'TOOL_RESULT', + PAYMENT_REQUEST: 'PAYMENT_REQUEST', + ASSESSMENT_START: 'ASSESSMENT_START', + ASSESSMENT_RESULT: 'ASSESSMENT_RESULT', +} as const; + +export type MessageTypeType = (typeof MessageType)[keyof typeof MessageType]; @Entity('messages') export class MessageEntity { @@ -32,18 +42,11 @@ export class MessageEntity { @Column({ name: 'conversation_id', type: 'uuid' }) conversationId: string; - @Column({ - type: 'enum', - enum: MessageRole, - }) - role: MessageRole; + @Column({ length: 20 }) + role: MessageRoleType; - @Column({ - type: 'enum', - enum: MessageType, - default: MessageType.TEXT, - }) - type: MessageType; + @Column({ length: 30, default: 'TEXT' }) + type: MessageTypeType; @Column({ type: 'text' }) content: string;