From 46f138328e67901bb30054e47b9ba883acf230d1 Mon Sep 17 00:00:00 2001 From: nav Date: Tue, 12 May 2026 09:01:24 +0000 Subject: [PATCH] feat(guild-model): complete guild/channel/dm entities --- Fabric.Backend.Guild/src/database.config.ts | 4 +++- .../src/entities/channel.entity.ts | 10 ++++++++-- .../src/entities/dm-conversation.entity.ts | 16 ++++++++++++++++ .../src/entities/dm-participant.entity.ts | 19 +++++++++++++++++++ .../src/entities/guild.entity.ts | 8 +++++++- .../src/entities/message.entity.ts | 12 ++++++++++-- docs/TODO-backend-center-guild.md | 2 +- 7 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 Fabric.Backend.Guild/src/entities/dm-conversation.entity.ts create mode 100644 Fabric.Backend.Guild/src/entities/dm-participant.entity.ts diff --git a/Fabric.Backend.Guild/src/database.config.ts b/Fabric.Backend.Guild/src/database.config.ts index 47b0e9f..0c89715 100644 --- a/Fabric.Backend.Guild/src/database.config.ts +++ b/Fabric.Backend.Guild/src/database.config.ts @@ -2,6 +2,8 @@ import { TypeOrmModuleOptions } from '@nestjs/typeorm'; import { Guild } from './entities/guild.entity'; import { Channel } from './entities/channel.entity'; import { Message } from './entities/message.entity'; +import { DmConversation } from './entities/dm-conversation.entity'; +import { DmParticipant } from './entities/dm-participant.entity'; export const buildTypeOrmConfig = (): TypeOrmModuleOptions => ({ type: 'mysql', @@ -10,7 +12,7 @@ export const buildTypeOrmConfig = (): TypeOrmModuleOptions => ({ username: process.env.DB_USER ?? 'fabric', password: process.env.DB_PASSWORD ?? 'fabric', database: process.env.DB_NAME ?? 'fabric_guild', - entities: [Guild, Channel, Message], + entities: [Guild, Channel, Message, DmConversation, DmParticipant], synchronize: (process.env.DB_SYNC ?? 'true') === 'true', logging: (process.env.DB_LOGGING ?? 'false') === 'true', }); diff --git a/Fabric.Backend.Guild/src/entities/channel.entity.ts b/Fabric.Backend.Guild/src/entities/channel.entity.ts index 26e44f4..03bb5a6 100644 --- a/Fabric.Backend.Guild/src/entities/channel.entity.ts +++ b/Fabric.Backend.Guild/src/entities/channel.entity.ts @@ -5,12 +5,18 @@ export class Channel { @PrimaryGeneratedColumn('uuid') id!: string; - @Column() + @Column({ type: 'char', length: 36 }) guildId!: string; - @Column() + @Column({ type: 'varchar', length: 120 }) name!: string; + @Column({ type: 'varchar', length: 16, default: 'text' }) + kind!: 'text' | 'announcement'; + + @Column({ type: 'boolean', default: false }) + isPrivate!: boolean; + @Index() @Column({ default: 0 }) lastSeq!: number; diff --git a/Fabric.Backend.Guild/src/entities/dm-conversation.entity.ts b/Fabric.Backend.Guild/src/entities/dm-conversation.entity.ts new file mode 100644 index 0000000..611a935 --- /dev/null +++ b/Fabric.Backend.Guild/src/entities/dm-conversation.entity.ts @@ -0,0 +1,16 @@ +import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity('dm_conversations') +export class DmConversation { + @PrimaryGeneratedColumn('uuid') + id!: string; + + @Column({ type: 'varchar', length: 64, unique: true }) + pairKey!: string; + + @Column({ type: 'varchar', length: 255, nullable: true }) + topic!: string | null; + + @CreateDateColumn() + createdAt!: Date; +} diff --git a/Fabric.Backend.Guild/src/entities/dm-participant.entity.ts b/Fabric.Backend.Guild/src/entities/dm-participant.entity.ts new file mode 100644 index 0000000..0dcc964 --- /dev/null +++ b/Fabric.Backend.Guild/src/entities/dm-participant.entity.ts @@ -0,0 +1,19 @@ +import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity('dm_participants') +export class DmParticipant { + @PrimaryGeneratedColumn('uuid') + id!: string; + + @Column({ type: 'char', length: 36 }) + conversationId!: string; + + @Column({ type: 'varchar', length: 64 }) + userId!: string; + + @Column({ type: 'varchar', length: 16, default: 'member' }) + role!: 'member'; + + @CreateDateColumn() + createdAt!: Date; +} diff --git a/Fabric.Backend.Guild/src/entities/guild.entity.ts b/Fabric.Backend.Guild/src/entities/guild.entity.ts index 19e5dd7..ad7d459 100644 --- a/Fabric.Backend.Guild/src/entities/guild.entity.ts +++ b/Fabric.Backend.Guild/src/entities/guild.entity.ts @@ -5,9 +5,15 @@ export class Guild { @PrimaryGeneratedColumn('uuid') id!: string; - @Column() + @Column({ type: 'varchar', length: 120 }) name!: string; + @Column({ type: 'varchar', length: 120, unique: true }) + slug!: string; + + @Column({ type: 'varchar', length: 64, nullable: true }) + ownerUserId!: string | null; + @CreateDateColumn() createdAt!: Date; } diff --git a/Fabric.Backend.Guild/src/entities/message.entity.ts b/Fabric.Backend.Guild/src/entities/message.entity.ts index 059d09f..9d5766d 100644 --- a/Fabric.Backend.Guild/src/entities/message.entity.ts +++ b/Fabric.Backend.Guild/src/entities/message.entity.ts @@ -2,13 +2,21 @@ import { Column, CreateDateColumn, Entity, Index, PrimaryGeneratedColumn } from @Entity('messages') @Index(['channelId', 'seq'], { unique: true }) +@Index(['conversationId', 'seq'], { unique: true }) export class Message { @PrimaryGeneratedColumn('uuid') id!: string; @Index() - @Column() - channelId!: string; + @Column({ type: 'char', length: 36, nullable: true }) + channelId!: string | null; + + @Index() + @Column({ type: 'char', length: 36, nullable: true }) + conversationId!: string | null; + + @Column({ type: 'varchar', length: 64 }) + authorUserId!: string; @Column() seq!: number; diff --git a/docs/TODO-backend-center-guild.md b/docs/TODO-backend-center-guild.md index ac3e6ad..2884ef6 100644 --- a/docs/TODO-backend-center-guild.md +++ b/docs/TODO-backend-center-guild.md @@ -39,7 +39,7 @@ ## 2. Fabric.Backend.Guild(Guild Node) ### 2.1 领域模型 -- [ ] Guild/Channel/DM 实体补全 +- [x] Guild/Channel/DM 实体补全 - [ ] Member/Role 基础模型(即使 MVP 权限全开,也先留结构) - [ ] 索引设计(channel_id + seq, created_at 等)