using Microsoft.AspNetCore.Identity; using Raven.Client.Documents; using Raven.Client.Documents.Linq; using Raven.Client.Documents.Session; using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; using zero.Core.Entities; namespace zero.Core.Identity { public partial class UserStore : IUserClaimStore where TUser : class, IUser { /// public async Task AddClaimsAsync(TUser user, IEnumerable claims, CancellationToken cancellationToken) { using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) { user.Claims.AddRange(claims.Select(claim => new UserClaim(claim))); await session.StoreAsync(user, cancellationToken); await session.SaveChangesAsync(cancellationToken); } } /// public Task> GetClaimsAsync(TUser user, CancellationToken cancellationToken) { return Task.FromResult((IList)user.Claims.Select(claim => claim.ToClaim()).ToList()); } /// public async Task> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken) { using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) { UserClaim userClaim = new UserClaim(claim); return await session.Query().Where(x => x.Claims.Any(c => c.Type == userClaim.Type && c.Value == userClaim.Value)).ToListAsync(); } } /// public async Task RemoveClaimsAsync(TUser user, IEnumerable claims, CancellationToken cancellationToken) { using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) { IEnumerable userClaims = claims.Select(c => new UserClaim(c)).ToList(); user.Claims = user.Claims.Except(userClaims, new UserClaimComparer()).ToList(); await session.StoreAsync(user, cancellationToken); await session.SaveChangesAsync(cancellationToken); } } /// public async Task ReplaceClaimAsync(TUser user, Claim claim, Claim newClaim, CancellationToken cancellationToken) { using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) { UserClaim userClaim = new UserClaim(claim); UserClaim newUserClaim = new UserClaim(newClaim); user.Claims.Remove(userClaim); user.Claims.Add(newUserClaim); await session.StoreAsync(user, cancellationToken); await session.SaveChangesAsync(cancellationToken); } } } }