1
+ using Shuttle . Access . Application ;
2
+ using Shuttle . Access . DataAccess ;
3
+ using Shuttle . Access . Messages . v1 ;
4
+ using Shuttle . Core . Contract ;
5
+ using Shuttle . Core . Data ;
6
+ using Shuttle . Core . Mediator ;
7
+ using Shuttle . Esb ;
8
+ using Shuttle . Recall ;
9
+
10
+ namespace Shuttle . Access . WebApi . Handlers ;
11
+
12
+ public class AccessServiceHandler :
13
+ IAsyncMessageHandler < IdentityRoleSet > ,
14
+ IAsyncMessageHandler < RolePermissionSet > ,
15
+ IAsyncMessageHandler < PermissionStatusSet >
16
+ {
17
+ private readonly IMediator _mediator ;
18
+ private readonly IDatabaseContextFactory _databaseContextFactory ;
19
+ private readonly IIdentityQuery _identityQuery ;
20
+ private readonly IPermissionQuery _permissionQuery ;
21
+ private readonly IProjectionRepository _projectionRepository ;
22
+ private readonly ISessionQuery _sessionQuery ;
23
+
24
+ public AccessServiceHandler ( IDatabaseContextFactory databaseContextFactory , IIdentityQuery identityQuery , IProjectionRepository projectionRepository , IPermissionQuery permissionQuery , ISessionQuery sessionQuery , IMediator mediator )
25
+ {
26
+ _databaseContextFactory = Guard . AgainstNull ( databaseContextFactory ) ;
27
+ _identityQuery = Guard . AgainstNull ( identityQuery ) ;
28
+ _projectionRepository = Guard . AgainstNull ( projectionRepository ) ;
29
+ _permissionQuery = Guard . AgainstNull ( permissionQuery ) ;
30
+ _sessionQuery = Guard . AgainstNull ( sessionQuery ) ;
31
+ _mediator = Guard . AgainstNull ( mediator ) ;
32
+ }
33
+
34
+ public async Task ProcessMessageAsync ( IHandlerContext < IdentityRoleSet > context )
35
+ {
36
+ Guard . AgainstNull ( context , nameof ( context ) ) ;
37
+
38
+ var message = context . Message ;
39
+
40
+ using ( new DatabaseContextScope ( ) )
41
+ await using ( _databaseContextFactory . Create ( ) )
42
+ {
43
+ if ( await _projectionRepository . GetSequenceNumberAsync ( ProjectionNames . Identity ) < message . SequenceNumber )
44
+ {
45
+ await context . SendAsync ( message , c => c . Defer ( DateTime . UtcNow . AddSeconds ( 5 ) ) . Local ( ) ) ;
46
+
47
+ return ;
48
+ }
49
+
50
+ if ( message . Active )
51
+ {
52
+ await RefreshAsync ( new DataAccess . Query . Identity . Specification ( ) . WithRoleId ( message . RoleId ) ) ;
53
+ }
54
+ else
55
+ {
56
+ await RefreshAsync ( new DataAccess . Query . Session . Specification ( ) . AddPermissions (
57
+ ( await _permissionQuery . SearchAsync ( new DataAccess . Query . Permission . Specification ( ) . AddRoleId ( message . RoleId ) ) )
58
+ . Select ( item => item . Name ) ) ) ;
59
+ }
60
+ }
61
+ }
62
+
63
+ public async Task ProcessMessageAsync ( IHandlerContext < PermissionStatusSet > context )
64
+ {
65
+ Guard . AgainstNull ( context , nameof ( context ) ) ;
66
+
67
+ var message = context . Message ;
68
+
69
+ using ( new DatabaseContextScope ( ) )
70
+ await using ( _databaseContextFactory . Create ( ) )
71
+ {
72
+ if ( await _projectionRepository . GetSequenceNumberAsync ( ProjectionNames . Permission ) < message . SequenceNumber )
73
+ {
74
+ await context . SendAsync ( message , c => c . Defer ( DateTime . UtcNow . AddSeconds ( 5 ) ) . Local ( ) ) ;
75
+
76
+ return ;
77
+ }
78
+
79
+ if ( message . Status == ( int ) PermissionStatus . Removed )
80
+ {
81
+ await RefreshAsync ( new DataAccess . Query . Session . Specification ( ) . AddPermission ( message . Name ) ) ;
82
+ }
83
+ else
84
+ {
85
+ await RefreshAsync ( new DataAccess . Query . Identity . Specification ( ) . WithPermissionId ( message . Id ) ) ;
86
+ }
87
+ }
88
+ }
89
+
90
+ public async Task ProcessMessageAsync ( IHandlerContext < RolePermissionSet > context )
91
+ {
92
+ Guard . AgainstNull ( context , nameof ( context ) ) ;
93
+
94
+ var message = context . Message ;
95
+
96
+ using ( new DatabaseContextScope ( ) )
97
+ await using ( _databaseContextFactory . Create ( ) )
98
+ {
99
+ if ( await _projectionRepository . GetSequenceNumberAsync ( ProjectionNames . Role ) < message . SequenceNumber )
100
+ {
101
+ await context . SendAsync ( message , c => c . Defer ( DateTime . UtcNow . AddSeconds ( 5 ) ) . Local ( ) ) ;
102
+
103
+ return ;
104
+ }
105
+
106
+ if ( message . Active )
107
+ {
108
+ await RefreshAsync ( new DataAccess . Query . Identity . Specification ( ) . WithRoleId ( message . RoleId ) ) ;
109
+ }
110
+ else
111
+ {
112
+ await RefreshAsync ( new DataAccess . Query . Session . Specification ( ) . AddPermissions (
113
+ ( await _permissionQuery . SearchAsync ( new DataAccess . Query . Permission . Specification ( ) . AddId ( message . PermissionId ) ) )
114
+ . Select ( item => item . Name ) ) ) ;
115
+ }
116
+ }
117
+ }
118
+
119
+ private async Task RefreshAsync ( DataAccess . Query . Session . Specification specification )
120
+ {
121
+ foreach ( var session in await _sessionQuery . SearchAsync ( specification ) )
122
+ {
123
+ await _mediator . SendAsync ( new RefreshSession ( session . Token ) ) ;
124
+ }
125
+ }
126
+
127
+ private async Task RefreshAsync ( DataAccess . Query . Identity . Specification specification )
128
+ {
129
+ foreach ( var identity in await _identityQuery . SearchAsync ( specification ) )
130
+ {
131
+ await _mediator . SendAsync ( new RefreshSession ( identity . Name ) ) ;
132
+ }
133
+ }
134
+ }
0 commit comments