feat(guild): add Guild aggregate schema + migration

This commit is contained in:
gamer147
2026-06-27 11:02:29 -04:00
parent 3a52115551
commit f4533aabd3
12 changed files with 5650 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
using SVSim.Database.Models;
namespace SVSim.Database.Entities.Guild;
public class Guild
{
public int GuildId { get; set; } // server-generated 9-digit
public string Name { get; set; } = "";
public string Description { get; set; } = "";
public long LeaderViewerId { get; set; }
public long EmblemId { get; set; }
public GuildActivity Activity { get; set; }
public GuildJoinCondition JoinCondition { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime? BreakupAt { get; set; } // soft-delete on breakup
public List<GuildMember> Members { get; set; } = new();
}

View File

@@ -0,0 +1,16 @@
namespace SVSim.Database.Entities.Guild;
public class GuildChatMessage
{
public long Id { get; set; } // global PK
public int GuildId { get; set; }
public int MessageId { get; set; } // per-guild monotonic, unique with GuildId
public long AuthorViewerId { get; set; }
public GuildChatMessageType MessageType { get; set; }
public string Body { get; set; } = "";
public string? DeckPayload { get; set; } // jsonb
public string? ReplayPayload { get; set; } // jsonb
public string? RoomPayload { get; set; } // jsonb
public DateTime CreatedAt { get; set; }
public Guild Guild { get; set; } = null!;
}

View File

@@ -0,0 +1,36 @@
namespace SVSim.Database.Entities.Guild;
public enum GuildRole : int
{
Regular = 0,
Leader = 1,
SubLeader = 2,
}
public enum GuildJoinCondition : int
{
Free = 1,
Approval = 2,
OnlyInvite = 3,
}
// Matches GuildDetailInfo.ActivityType (1..16). All / Beginner / Enjoy / Stoic / FriendOnly /
// per-class (Elf..Nemesis) / Rotation / Unlimited / TwoPick.
public enum GuildActivity : int
{
All = 1, Beginner = 2, Enjoy = 3, Stoic = 4, FriendOnly = 5,
Elf = 6, Royal = 7, Witch = 8, Dragon = 9, Necro = 10,
Vampire = 11, Bishop = 12, Nemesis = 13,
Rotation = 14, Unlimited = 15, TwoPick = 16,
}
public enum GuildInviteStatus : int { Pending = 0, Canceled = 1, Rejected = 2, Consumed = 3 }
public enum GuildJoinRequestStatus : int { Pending = 0, Canceled = 1, Rejected = 2, Accepted = 3 }
// Per docs/api-spec/.../guild_chat-messages.md. 12..18 are gathering-only — never emit on guild.
public enum GuildChatMessageType : int
{
Normal = 0, Stamp = 1, Deck = 2, Join = 3, Leave = 4, Replay = 5,
ChangeLeader = 6, ChangeSubLeader = 7, CreateGuild = 8, Remove = 9,
RoomMatch = 10, Description = 11,
}

View File

@@ -0,0 +1,12 @@
namespace SVSim.Database.Entities.Guild;
public class GuildInvite
{
public int GuildId { get; set; }
public long InviteeViewerId { get; set; }
public long InviterViewerId { get; set; }
public GuildInviteStatus Status { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime? RespondedAt { get; set; }
public Guild Guild { get; set; } = null!;
}

View File

@@ -0,0 +1,11 @@
namespace SVSim.Database.Entities.Guild;
public class GuildJoinRequest
{
public int GuildId { get; set; }
public long ViewerId { get; set; }
public GuildJoinRequestStatus Status { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime? RespondedAt { get; set; }
public Guild Guild { get; set; } = null!;
}

View File

@@ -0,0 +1,10 @@
namespace SVSim.Database.Entities.Guild;
public class GuildMember
{
public int GuildId { get; set; }
public long ViewerId { get; set; }
public GuildRole Role { get; set; }
public DateTime JoinedAt { get; set; }
public Guild Guild { get; set; } = null!;
}