Example #1
0
        public async Task <IActionResult> Index(string filters = null)
        {
            var scope = AuthenticationService.GetScope(User);

            var queryOptions = new AuditLogQueryOptions(scope, filters);
            var items        = await AuditService.GetAuditLogs(queryOptions);

            return(Ok(items));
        }
        public Task <AuditLogItems> GetAuditLogs(AuditLogQueryOptions queryOptions)
        {
            var items = new AuditLogItems();

            return(Task.FromResult <AuditLogItems>(items));
        }
        public async Task <AuditLogItems> GetAuditLogs(AuditLogQueryOptions queryOptions)
        {
            //The max amount of entities to return in the query (maybe put it appSettings?)
            var limit = 1000;

            var client = _account.CreateCloudTableClient();
            var table  = client.GetTableReference("AuditLogs");
            await table.CreateIfNotExistsAsync();

            TableContinuationToken token = null;

            var entities = new List <AuditLogEntity>();

            do
            {
                var query = new TableQuery <AuditLogEntity>();

                string partitionFilter = TableQuery.GenerateFilterCondition(
                    "PartitionKey",
                    QueryComparisons.Equal,
                    queryOptions.Scope.OrganisationId.ToString());

                //Minimal filter (organisation)
                string finalFilter = partitionFilter;

                //Dynamic filters
                //------------------------------------------------------------------------

                //Branch
                if (queryOptions.Scope.Scope == Scope.Branch)
                {
                    string branchFilter = TableQuery.GenerateFilterCondition(
                        "BranchId",
                        QueryComparisons.Equal,
                        queryOptions.Scope.BranchId.ToString());

                    finalFilter = finalFilter.AndWhere(branchFilter);
                }

                //User
                if (queryOptions.Scope.Scope == Scope.User)
                {
                    string userFilter = TableQuery.GenerateFilterCondition(
                        "UserId",
                        QueryComparisons.Equal,
                        queryOptions.Scope.UserId.ToString());

                    finalFilter = finalFilter.AndWhere(userFilter);
                }

                //Start Date
                if (queryOptions.StartDate.HasValue)
                {
                    string dateStartFilter = TableQuery.GenerateFilterConditionForDate(
                        "Timestamp",
                        QueryComparisons.GreaterThanOrEqual,
                        queryOptions.StartDate.Value.Date); //Start of day

                    finalFilter = finalFilter.AndWhere(dateStartFilter);
                }

                //End Date
                if (queryOptions.EndDate.HasValue)
                {
                    string dateEndFilter = TableQuery.GenerateFilterConditionForDate(
                        "Timestamp",
                        QueryComparisons.LessThan,
                        queryOptions.EndDate.Value.AddDays(1).Date);  //End of day

                    finalFilter = finalFilter.AndWhere(dateEndFilter);
                }

                //Action
                string actionsFilter = "";
                foreach (var action in queryOptions.Action)
                {
                    string actionFilter = TableQuery.GenerateFilterCondition(
                        "Action",
                        QueryComparisons.Equal,
                        action);
                    actionsFilter = actionsFilter.OrWhere(actionFilter);
                }
                if (!string.IsNullOrWhiteSpace(actionsFilter))
                {
                    finalFilter = finalFilter.AndWhere(actionsFilter);
                }

                //Users
                string usersFilter = "";
                foreach (var userId in queryOptions.UserId)
                {
                    string userFilter = TableQuery.GenerateFilterCondition(
                        "UserId",
                        QueryComparisons.Equal,
                        userId.ToString());
                    usersFilter = usersFilter.OrWhere(userFilter);
                }
                if (!string.IsNullOrWhiteSpace(usersFilter))
                {
                    finalFilter = finalFilter.AndWhere(usersFilter);
                }

                //Entity
                string entitesFilter = "";
                foreach (var entity in queryOptions.Entity)
                {
                    string entityFilter = TableQuery.GenerateFilterCondition(
                        "Entity",
                        QueryComparisons.Equal,
                        entity);
                    entitesFilter = entitesFilter.OrWhere(entityFilter);
                }
                if (!string.IsNullOrWhiteSpace(entitesFilter))
                {
                    finalFilter = finalFilter.AndWhere(entitesFilter);
                }

                //EntityId
                string entityIdsFilter = "";
                foreach (var entityId in queryOptions.EntityId)
                {
                    string entityIdFilter = TableQuery.GenerateFilterCondition(
                        "EntityId",
                        QueryComparisons.Equal,
                        entityId);
                    entityIdsFilter = entityIdsFilter.OrWhere(entityIdFilter);
                }
                if (!string.IsNullOrWhiteSpace(entityIdsFilter))
                {
                    finalFilter = finalFilter.AndWhere(entityIdsFilter);
                }
                //------------------------------------------------------------------------

                query.FilterString = finalFilter;
                query.TakeCount    = limit;

                var queryResult = await table.ExecuteQuerySegmentedAsync(query, token);

                entities.AddRange(queryResult.Results);

                token = queryResult.ContinuationToken;

                if (entities.Count >= limit)
                {
                    token = null;
                }
            } while (token != null);


            var items = new AuditLogItems();

            items.Limit = limit;

            items.Items = entities.Select(entity => new AuditLog()
            {
                Id       = Guid.Parse(entity.RowKey),
                Action   = entity.Action,
                Entity   = entity.Entity,
                EntityId = entity.EntityId,
                Date     = entity.Timestamp.DateTime,
                Data     = JsonSerializer.Deserialize <object>(entity.Data),
                UserId   = string.IsNullOrWhiteSpace(entity.UserId) ? null : (Guid?)Guid.Parse(entity.UserId),
            }).OrderByDescending(e => e.Date).ToList();

            return(items);
        }