public Task SaveAccessTokenAsync(AccessToken token, CancellationToken cancellationToken)
        {
            var accessTokens = GetAccessTokens();

            AccessTokenDoc existing = null;

            if (token.Id != 0)
            {
                existing = accessTokens.FirstOrDefault(x => x.AccessTokenRowId == token.Id);
            }

            if (existing != null)
            {
                existing.ExpirationDate = token.ExpirationDate;
                return(Task.CompletedTask);
            }

            var newAccessTokenRowId = accessTokens.Count == 0 ? 1 : accessTokens.Max(t => t.AccessTokenRowId) + 1;

            accessTokens.Insert(new AccessTokenDoc
            {
                AccessTokenRowId = newAccessTokenRowId,
                Value            = token.Value,
                UserId           = token.UserId,
                ContentId        = token.ContentId == 0 ? (int?)null : token.ContentId,
                Feature          = token.Feature,
                CreationDate     = token.CreationDate,
                ExpirationDate   = token.ExpirationDate
            });

            token.Id = newAccessTokenRowId;
            return(Task.CompletedTask);
        }
 private static AccessToken CreateAccessTokenFromDoc(AccessTokenDoc doc)
 {
     return(new AccessToken
     {
         Id = doc.AccessTokenRowId,
         Value = doc.Value,
         UserId = doc.UserId,
         ContentId = doc.ContentId ?? 0,
         Feature = doc.Feature,
         CreationDate = doc.CreationDate,
         ExpirationDate = doc.ExpirationDate
     });
 }