using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Logging; using NPoco; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Querying; using Umbraco.Cms.Core.Persistence.Repositories; using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Infrastructure.Persistence.Dtos; using Umbraco.Cms.Infrastructure.Persistence.Factories; using Umbraco.Cms.Infrastructure.Persistence.Querying; using Umbraco.Extensions; namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement { /// /// Represents the NPoco implementation of . /// internal class AuditEntryRepository : EntityRepositoryBase, IAuditEntryRepository { /// /// Initializes a new instance of the class. /// public AuditEntryRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger) : base(scopeAccessor, cache, logger) { } /// public IEnumerable GetPage(long pageIndex, int pageCount, out long records) { Sql sql = Sql() .Select() .From() .OrderByDescending(x => x.EventDateUtc); Page page = Database.Page(pageIndex + 1, pageCount, sql); records = page.TotalItems; return page.Items.Select(AuditEntryFactory.BuildEntity); } /// public bool IsAvailable() { var tables = SqlSyntax.GetTablesInSchema(Database).ToArray(); return tables.InvariantContains(Constants.DatabaseSchema.Tables.AuditEntry); } /// protected override IAuditEntry PerformGet(int id) { Sql sql = Sql() .Select() .From() .Where(x => x.Id == id); AuditEntryDto dto = Database.FirstOrDefault(sql); return dto == null ? null : AuditEntryFactory.BuildEntity(dto); } /// protected override IEnumerable PerformGetAll(params int[] ids) { if (ids.Length == 0) { Sql sql = Sql() .Select() .From(); return Database.Fetch(sql).Select(AuditEntryFactory.BuildEntity); } var entries = new List(); foreach (IEnumerable group in ids.InGroupsOf(Constants.Sql.MaxParameterCount)) { Sql sql = Sql() .Select() .From() .WhereIn(x => x.Id, group); entries.AddRange(Database.Fetch(sql).Select(AuditEntryFactory.BuildEntity)); } return entries; } /// protected override IEnumerable PerformGetByQuery(IQuery query) { Sql sqlClause = GetBaseQuery(false); var translator = new SqlTranslator(sqlClause, query); Sql sql = translator.Translate(); return Database.Fetch(sql).Select(AuditEntryFactory.BuildEntity); } /// protected override Sql GetBaseQuery(bool isCount) { Sql sql = Sql(); sql = isCount ? sql.SelectCount() : sql.Select(); sql = sql.From(); return sql; } /// protected override string GetBaseWhereClause() => $"{Constants.DatabaseSchema.Tables.AuditEntry}.id = @id"; /// protected override IEnumerable GetDeleteClauses() => throw new NotSupportedException("Audit entries cannot be deleted."); /// protected override void PersistNewItem(IAuditEntry entity) { entity.AddingEntity(); AuditEntryDto dto = AuditEntryFactory.BuildDto(entity); Database.Insert(dto); entity.Id = dto.Id; entity.ResetDirtyProperties(); } /// protected override void PersistUpdatedItem(IAuditEntry entity) => throw new NotSupportedException("Audit entries cannot be updated."); } }