| 1 | using Microsoft.EntityFrameworkCore; |
| 2 | |
| 3 | namespace IntercomService.Data; |
| 4 | |
| 5 | public sealed class IntercomDbContext(DbContextOptions<IntercomDbContext> options) : DbContext(options) |
| 6 | { |
| 7 | public DbSet<TeamEntity> Teams => Set<TeamEntity>(); |
| 8 | |
| 9 | public DbSet<MemberEntity> Members => Set<MemberEntity>(); |
| 10 | |
| 11 | public DbSet<TeamMemberEntity> TeamMembers => Set<TeamMemberEntity>(); |
| 12 | |
| 13 | public DbSet<TopicEntity> Topics => Set<TopicEntity>(); |
| 14 | |
| 15 | public DbSet<TransportEventEntity> TransportEvents => Set<TransportEventEntity>(); |
| 16 | |
| 17 | public DbSet<RefreshTokenEntity> RefreshTokens => Set<RefreshTokenEntity>(); |
| 18 | |
| 19 | public DbSet<OAuthStateEntity> OAuthStates => Set<OAuthStateEntity>(); |
| 20 | |
| 21 | public DbSet<TeamInviteEntity> TeamInvites => Set<TeamInviteEntity>(); |
| 22 | |
| 23 | public DbSet<AgentCredentialEntity> AgentCredentials => Set<AgentCredentialEntity>(); |
| 24 | |
| 25 | public DbSet<ProjectEntity> Projects => Set<ProjectEntity>(); |
| 26 | |
| 27 | public DbSet<ProjectRepoEntity> ProjectRepos => Set<ProjectRepoEntity>(); |
| 28 | |
| 29 | public DbSet<TeamProjectEntity> TeamProjects => Set<TeamProjectEntity>(); |
| 30 | |
| 31 | protected override void OnModelCreating(ModelBuilder modelBuilder) |
| 32 | { |
| 33 | modelBuilder.Entity<TeamEntity>(e => |
| 34 | { |
| 35 | e.ToTable("Teams"); |
| 36 | e.HasKey(x => x.TeamId); |
| 37 | }); |
| 38 | |
| 39 | modelBuilder.Entity<MemberEntity>(e => |
| 40 | { |
| 41 | e.ToTable("Members"); |
| 42 | e.HasKey(x => x.MemberId); |
| 43 | e.HasIndex(x => new { x.Issuer, x.Subject }).IsUnique(); |
| 44 | }); |
| 45 | |
| 46 | modelBuilder.Entity<TeamMemberEntity>(e => |
| 47 | { |
| 48 | e.ToTable("TeamMembers"); |
| 49 | e.HasKey(x => new { x.TeamId, x.MemberId }); |
| 50 | e.HasOne(x => x.Team).WithMany().HasForeignKey(x => x.TeamId); |
| 51 | e.HasOne(x => x.Member).WithMany().HasForeignKey(x => x.MemberId); |
| 52 | }); |
| 53 | |
| 54 | modelBuilder.Entity<TopicEntity>(e => |
| 55 | { |
| 56 | e.ToTable("Topics"); |
| 57 | e.HasKey(x => x.TopicId); |
| 58 | e.HasIndex(x => x.TeamId); |
| 59 | }); |
| 60 | |
| 61 | modelBuilder.Entity<TransportEventEntity>(e => |
| 62 | { |
| 63 | e.ToTable("TransportEvents"); |
| 64 | e.HasKey(x => x.Id); |
| 65 | e.HasIndex(x => new { x.TeamId, x.Seq }).IsUnique(); |
| 66 | e.HasIndex(x => new { x.TeamId, x.ClientEventId }).IsUnique(); |
| 67 | e.HasIndex(x => new { x.TeamId, x.TopicId, x.Seq }); |
| 68 | }); |
| 69 | |
| 70 | modelBuilder.Entity<RefreshTokenEntity>(e => |
| 71 | { |
| 72 | e.ToTable("RefreshTokens"); |
| 73 | e.HasKey(x => x.Id); |
| 74 | e.HasIndex(x => x.TokenHash).IsUnique(); |
| 75 | }); |
| 76 | |
| 77 | modelBuilder.Entity<OAuthStateEntity>(e => |
| 78 | { |
| 79 | e.ToTable("OAuthStates"); |
| 80 | e.HasKey(x => x.State); |
| 81 | }); |
| 82 | |
| 83 | modelBuilder.Entity<TeamInviteEntity>(e => |
| 84 | { |
| 85 | e.ToTable("TeamInvites"); |
| 86 | e.HasKey(x => x.InviteId); |
| 87 | e.HasIndex(x => x.TokenHash); |
| 88 | e.HasOne(x => x.Team).WithMany().HasForeignKey(x => x.TeamId); |
| 89 | }); |
| 90 | |
| 91 | modelBuilder.Entity<AgentCredentialEntity>(e => |
| 92 | { |
| 93 | e.ToTable("AgentCredentials"); |
| 94 | e.HasKey(x => x.CredentialId); |
| 95 | e.HasIndex(x => x.TokenHash); |
| 96 | e.HasOne(x => x.Member).WithMany().HasForeignKey(x => x.MemberId); |
| 97 | }); |
| 98 | |
| 99 | modelBuilder.Entity<ProjectEntity>(e => |
| 100 | { |
| 101 | e.ToTable("Projects"); |
| 102 | e.HasKey(x => x.ProjectId); |
| 103 | }); |
| 104 | |
| 105 | modelBuilder.Entity<ProjectRepoEntity>(e => |
| 106 | { |
| 107 | e.ToTable("ProjectRepos"); |
| 108 | e.HasKey(x => new { x.ProjectId, x.NormalizedRepoUrl }); |
| 109 | e.HasOne(x => x.Project).WithMany().HasForeignKey(x => x.ProjectId); |
| 110 | e.HasIndex(x => x.NormalizedRepoUrl); |
| 111 | }); |
| 112 | |
| 113 | modelBuilder.Entity<TeamProjectEntity>(e => |
| 114 | { |
| 115 | e.ToTable("TeamProjects"); |
| 116 | e.HasKey(x => new { x.TeamId, x.ProjectId }); |
| 117 | e.HasOne(x => x.Team).WithMany().HasForeignKey(x => x.TeamId); |
| 118 | e.HasOne(x => x.Project).WithMany().HasForeignKey(x => x.ProjectId); |
| 119 | }); |
| 120 | } |
| 121 | } |
| 122 | |