using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Logging; using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Exceptions; using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement { /// /// Simple abstract ReadOnly repository used to simply have PerformGet and PeformGetAll with an underlying cache /// internal abstract class SimpleGetRepository : NPocoRepositoryBase where TEntity : class, IEntity where TDto: class { protected SimpleGetRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger> logger) : base(scopeAccessor, cache, logger) { } protected abstract TEntity ConvertToEntity(TDto dto); protected abstract object GetBaseWhereClauseArguments(TId id); protected abstract string GetWhereInClauseForGetAll(); protected virtual IEnumerable PerformFetch(Sql sql) { return Database.Fetch(sql); } protected override TEntity PerformGet(TId id) { var sql = GetBaseQuery(false); sql.Where(GetBaseWhereClause(), GetBaseWhereClauseArguments(id)); var dto = PerformFetch(sql).FirstOrDefault(); if (dto == null) return null; var entity = ConvertToEntity(dto); if (entity is EntityBase dirtyEntity) { // reset dirty initial properties (U4-1946) dirtyEntity.ResetDirtyProperties(false); } return entity; } protected override IEnumerable PerformGetAll(params TId[] ids) { var sql = Sql().From(); if (ids.Any()) { sql.Where(GetWhereInClauseForGetAll(), new { /*ids =*/ ids }); } return Database.Fetch(sql).Select(ConvertToEntity); } protected sealed override IEnumerable PerformGetByQuery(IQuery query) { var sqlClause = GetBaseQuery(false); var translator = new SqlTranslator(sqlClause, query); var sql = translator.Translate(); return Database.Fetch(sql).Select(ConvertToEntity); } #region Not implemented and not required protected sealed override IEnumerable GetDeleteClauses() { throw new InvalidOperationException("This method won't be implemented."); } protected sealed override Guid NodeObjectTypeId => throw new InvalidOperationException("This property won't be implemented."); protected sealed override void PersistNewItem(TEntity entity) { throw new InvalidOperationException("This method won't be implemented."); } protected sealed override void PersistUpdatedItem(TEntity entity) { throw new InvalidOperationException("This method won't be implemented."); } #endregion } }