public async Task <IdentityResult> DeleteRedirectUriAsync(Neo4jIdentityServer4Client client,
                                                                  Neo4jIdentityServer4ClientRedirectUri redirectUri,
                                                                  CancellationToken cancellationToken = default(CancellationToken))
        {
            cancellationToken.ThrowIfCancellationRequested();
            ThrowIfDisposed();
            client.ThrowIfNull(nameof(client));
            redirectUri.ThrowIfNull(nameof(redirectUri));
            try
            {
                var cypher = $@"
                MATCH (client:{IdSrv4Client})-[:{Neo4jConstants.Relationships.HasRedirectUri}]->(redirectUri:{
                        IdSrv4ClientRedirectUri
                    })
                WHERE client.ClientId = $p0 AND redirectUri.RedirectUri = $p1  
                DETACH DELETE redirectUri";

                await Session.RunAsync(cypher,
                                       Params.Create(
                                           client.ClientId,
                                           redirectUri.RedirectUri
                                           ));
                await RaiseClientChangeEventAsync(client);

                return(IdentityResult.Success);
            }
            catch (ClientException ex)
            {
                return(ex.ToIdentityResult());
            }
        }
        public async Task <IdentityResult> AddRedirectUriToClientAsync(Neo4jIdentityServer4Client client,
                                                                       Neo4jIdentityServer4ClientRedirectUri redirectUri,
                                                                       CancellationToken cancellationToken = default(CancellationToken))
        {
            cancellationToken.ThrowIfCancellationRequested();
            ThrowIfDisposed();
            client.ThrowIfNull(nameof(client));
            redirectUri.ThrowIfNull(nameof(redirectUri));
            try
            {
                var cypher = $@"
                MATCH (client:{IdSrv4Client} {{ClientId: $p0}})
                MERGE (redirectUri:{IdSrv4ClientRedirectUri} {"$p1".AsMapForNoNull<Neo4jIdentityServer4ClientRedirectUri>(redirectUri)})
                MERGE (client)-[:{Neo4jConstants.Relationships.HasRedirectUri}]->(redirectUri)";

                var result = await Session.RunAsync(cypher, Params.Create(client.ClientId, redirectUri));
                await RaiseClientChangeEventAsync(client);

                return(IdentityResult.Success);
            }
            catch (ClientException ex)
            {
                return(ex.ToIdentityResult());
            }
        }
        public async Task <Neo4jIdentityServer4ClientRedirectUri> FindRedirectUriAsync(Neo4jIdentityServer4Client client,
                                                                                       Neo4jIdentityServer4ClientRedirectUri redirectUri,
                                                                                       CancellationToken cancellationToken = default(CancellationToken))
        {
            cancellationToken.ThrowIfCancellationRequested();
            ThrowIfDisposed();
            client.ThrowIfNull(nameof(client));
            redirectUri.ThrowIfNull(nameof(redirectUri));
            var cypher = $@"
                MATCH (client:{IdSrv4Client})-[:{Neo4jConstants.Relationships.HasRedirectUri}]->(redirectUri:{
                    IdSrv4ClientRedirectUri
                })
                WHERE client.ClientId = $p0 AND redirectUri.RedirectUri = $p1  
                RETURN redirectUri{{ .* }}";

            var result = await Session.RunAsync(cypher,
                                                Params.Create(
                                                    client.ClientId,
                                                    redirectUri.RedirectUri

                                                    ));

            var foundRecord =
                await result.SingleOrDefaultAsync(r => r.MapTo <Neo4jIdentityServer4ClientRedirectUri>("redirectUri"));

            return(foundRecord);
        }
 /// <summary>
 /// Maps an entity to a model.
 /// </summary>
 /// <param name="entity">The entity.</param>
 /// <returns></returns>
 public static string ToModel(
     this Neo4jIdentityServer4ClientRedirectUri entity)
 {
     return(Mapper.Map <string>(entity));
 }