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

164 lines
5.5 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
2020-09-17 09:42:55 +02:00
using Microsoft.Extensions.Logging;
using NPoco;
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
{
2020-12-22 10:30:16 +11:00
internal class PublicAccessRepository : EntityRepositoryBase<Guid, PublicAccessEntry>, IPublicAccessRepository
{
2020-09-17 09:42:55 +02:00
public PublicAccessRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger<PublicAccessRepository> logger)
2017-12-14 17:04:44 +01:00
: base(scopeAccessor, cache, logger)
2016-07-18 19:26:49 +02:00
{ }
protected override IRepositoryCachePolicy<PublicAccessEntry, Guid> CreateCachePolicy()
{
return new FullDataSetRepositoryCachePolicy<PublicAccessEntry, Guid>(GlobalIsolatedCache, ScopeAccessor, GetEntityId, /*expires:*/ false);
}
protected override PublicAccessEntry PerformGet(Guid id)
{
//return from GetAll - this will be cached as a collection
2017-12-07 16:45:25 +01:00
return GetMany().FirstOrDefault(x => x.Key == id);
}
protected override IEnumerable<PublicAccessEntry> PerformGetAll(params Guid[] ids)
{
var sql = GetBaseQuery(false);
if (ids.Any())
{
2017-05-12 14:49:44 +02:00
sql.Where("umbracoAccess.id IN (@ids)", new { ids });
}
sql.OrderBy<AccessDto>(x => x.NodeId);
2020-09-17 09:42:55 +02:00
var dtos = Database.FetchOneToMany<AccessDto>(x => x.Rules, sql);
2018-06-29 14:38:50 +01:00
return dtos.Select(PublicAccessEntryFactory.BuildEntity);
}
protected override IEnumerable<PublicAccessEntry> PerformGetByQuery(IQuery<PublicAccessEntry> query)
{
var sqlClause = GetBaseQuery(false);
var translator = new SqlTranslator<PublicAccessEntry>(sqlClause, query);
var sql = translator.Translate();
2020-09-17 09:42:55 +02:00
var dtos = Database.FetchOneToMany<AccessDto>(x => x.Rules, sql);
2018-06-29 14:38:50 +01:00
return dtos.Select(PublicAccessEntryFactory.BuildEntity);
}
2017-09-22 18:48:58 +02:00
protected override Sql<ISqlContext> GetBaseQuery(bool isCount)
{
return Sql()
.SelectAll()
.From<AccessDto>()
.LeftJoin<AccessRuleDto>()
.On<AccessDto, AccessRuleDto>(left => left.Id, right => right.AccessId);
}
protected override string GetBaseWhereClause()
{
2017-11-10 11:27:12 +01:00
return "umbracoAccess.id = @id";
}
protected override IEnumerable<string> GetDeleteClauses()
{
var list = new List<string>
{
2017-11-10 11:27:12 +01:00
"DELETE FROM umbracoAccessRule WHERE accessId = @id",
"DELETE FROM umbracoAccess WHERE id = @id"
};
return list;
}
protected override void PersistNewItem(PublicAccessEntry entity)
{
entity.AddingEntity();
2017-05-12 14:49:44 +02:00
foreach (var rule in entity.Rules)
rule.AddingEntity();
2020-09-17 09:42:55 +02:00
2018-06-29 14:38:50 +01:00
var dto = PublicAccessEntryFactory.BuildDto(entity);
Database.Insert(dto);
//update the id so HasEntity is correct
entity.Id = entity.Key.GetHashCode();
foreach (var rule in dto.Rules)
{
rule.AccessId = entity.Key;
Database.Insert(rule);
}
2017-06-23 18:54:42 +02:00
//update the id so HasEntity is correct
foreach (var rule in entity.Rules)
rule.Id = rule.Key.GetHashCode();
entity.ResetDirtyProperties();
}
protected override void PersistUpdatedItem(PublicAccessEntry entity)
{
entity.UpdatingEntity();
2017-05-12 14:49:44 +02:00
foreach (var rule in entity.Rules)
{
if (rule.HasIdentity)
rule.UpdatingEntity();
else
rule.AddingEntity();
}
2020-09-17 09:42:55 +02:00
2018-06-29 14:38:50 +01:00
var dto = PublicAccessEntryFactory.BuildDto(entity);
Database.Update(dto);
2017-05-30 10:50:09 +02:00
foreach (var removedRule in entity.RemovedRules)
{
Database.Delete<AccessRuleDto>("WHERE id=@Id", new { Id = removedRule });
}
foreach (var rule in entity.Rules)
{
if (rule.HasIdentity)
{
var count = Database.Update(dto.Rules.Single(x => x.Id == rule.Key));
if (count == 0)
{
throw new InvalidOperationException("No rows were updated for the access rule");
}
}
else
{
Database.Insert(new AccessRuleDto
{
Id = rule.Key,
AccessId = dto.Id,
RuleValue = rule.RuleValue,
RuleType = rule.RuleType,
CreateDate = rule.CreateDate,
UpdateDate = rule.UpdateDate
});
//update the id so HasEntity is correct
rule.Id = rule.Key.GetHashCode();
}
}
entity.ResetDirtyProperties();
}
protected override Guid GetEntityId(PublicAccessEntry entity)
{
return entity.Key;
2017-07-20 11:21:28 +02:00
}
}
2017-07-20 11:21:28 +02:00
}