private async Task <IdentityResult> AddRollupAsync( Neo4jIdentityServer4ApiResource apiResource, ApiResourceRollup rollup, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); apiResource.ThrowIfNull(nameof(apiResource)); rollup.ThrowIfNull(nameof(rollup)); try { var cypher = $@" MATCH (c:{IdSrv4ApiResource}{{Name: $p0}}) MERGE (rollup:{IdSrv4ApiResourceRollup} {"$p1".AsMapForNoNull<ApiResourceRollup>(rollup)}) MERGE (c)-[:{Neo4jConstants.Relationships.HasRollup}]->(rollup)"; var result = await Session.RunAsync(cypher, Params.Create(apiResource.Name, rollup)); return(IdentityResult.Success); } catch (ClientException ex) { return(ex.ToIdentityResult()); } }
public async Task <ApiResource> RollupAsync( Neo4jIdentityServer4ApiResource apiResource, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); apiResource.ThrowIfNull(nameof(apiResource)); var foundApiResource = await GetApiResourceAsync(apiResource, cancellationToken); ApiResource model = null; if (foundApiResource != null) { model = foundApiResource.ToModel(); var secrets = await GetApiSecretsAsync(apiResource, cancellationToken); foreach (var secret in secrets) { model.ApiSecrets.Add(secret.ToModel()); } var claims = await GetApiResourceClaimsAsync(apiResource, cancellationToken); foreach (var claim in claims) { model.UserClaims.Add(claim.Type); } var apiScopes = await GetApiScopesAsync(apiResource, cancellationToken); foreach (var apiScope in apiScopes) { var apiScopeModel = await GetRollupAsync(apiResource, apiScope, cancellationToken); model.Scopes.Add(apiScopeModel); } var distinctList = model.Scopes.Distinct(new ModelsScopeComparer()); model.Scopes = distinctList.ToList(); var rollup = new ApiResourceRollup() { ApiResourceJson = JsonConvert.SerializeObject(model), }; await AddRollupAsync(apiResource, rollup); } return(model); }