public Task <List <Domain.EffectiveAuthorizationEvent> > GetRawEventsAsync(
            Domain.EffectiveAuthorization effectiveAuthorization)
        {
            try
            {
                //The reason for composing the full SQL statement instead of using the Equals operation as part of a linq "where" is because "Equals" operator is not supported
                var resourceResponse = _client.CreateDocumentQuery <Models.ReadEffectiveAuthorizationEvent>(
                    UriFactory.CreateDocumentCollectionUri(_dbConfig.Database, _dbConfig.Collection),
                    GetSQLQueryByEffectiveAuthorisation(effectiveAuthorization), _queryOptions).ToList();

                // can't filter event with null target in cosmos db, so doing the event with target null filter here.
                if (effectiveAuthorization.Target is null)
                {
                    resourceResponse = resourceResponse.Where(e => e.EffectiveAuthorization.Target is null).ToList();
                }

                var output = new List <Domain.EffectiveAuthorizationEvent>();
                foreach (Models.ReadEffectiveAuthorizationEvent readModelEvent in resourceResponse)
                {
                    output.Add(DomainAdapter.MapReadStorageModelToDomain(readModelEvent));
                }

                return(Task.FromResult <List <Domain.EffectiveAuthorizationEvent> >(output));
            }
            catch (RawEventStorageException ex)
            {
                throw new RawEventStorageException($"Issue while reading events from the storage account :{ex.Message}",
                                                   ex);
            }
        }
        private string GetSQLQueryByEffectiveAuthorisation(Domain.EffectiveAuthorization ea)
        {
            var queryBuilder = new List <string>();

            queryBuilder.Add($@"c.EffectiveAuthorization.TenantId = ""{ea.TenantId}""");

            queryBuilder.Add($@"c.EffectiveAuthorization.User.Context = ""{ea.User.Context}""");
            queryBuilder.Add($@"c.EffectiveAuthorization.User.Id = ""{ea.User.Id}""");

            queryBuilder.Add($@"c.EffectiveAuthorization.Permission.Application = ""{ea.Permission.Application}""");
            queryBuilder.Add($@"c.EffectiveAuthorization.Permission.Id = ""{ea.Permission.Id}""");

            if (ea.Target != null)
            {
                queryBuilder.Add($@"c.EffectiveAuthorization.Target.Context = ""{ea.Target.Context}""");
                queryBuilder.Add($@"c.EffectiveAuthorization.Target.Id = ""{ea.Target.Id}""");
            }

            var whereClause = String.Join(" AND ", queryBuilder.ToArray());

            return($"SELECT * FROM c WHERE {whereClause}");
        }
 public EffectiveAuthorizationTimeline(EffectiveAuthorization effectiveAuthorization)
 {
     EffectiveAuthorization = effectiveAuthorization;
     StartDates             = new List <DateTime>();
     EndDates = new List <DateTime>();
 }
 protected bool Equals(EffectiveAuthorization other)
 {
     return(User.Equals(other.User) &&
            Permission.Equals(other.Permission) &&
            (Target?.Equals(other.Target) ?? other.Target == null));
 }