From e53c943991f984449968306a368457bbfd7e3618 Mon Sep 17 00:00:00 2001 From: nav Date: Tue, 12 May 2026 09:02:21 +0000 Subject: [PATCH] feat(guild-model): add member and role base entities --- Fabric.Backend.Guild/src/database.config.ts | 14 +++++++++++- .../src/entities/guild-member-role.entity.ts | 19 ++++++++++++++++ .../src/entities/guild-member.entity.ts | 19 ++++++++++++++++ .../src/entities/guild-role.entity.ts | 22 +++++++++++++++++++ docs/TODO-backend-center-guild.md | 2 +- 5 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 Fabric.Backend.Guild/src/entities/guild-member-role.entity.ts create mode 100644 Fabric.Backend.Guild/src/entities/guild-member.entity.ts create mode 100644 Fabric.Backend.Guild/src/entities/guild-role.entity.ts diff --git a/Fabric.Backend.Guild/src/database.config.ts b/Fabric.Backend.Guild/src/database.config.ts index 0c89715..499c9c8 100644 --- a/Fabric.Backend.Guild/src/database.config.ts +++ b/Fabric.Backend.Guild/src/database.config.ts @@ -4,6 +4,9 @@ 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'; +import { GuildRole } from './entities/guild-role.entity'; +import { GuildMember } from './entities/guild-member.entity'; +import { GuildMemberRole } from './entities/guild-member-role.entity'; export const buildTypeOrmConfig = (): TypeOrmModuleOptions => ({ type: 'mysql', @@ -12,7 +15,16 @@ 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, DmConversation, DmParticipant], + entities: [ + Guild, + Channel, + Message, + DmConversation, + DmParticipant, + GuildRole, + GuildMember, + GuildMemberRole, + ], synchronize: (process.env.DB_SYNC ?? 'true') === 'true', logging: (process.env.DB_LOGGING ?? 'false') === 'true', }); diff --git a/Fabric.Backend.Guild/src/entities/guild-member-role.entity.ts b/Fabric.Backend.Guild/src/entities/guild-member-role.entity.ts new file mode 100644 index 0000000..df78245 --- /dev/null +++ b/Fabric.Backend.Guild/src/entities/guild-member-role.entity.ts @@ -0,0 +1,19 @@ +import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity('guild_member_roles') +export class GuildMemberRole { + @PrimaryGeneratedColumn('uuid') + id!: string; + + @Column({ type: 'char', length: 36 }) + guildId!: string; + + @Column({ type: 'char', length: 36 }) + memberId!: string; + + @Column({ type: 'char', length: 36 }) + roleId!: string; + + @CreateDateColumn() + createdAt!: Date; +} diff --git a/Fabric.Backend.Guild/src/entities/guild-member.entity.ts b/Fabric.Backend.Guild/src/entities/guild-member.entity.ts new file mode 100644 index 0000000..ac998ca --- /dev/null +++ b/Fabric.Backend.Guild/src/entities/guild-member.entity.ts @@ -0,0 +1,19 @@ +import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity('guild_members') +export class GuildMember { + @PrimaryGeneratedColumn('uuid') + id!: string; + + @Column({ type: 'char', length: 36 }) + guildId!: string; + + @Column({ type: 'varchar', length: 64 }) + userId!: string; + + @Column({ type: 'varchar', length: 16, default: 'active' }) + status!: 'active' | 'left' | 'blocked'; + + @CreateDateColumn() + createdAt!: Date; +} diff --git a/Fabric.Backend.Guild/src/entities/guild-role.entity.ts b/Fabric.Backend.Guild/src/entities/guild-role.entity.ts new file mode 100644 index 0000000..20f63d5 --- /dev/null +++ b/Fabric.Backend.Guild/src/entities/guild-role.entity.ts @@ -0,0 +1,22 @@ +import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity('guild_roles') +export class GuildRole { + @PrimaryGeneratedColumn('uuid') + id!: string; + + @Column({ type: 'char', length: 36 }) + guildId!: string; + + @Column({ type: 'varchar', length: 64 }) + code!: string; + + @Column({ type: 'varchar', length: 120 }) + name!: string; + + @Column({ type: 'boolean', default: false }) + isSystem!: boolean; + + @CreateDateColumn() + createdAt!: Date; +} diff --git a/docs/TODO-backend-center-guild.md b/docs/TODO-backend-center-guild.md index 2884ef6..1106be0 100644 --- a/docs/TODO-backend-center-guild.md +++ b/docs/TODO-backend-center-guild.md @@ -40,7 +40,7 @@ ### 2.1 领域模型 - [x] Guild/Channel/DM 实体补全 -- [ ] Member/Role 基础模型(即使 MVP 权限全开,也先留结构) +- [x] Member/Role 基础模型(即使 MVP 权限全开,也先留结构) - [ ] 索引设计(channel_id + seq, created_at 等) ### 2.2 消息主链路