1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . Linq ;
4+ using System . Threading ;
5+ using System . Threading . Tasks ;
6+ using Microsoft . AspNetCore . Mvc ;
7+ using Microsoft . AspNetCore . Rewrite ;
8+ using SecurityService . Client ;
9+ using SecurityService . DataTransferObjects . Requests ;
10+ using SecurityService . DataTransferObjects . Responses ;
11+ using Shared . Results ;
12+ using SimpleResults ;
13+ using TransactionProcessor . SystemSetupTool . identityserverconfig ;
14+
15+ namespace TransactionProcessor . SystemSetupTool ;
16+
17+ public class IdentityServerFunctions {
18+ private readonly ISecurityServiceClient SecurityServiceClient ;
19+
20+ private readonly IdentityServerConfiguration identityServerConfiguration ;
21+
22+ public IdentityServerFunctions ( ISecurityServiceClient securityServiceClient , IdentityServerConfiguration configuration ) {
23+ this . SecurityServiceClient = securityServiceClient ;
24+ this . identityServerConfiguration = configuration ;
25+ }
26+
27+ private async Task < Result > CreateRoles ( CancellationToken cancellationToken ) {
28+ Result < List < RoleDetails > > rolesResult = await this . SecurityServiceClient . GetRoles ( cancellationToken ) ;
29+ if ( rolesResult . IsFailed )
30+ return ResultHelpers . CreateFailure ( rolesResult ) ;
31+
32+ List < RoleDetails > roles = rolesResult . Data ;
33+ if ( roles == null )
34+ roles = new List < RoleDetails > ( ) ;
35+
36+ foreach ( String role in this . identityServerConfiguration . roles )
37+ {
38+ if ( roles . Any ( r => r . RoleName == role ) )
39+ continue ;
40+ Result createResult = await this . CreateRole ( role , CancellationToken . None ) ;
41+ if ( createResult . IsFailed )
42+ return ResultHelpers . CreateFailure ( createResult ) ;
43+ }
44+
45+ return Result . Success ( ) ;
46+ }
47+
48+ private async Task < Result > CreateApiResources ( CancellationToken cancellationToken ) {
49+ var apiResourcesResult = await this . SecurityServiceClient . GetApiResources ( cancellationToken ) ;
50+ if ( apiResourcesResult . IsFailed )
51+ return ResultHelpers . CreateFailure ( apiResourcesResult ) ;
52+
53+ var apiResources = apiResourcesResult . Data ;
54+ if ( apiResources == null )
55+ apiResources = new List < ApiResourceDetails > ( ) ;
56+ foreach ( ApiResource apiResource in this . identityServerConfiguration . apiresources )
57+ {
58+ if ( apiResources . Any ( a => a . Name == apiResource . name ) )
59+ continue ;
60+ var createResult = await this . CreateApiResource ( apiResource , CancellationToken . None ) ;
61+ if ( createResult . IsFailed )
62+ return ResultHelpers . CreateFailure ( createResult ) ;
63+ }
64+ return Result . Success ( ) ;
65+ }
66+
67+ private async Task < Result > CreateIdentityResources ( CancellationToken cancellationToken ) {
68+ var identityResourcesResult = await this . SecurityServiceClient . GetIdentityResources ( cancellationToken ) ;
69+ if ( identityResourcesResult . IsFailed )
70+ return ResultHelpers . CreateFailure ( identityResourcesResult ) ;
71+
72+ var identityResources = identityResourcesResult . Data ;
73+ if ( identityResources == null )
74+ identityResources = new List < IdentityResourceDetails > ( ) ;
75+
76+ foreach ( IdentityResource identityResource in this . identityServerConfiguration . identityresources )
77+ {
78+ if ( identityResources . Any ( i => i . Name == identityResource . name ) )
79+ continue ;
80+ var createResult = await this . CreateIdentityResource ( identityResource , CancellationToken . None ) ;
81+ if ( createResult . IsFailed )
82+ return ResultHelpers . CreateFailure ( createResult ) ;
83+ }
84+ return Result . Success ( ) ;
85+ }
86+
87+ private async Task < Result > CreateClients ( CancellationToken cancellationToken ) {
88+ var clientsResult = await this . SecurityServiceClient . GetClients ( cancellationToken ) ;
89+ if ( clientsResult . IsFailed )
90+ return ResultHelpers . CreateFailure ( clientsResult ) ;
91+
92+ var clients = clientsResult . Data ;
93+ if ( clients == null )
94+ clients = new List < ClientDetails > ( ) ;
95+ foreach ( identityserverconfig . Client client in this . identityServerConfiguration . clients )
96+ {
97+ if ( clients . Any ( c => c . ClientId == client . client_id ) )
98+ continue ;
99+ var createResult = await this . CreateClient ( client , CancellationToken . None ) ;
100+ if ( createResult . IsFailed )
101+ return ResultHelpers . CreateFailure ( createResult ) ;
102+ }
103+
104+ return Result . Success ( ) ;
105+ }
106+
107+ private async Task < Result > CreateApiScopes ( CancellationToken cancellationToken ) {
108+ var apiScopesResult = await this . SecurityServiceClient . GetApiScopes ( cancellationToken ) ;
109+ if ( apiScopesResult . IsFailed )
110+ return ResultHelpers . CreateFailure ( apiScopesResult ) ;
111+ var apiScopes = apiScopesResult . Data ;
112+ if ( apiScopes == null )
113+ apiScopes = new List < ApiScopeDetails > ( ) ;
114+ foreach ( ApiScope apiscope in this . identityServerConfiguration . apiscopes )
115+ {
116+ if ( apiScopes . Any ( a => a . Name == apiscope . name ) )
117+ continue ;
118+ var createResult = await this . CreateApiScope ( apiscope , CancellationToken . None ) ;
119+ if ( createResult . IsFailed )
120+ return ResultHelpers . CreateFailure ( createResult ) ;
121+ }
122+ return Result . Success ( ) ;
123+ }
124+
125+ public async Task < Result > CreateConfig ( CancellationToken cancellationToken ) {
126+
127+ Result createRolesResult = await this . CreateRoles ( cancellationToken ) ;
128+ if ( createRolesResult . IsFailed )
129+ return createRolesResult ;
130+
131+ Result createApiResourcesResult = await this . CreateApiResources ( cancellationToken ) ;
132+ if ( createApiResourcesResult . IsFailed )
133+ return createApiResourcesResult ;
134+
135+ Result createIdentityResourcesResult = await this . CreateIdentityResources ( cancellationToken ) ;
136+ if ( createIdentityResourcesResult . IsFailed )
137+ return createIdentityResourcesResult ;
138+
139+ Result createClientsResult = await this . CreateClients ( cancellationToken ) ;
140+ if ( createClientsResult . IsFailed )
141+ return createClientsResult ;
142+
143+ Result createApiScopesResult = await this . CreateApiScopes ( cancellationToken ) ;
144+ if ( createApiScopesResult . IsFailed )
145+ return createApiScopesResult ;
146+
147+ return Result . Success ( ) ;
148+ }
149+
150+ private async Task < Result > CreateRole ( String role , CancellationToken cancellationToken ) {
151+
152+ CreateRoleRequest createRoleRequest = new ( ) {
153+ RoleName = role
154+ } ;
155+
156+ return await this . SecurityServiceClient . CreateRole ( createRoleRequest , cancellationToken ) ;
157+ }
158+
159+ private async Task < Result > CreateApiScope ( ApiScope apiscope ,
160+ CancellationToken cancellationToken )
161+ {
162+ CreateApiScopeRequest createApiScopeRequest = new CreateApiScopeRequest
163+ {
164+ Description = apiscope . description ,
165+ DisplayName = apiscope . display_name ,
166+ Name = apiscope . name
167+ } ;
168+
169+ return await this . SecurityServiceClient . CreateApiScope ( createApiScopeRequest , cancellationToken ) ;
170+ }
171+
172+ private async Task < Result > CreateIdentityResource ( IdentityResource identityResource ,
173+ CancellationToken cancellationToken )
174+ {
175+ CreateIdentityResourceRequest createIdentityResourceRequest = new CreateIdentityResourceRequest
176+ {
177+ Claims = identityResource . claims ,
178+ Description = identityResource . description ,
179+ DisplayName = identityResource . displayName ,
180+ Emphasize = identityResource . emphasize ,
181+ Name = identityResource . name ,
182+ Required = identityResource . required ,
183+ ShowInDiscoveryDocument = identityResource . showInDiscoveryDocument
184+ } ;
185+
186+ return await this . SecurityServiceClient . CreateIdentityResource ( createIdentityResourceRequest , cancellationToken ) ;
187+ }
188+
189+ private async Task < Result > CreateClient ( identityserverconfig . Client client , CancellationToken cancellationToken )
190+ {
191+ CreateClientRequest createClientRequest = new CreateClientRequest
192+ {
193+ AllowOfflineAccess = client . allow_offline_access . GetValueOrDefault ( false ) ,
194+ AllowedGrantTypes = client . allowed_grant_types ,
195+ AllowedScopes = client . allowed_scopes ,
196+ ClientDescription = client . client_description ,
197+ ClientId = client . client_id ,
198+ ClientName = client . client_name ,
199+ ClientPostLogoutRedirectUris = client . client_post_logout_redirect_uris ,
200+ ClientRedirectUris = client . client_redirect_uris ,
201+ RequireConsent = client . require_consent . GetValueOrDefault ( false ) ,
202+ Secret = client . secret
203+ } ;
204+ return await this . SecurityServiceClient . CreateClient ( createClientRequest , cancellationToken ) ;
205+ }
206+
207+ private async Task < Result > CreateApiResource ( ApiResource apiResource ,
208+ CancellationToken cancellationToken )
209+ {
210+ CreateApiResourceRequest createApiResourceRequest = new CreateApiResourceRequest
211+ {
212+ Secret = apiResource . secret ,
213+ Description = apiResource . description ,
214+ DisplayName = apiResource . display_name ,
215+ Name = apiResource . name ,
216+ Scopes = apiResource . scopes ,
217+ UserClaims = apiResource . user_claims
218+ } ;
219+
220+ return await this . SecurityServiceClient . CreateApiResource ( createApiResourceRequest , cancellationToken ) ;
221+ }
222+ }
0 commit comments