feat(guild): add Guild aggregate schema + migration
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using SVSim.Database.Common;
|
||||
using SVSim.Database.Entities.Guild;
|
||||
using SVSim.Database.Entities.Story;
|
||||
using SVSim.Database.Models;
|
||||
using SVSim.Database.Models.Config;
|
||||
@@ -119,6 +120,12 @@ public class SVSimDbContext : DbContext
|
||||
public DbSet<ViewerPlayedTogether> ViewerPlayedTogethers => Set<ViewerPlayedTogether>();
|
||||
public DbSet<ViewerBattleHistory> ViewerBattleHistories => Set<ViewerBattleHistory>();
|
||||
|
||||
public DbSet<Guild> Guilds => Set<Guild>();
|
||||
public DbSet<GuildMember> GuildMembers => Set<GuildMember>();
|
||||
public DbSet<GuildInvite> GuildInvites => Set<GuildInvite>();
|
||||
public DbSet<GuildJoinRequest> GuildJoinRequests => Set<GuildJoinRequest>();
|
||||
public DbSet<GuildChatMessage> GuildChatMessages => Set<GuildChatMessage>();
|
||||
|
||||
#endregion
|
||||
|
||||
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
|
||||
@@ -504,6 +511,59 @@ public class SVSimDbContext : DbContext
|
||||
modelBuilder.Entity<ColosseumWindFallDeck>().HasIndex(d => d.DeckNo).IsUnique();
|
||||
modelBuilder.Entity<ColosseumAvatarDeck>().HasIndex(d => d.DeckNo).IsUnique();
|
||||
|
||||
// --- Guild entities ---
|
||||
|
||||
modelBuilder.Entity<Guild>(e =>
|
||||
{
|
||||
e.HasKey(g => g.GuildId);
|
||||
e.Property(g => g.GuildId).ValueGeneratedNever(); // we pick the random id ourselves
|
||||
e.Property(g => g.Name).HasMaxLength(64);
|
||||
e.Property(g => g.Description).HasMaxLength(512);
|
||||
e.HasIndex(g => g.Name); // name search
|
||||
});
|
||||
|
||||
modelBuilder.Entity<GuildMember>(e =>
|
||||
{
|
||||
e.HasKey(m => new { m.GuildId, m.ViewerId });
|
||||
e.HasOne(m => m.Guild).WithMany(g => g.Members).HasForeignKey(m => m.GuildId)
|
||||
.OnDelete(DeleteBehavior.Cascade);
|
||||
e.HasIndex(m => m.ViewerId).IsUnique(); // one-guild-per-viewer at DB level
|
||||
});
|
||||
|
||||
modelBuilder.Entity<GuildInvite>(e =>
|
||||
{
|
||||
e.HasKey(i => new { i.GuildId, i.InviteeViewerId });
|
||||
e.HasOne(i => i.Guild).WithMany().HasForeignKey(i => i.GuildId)
|
||||
.OnDelete(DeleteBehavior.Cascade);
|
||||
e.HasIndex(i => new { i.InviteeViewerId, i.Status }); // "my pending invites"
|
||||
});
|
||||
|
||||
modelBuilder.Entity<GuildJoinRequest>(e =>
|
||||
{
|
||||
e.HasKey(r => new { r.GuildId, r.ViewerId });
|
||||
e.HasOne(r => r.Guild).WithMany().HasForeignKey(r => r.GuildId)
|
||||
.OnDelete(DeleteBehavior.Cascade);
|
||||
e.HasIndex(r => new { r.ViewerId, r.Status });
|
||||
e.HasIndex(r => new { r.GuildId, r.Status });
|
||||
});
|
||||
|
||||
modelBuilder.Entity<GuildChatMessage>(e =>
|
||||
{
|
||||
e.HasKey(c => c.Id);
|
||||
e.HasOne(c => c.Guild).WithMany().HasForeignKey(c => c.GuildId)
|
||||
.OnDelete(DeleteBehavior.Cascade);
|
||||
e.HasIndex(c => new { c.GuildId, c.MessageId }).IsUnique();
|
||||
e.Property(c => c.DeckPayload).HasColumnType("jsonb");
|
||||
e.Property(c => c.ReplayPayload).HasColumnType("jsonb");
|
||||
e.Property(c => c.RoomPayload).HasColumnType("jsonb");
|
||||
});
|
||||
|
||||
modelBuilder.Entity<Viewer>(e =>
|
||||
{
|
||||
e.HasOne(v => v.Guild).WithMany().HasForeignKey(v => v.GuildId)
|
||||
.OnDelete(DeleteBehavior.SetNull);
|
||||
});
|
||||
|
||||
base.OnModelCreating(modelBuilder);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user