using Raven.Client.Documents; using Raven.Client.Documents.Session; using System; using System.Threading.Tasks; using zero.Core.Entities; using zero.Core.Extensions; using zero.Core.Options; namespace zero.Core.Api { public class Token : IToken { protected IDocumentStore Raven { get; private set; } protected IZeroOptions Options { get; private set; } private const string PREFIX = "ChangeTokens."; public Token(IDocumentStore raven, IZeroOptions options) { Raven = raven; Options = options; } /// public async Task Verify(IZeroEntity entity, string token) { return await Verify(entity?.Id, token); } /// public async Task Verify(string entityId, string token) { if (token.IsNullOrWhiteSpace() && entityId.IsNullOrEmpty()) { return true; } if (token.IsNullOrWhiteSpace() || entityId.IsNullOrEmpty()) { return false; } using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) { return await session.Query().AnyAsync(x => x.Id == token && x.ReferenceId == entityId); } } /// public async Task Get(IZeroEntity entity) { return await Get(entity?.Id); } /// public async Task Get(string entityId) { if (entityId.IsNullOrEmpty()) { return null; } ChangeToken token = new ChangeToken() { Id = Constants.Database.CollectionPrefix + PREFIX + Guid.NewGuid(), ReferenceId = entityId }; using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) { await session.StoreAsync(token); session.Advanced.GetMetadataFor(token)[Constants.Database.Expires] = DateTime.UtcNow.AddMinutes(Options.TokenExpiration); await session.SaveChangesAsync(); } return token.Id; } } public interface IToken { /// /// Verifies if the change token is valid for the entity /// Task Verify(IZeroEntity entity, string token); /// /// Verifies if the change token is valid for the entity /// Task Verify(string entityId, string token); /// /// Get a new change token for the entity /// Task Get(IZeroEntity entity); /// /// Get a new change token for the entity /// Task Get(string entityId); } }