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.Models.Entities; using Umbraco.Cms.Core.Persistence.Querying; using Umbraco.Cms.Core.Persistence.Repositories; using Umbraco.Core.Cache; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Scoping; namespace Umbraco.Core.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) { } /// protected override Guid NodeObjectTypeId => throw new NotSupportedException(); /// protected override IAuditEntry PerformGet(int id) { var sql = Sql() .Select() .From() .Where(x => x.Id == id); var dto = Database.FirstOrDefault(sql); return dto == null ? null : AuditEntryFactory.BuildEntity(dto); } /// protected override IEnumerable PerformGetAll(params int[] ids) { if (ids.Length == 0) { var sql = Sql() .Select() .From(); return Database.Fetch(sql).Select(AuditEntryFactory.BuildEntity); } var entries = new List(); foreach (var group in ids.InGroupsOf(2000)) { var 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) { var sqlClause = GetBaseQuery(false); var translator = new SqlTranslator(sqlClause, query); var sql = translator.Translate(); return Database.Fetch(sql).Select(AuditEntryFactory.BuildEntity); } /// protected override Sql GetBaseQuery(bool isCount) { var sql = Sql(); sql = isCount ? sql.SelectCount() : sql.Select(); sql = sql.From(); return sql; } /// protected override string GetBaseWhereClause() { return $"{Cms.Core.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(); var 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."); } /// public IEnumerable GetPage(long pageIndex, int pageCount, out long records) { var sql = Sql() .Select() .From() .OrderByDescending(x => x.EventDateUtc); var 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(Cms.Core.Constants.DatabaseSchema.Tables.AuditEntry); } } }