Files
Umbraco-CMS/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/AuditRepository.cs

188 lines
6.9 KiB
C#
Raw Normal View History

2017-07-20 11:21:28 +02:00
using System;
using System.Collections.Generic;
using System.Linq;
using NPoco;
using Umbraco.Core.Cache;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
2018-03-22 11:24:12 +01:00
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
2017-12-28 09:06:33 +01:00
using Umbraco.Core.Persistence.Dtos;
using Umbraco.Core.Persistence.Querying;
2017-12-12 15:04:13 +01:00
using Umbraco.Core.Scoping;
2017-12-07 16:45:25 +01:00
namespace Umbraco.Core.Persistence.Repositories.Implement
{
2018-03-22 11:24:12 +01:00
internal class AuditRepository : NPocoRepositoryBase<int, IAuditItem>, IAuditRepository
{
2018-07-13 12:11:00 +02:00
public AuditRepository(IScopeAccessor scopeAccessor, ILogger logger)
2019-01-17 08:34:29 +01:00
: base(scopeAccessor, AppCaches.NoCache, logger)
2017-09-22 18:28:21 +02:00
{ }
2018-03-22 11:24:12 +01:00
protected override void PersistNewItem(IAuditItem entity)
{
2017-11-10 11:27:12 +01:00
Database.Insert(new LogDto
{
Comment = entity.Comment,
Datestamp = DateTime.Now,
Header = entity.AuditType.ToString(),
NodeId = entity.Id,
UserId = entity.UserId,
EntityType = entity.EntityType,
Parameters = entity.Parameters
2017-11-10 11:27:12 +01:00
});
}
2017-07-20 11:21:28 +02:00
2018-03-22 11:24:12 +01:00
protected override void PersistUpdatedItem(IAuditItem entity)
{
// inserting when updating because we never update a log entry, perhaps this should throw?
Database.Insert(new LogDto
{
Comment = entity.Comment,
Datestamp = DateTime.Now,
Header = entity.AuditType.ToString(),
NodeId = entity.Id,
UserId = entity.UserId,
EntityType = entity.EntityType,
Parameters = entity.Parameters
});
}
2018-03-22 11:24:12 +01:00
protected override IAuditItem PerformGet(int id)
{
var sql = GetBaseQuery(false);
sql.Where(GetBaseWhereClause(), new { Id = id });
var dto = Database.First<LogDto>(sql);
2018-03-22 11:24:12 +01:00
return dto == null
? null
: new AuditItem(dto.NodeId, Enum<AuditType>.Parse(dto.Header), dto.UserId ?? Constants.Security.UnknownUserId, dto.EntityType, dto.Comment, dto.Parameters);
}
2018-03-22 11:24:12 +01:00
protected override IEnumerable<IAuditItem> PerformGetAll(params int[] ids)
{
throw new NotImplementedException();
}
2018-03-22 11:24:12 +01:00
protected override IEnumerable<IAuditItem> PerformGetByQuery(IQuery<IAuditItem> query)
{
var sqlClause = GetBaseQuery(false);
2018-03-22 11:24:12 +01:00
var translator = new SqlTranslator<IAuditItem>(sqlClause, query);
var sql = translator.Translate();
var dtos = Database.Fetch<LogDto>(sql);
return dtos.Select(x => new AuditItem(x.NodeId, Enum<AuditType>.Parse(x.Header), x.UserId ?? Constants.Security.UnknownUserId, x.EntityType, x.Comment, x.Parameters)).ToList();
}
2019-04-15 16:30:46 +02:00
public IEnumerable<IAuditItem> Get(AuditType type, IQuery<IAuditItem> query)
{
var sqlClause = GetBaseQuery(false)
.Where("(logHeader=@0)", type.ToString());
2019-04-15 16:30:46 +02:00
var translator = new SqlTranslator<IAuditItem>(sqlClause, query);
var sql = translator.Translate();
var dtos = Database.Fetch<LogDto>(sql);
return dtos.Select(x => new AuditItem(x.NodeId, Enum<AuditType>.Parse(x.Header), x.UserId ?? Constants.Security.UnknownUserId, x.EntityType, x.Comment, x.Parameters)).ToList();
}
2017-09-22 18:48:58 +02:00
protected override Sql<ISqlContext> GetBaseQuery(bool isCount)
{
2017-09-22 18:28:21 +02:00
var sql = SqlContext.Sql();
sql = isCount
? sql.SelectCount()
: sql.Select<LogDto>();
sql
.From<LogDto>();
2018-03-22 11:24:12 +01:00
if (!isCount)
sql.LeftJoin<UserDto>().On<LogDto, UserDto>((left, right) => left.UserId == right.Id);
return sql;
}
protected override string GetBaseWhereClause()
{
2017-11-10 11:27:12 +01:00
return "id = @id";
}
protected override IEnumerable<string> GetDeleteClauses()
{
throw new NotImplementedException();
}
protected override Guid NodeObjectTypeId
{
get { throw new NotImplementedException(); }
}
public void CleanLogs(int maximumAgeOfLogsInMinutes)
{
var oldestPermittedLogEntry = DateTime.Now.Subtract(new TimeSpan(0, maximumAgeOfLogsInMinutes, 0));
Database.Execute(
"delete from umbracoLog where datestamp < @oldestPermittedLogEntry and logHeader in ('open','system')",
new {oldestPermittedLogEntry = oldestPermittedLogEntry});
}
2018-03-22 11:24:12 +01:00
/// <summary>
/// Return the audit items as paged result
/// </summary>
/// <param name="query">
/// The query coming from the service
/// </param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="totalRecords"></param>
/// <param name="orderDirection"></param>
/// <param name="auditTypeFilter">
/// Since we currently do not have enum support with our expression parser, we cannot query on AuditType in the query or the custom filter
/// so we need to do that here
/// </param>
/// <param name="customFilter">
/// A user supplied custom filter
/// </param>
/// <returns></returns>
public IEnumerable<IAuditItem> GetPagedResultsByQuery(IQuery<IAuditItem> query, long pageIndex, int pageSize,
out long totalRecords, Direction orderDirection,
AuditType[] auditTypeFilter,
IQuery<IAuditItem> customFilter)
{
if (auditTypeFilter == null) auditTypeFilter = Array.Empty<AuditType>();
var sql = GetBaseQuery(false);
var translator = new SqlTranslator<IAuditItem>(sql, query ?? Query<IAuditItem>());
sql = translator.Translate();
if (customFilter != null)
foreach (var filterClause in customFilter.GetWhereClauses())
sql.Where(filterClause.Item1, filterClause.Item2);
if (auditTypeFilter.Length > 0)
foreach (var type in auditTypeFilter)
sql.Where("(logHeader=@0)", type.ToString());
sql = orderDirection == Direction.Ascending
? sql.OrderBy("Datestamp")
: sql.OrderByDescending("Datestamp");
// get page
var page = Database.Page<LogDto>(pageIndex + 1, pageSize, sql);
totalRecords = page.TotalItems;
var items = page.Items.Select(
dto => new AuditItem(dto.NodeId, Enum<AuditType>.ParseOrNull(dto.Header) ?? AuditType.Custom, dto.UserId ?? Constants.Security.UnknownUserId, dto.EntityType, dto.Comment, dto.Parameters)).ToList();
2018-03-22 11:24:12 +01:00
// map the DateStamp
for (var i = 0; i < items.Count; i++)
2018-03-22 11:24:12 +01:00
items[i].CreateDate = page.Items[i].Datestamp;
return items;
}
}
2017-07-20 11:21:28 +02:00
}