Files
gongxue-base/apps/server/src/migrations/1784780000000-AddAiChat.ts

84 lines
3.8 KiB
TypeScript

import { MigrationInterface, QueryRunner, Table } from 'typeorm';
export class AddAiChat1784780000000 implements MigrationInterface {
async up(queryRunner: QueryRunner): Promise<void> {
if (!(await queryRunner.hasTable('ai_conversations'))) {
await queryRunner.createTable(
new Table({
name: 'ai_conversations',
columns: [
{ name: 'id', type: 'integer', isPrimary: true, isGenerated: true, generationStrategy: 'increment' },
{ name: 'user_id', type: 'integer' },
{ name: 'title', type: 'varchar', length: '100', default: "'新对话'" },
{ name: 'created_at', type: 'datetime', default: 'CURRENT_TIMESTAMP' },
{ name: 'updated_at', type: 'datetime', default: 'CURRENT_TIMESTAMP' },
{ name: 'last_message_at', type: 'datetime', isNullable: true },
],
indices: [
{ name: 'idx_ai_conversations_user_last_message', columnNames: ['user_id', 'last_message_at'] },
],
foreignKeys: [
{ name: 'fk_ai_conversations_user', columnNames: ['user_id'], referencedTableName: 'users', referencedColumnNames: ['id'], onDelete: 'CASCADE' },
],
}),
);
}
if (!(await queryRunner.hasTable('ai_messages'))) {
await queryRunner.createTable(
new Table({
name: 'ai_messages',
columns: [
{ name: 'id', type: 'integer', isPrimary: true, isGenerated: true, generationStrategy: 'increment' },
{ name: 'conversation_id', type: 'integer' },
{ name: 'role', type: 'varchar', length: '20' },
{ name: 'content', type: 'text' },
{ name: 'reasoning_content', type: 'text', isNullable: true },
{ name: 'status', type: 'varchar', length: '20', default: "'completed'" },
{ name: 'error_code', type: 'varchar', length: '50', isNullable: true },
{ name: 'created_at', type: 'datetime', default: 'CURRENT_TIMESTAMP' },
{ name: 'updated_at', type: 'datetime', default: 'CURRENT_TIMESTAMP' },
],
indices: [
{ name: 'idx_ai_messages_conversation_created', columnNames: ['conversation_id', 'created_at'] },
],
foreignKeys: [
{ name: 'fk_ai_messages_conversation', columnNames: ['conversation_id'], referencedTableName: 'ai_conversations', referencedColumnNames: ['id'], onDelete: 'CASCADE' },
],
}),
);
}
if (!(await queryRunner.hasTable('ai_tool_runs'))) {
await queryRunner.createTable(
new Table({
name: 'ai_tool_runs',
columns: [
{ name: 'id', type: 'integer', isPrimary: true, isGenerated: true, generationStrategy: 'increment' },
{ name: 'message_id', type: 'integer' },
{ name: 'tool_call_id', type: 'varchar', length: '100' },
{ name: 'tool_name', type: 'varchar', length: '64' },
{ name: 'arguments_summary', type: 'text', isNullable: true },
{ name: 'result_summary', type: 'text', isNullable: true },
{ name: 'status', type: 'varchar', length: '20' },
{ name: 'duration_ms', type: 'integer', isNullable: true },
{ name: 'created_at', type: 'datetime', default: 'CURRENT_TIMESTAMP' },
],
indices: [
{ name: 'idx_ai_tool_runs_message', columnNames: ['message_id'] },
],
foreignKeys: [
{ name: 'fk_ai_tool_runs_message', columnNames: ['message_id'], referencedTableName: 'ai_messages', referencedColumnNames: ['id'], onDelete: 'CASCADE' },
],
}),
);
}
}
async down(queryRunner: QueryRunner): Promise<void> {
for (const table of ['ai_tool_runs', 'ai_messages', 'ai_conversations']) {
if (await queryRunner.hasTable(table)) await queryRunner.dropTable(table);
}
}
}