1+ using CodeBeam . UltimateAuth . Authorization . Contracts ;
2+ using CodeBeam . UltimateAuth . Core . Domain ;
3+ using CodeBeam . UltimateAuth . Core . MultiTenancy ;
4+ using Microsoft . EntityFrameworkCore ;
5+
6+ namespace CodeBeam . UltimateAuth . Authorization . EntityFrameworkCore ;
7+
8+ internal sealed class UAuthAuthorizationDbContext : DbContext
9+ {
10+ public DbSet < RoleProjection > Roles => Set < RoleProjection > ( ) ;
11+ public DbSet < RolePermissionProjection > RolePermissions => Set < RolePermissionProjection > ( ) ;
12+ public DbSet < UserRoleProjection > UserRoles => Set < UserRoleProjection > ( ) ;
13+
14+ private readonly TenantContext _tenant ;
15+
16+ public UAuthAuthorizationDbContext ( DbContextOptions < UAuthAuthorizationDbContext > options , TenantContext tenant )
17+ : base ( options )
18+ {
19+ _tenant = tenant ;
20+ }
21+
22+ protected override void OnModelCreating ( ModelBuilder b )
23+ {
24+ ConfigureRole ( b ) ;
25+ ConfigureRolePermission ( b ) ;
26+ ConfigureUserRole ( b ) ;
27+ }
28+
29+ private void ConfigureRole ( ModelBuilder b )
30+ {
31+ b . Entity < RoleProjection > ( e =>
32+ {
33+ e . HasKey ( x => x . Id ) ;
34+
35+ e . Property ( x => x . Version )
36+ . IsConcurrencyToken ( ) ;
37+
38+ e . Property ( x => x . Tenant )
39+ . HasConversion (
40+ v => v . Value ,
41+ v => TenantKey . FromInternal ( v ) )
42+ . HasMaxLength ( 128 )
43+ . IsRequired ( ) ;
44+
45+ e . Property ( x => x . Id )
46+ . HasConversion (
47+ v => v . Value ,
48+ v => RoleId . From ( v ) )
49+ . IsRequired ( ) ;
50+
51+ e . Property ( x => x . Name )
52+ . HasMaxLength ( 128 )
53+ . IsRequired ( ) ;
54+
55+ e . Property ( x => x . NormalizedName )
56+ . HasMaxLength ( 128 )
57+ . IsRequired ( ) ;
58+
59+ e . Property ( x => x . CreatedAt )
60+ . IsRequired ( ) ;
61+
62+ e . HasIndex ( x => new { x . Tenant , x . Id } ) . IsUnique ( ) ;
63+ e . HasIndex ( x => new { x . Tenant , x . NormalizedName } ) . IsUnique ( ) ;
64+
65+ e . HasQueryFilter ( x => _tenant . IsGlobal || x . Tenant == _tenant . Tenant ) ;
66+ } ) ;
67+ }
68+
69+ private void ConfigureRolePermission ( ModelBuilder b )
70+ {
71+ b . Entity < RolePermissionProjection > ( e =>
72+ {
73+ e . HasKey ( x => new { x . Tenant , x . RoleId , x . Permission } ) ;
74+
75+ e . Property ( x => x . Tenant )
76+ . HasConversion (
77+ v => v . Value ,
78+ v => TenantKey . FromInternal ( v ) )
79+ . HasMaxLength ( 128 )
80+ . IsRequired ( ) ;
81+
82+ e . Property ( x => x . RoleId )
83+ . HasConversion (
84+ v => v . Value ,
85+ v => RoleId . From ( v ) )
86+ . IsRequired ( ) ;
87+
88+ e . Property ( x => x . Permission )
89+ . HasMaxLength ( 256 )
90+ . IsRequired ( ) ;
91+
92+ e . HasIndex ( x => new { x . Tenant , x . RoleId } ) ;
93+ e . HasIndex ( x => new { x . Tenant , x . Permission } ) ;
94+
95+ e . HasQueryFilter ( x => _tenant . IsGlobal || x . Tenant == _tenant . Tenant ) ;
96+ } ) ;
97+ }
98+
99+ private void ConfigureUserRole ( ModelBuilder b )
100+ {
101+ b . Entity < UserRoleProjection > ( e =>
102+ {
103+ e . HasKey ( x => new { x . Tenant , x . UserKey , x . RoleId } ) ;
104+
105+ e . Property ( x => x . Tenant )
106+ . HasConversion (
107+ v => v . Value ,
108+ v => TenantKey . FromInternal ( v ) )
109+ . HasMaxLength ( 128 )
110+ . IsRequired ( ) ;
111+
112+ e . Property ( x => x . UserKey )
113+ . HasConversion (
114+ v => v . Value ,
115+ v => UserKey . FromString ( v ) )
116+ . HasMaxLength ( 128 )
117+ . IsRequired ( ) ;
118+
119+ e . Property ( x => x . RoleId )
120+ . HasConversion (
121+ v => v . Value ,
122+ v => RoleId . From ( v ) )
123+ . IsRequired ( ) ;
124+
125+ e . Property ( x => x . AssignedAt )
126+ . IsRequired ( ) ;
127+
128+ e . HasIndex ( x => new { x . Tenant , x . UserKey } ) ;
129+ e . HasIndex ( x => new { x . Tenant , x . RoleId } ) ;
130+
131+ e . HasQueryFilter ( x => _tenant . IsGlobal || x . Tenant == _tenant . Tenant ) ;
132+ } ) ;
133+ }
134+ }
0 commit comments