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); }