Forge
csharp4405de34
1using Microsoft.EntityFrameworkCore;
2
3namespace IntercomService.Data;
4
5public 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
View only · write via MCP/CIDE