2021-03-11 19:35:43 +11:00
|
|
|
using System;
|
2015-01-27 19:47:30 +11:00
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
2020-09-17 09:42:55 +02:00
|
|
|
using Microsoft.Extensions.Logging;
|
2016-04-12 15:11:07 +02:00
|
|
|
using NPoco;
|
2021-02-09 10:22:42 +01:00
|
|
|
using Umbraco.Cms.Core.Cache;
|
|
|
|
|
using Umbraco.Cms.Core.Models;
|
|
|
|
|
using Umbraco.Cms.Core.Persistence.Querying;
|
2021-02-12 13:36:50 +01:00
|
|
|
using Umbraco.Cms.Core.Persistence.Repositories;
|
2021-02-15 11:41:12 +01:00
|
|
|
using Umbraco.Cms.Core.Scoping;
|
2021-02-12 13:36:50 +01:00
|
|
|
using Umbraco.Cms.Infrastructure.Persistence.Dtos;
|
|
|
|
|
using Umbraco.Cms.Infrastructure.Persistence.Factories;
|
|
|
|
|
using Umbraco.Cms.Infrastructure.Persistence.Querying;
|
2021-02-09 13:32:34 +01:00
|
|
|
using Umbraco.Extensions;
|
2015-01-27 19:47:30 +11:00
|
|
|
|
2021-02-12 13:36:50 +01:00
|
|
|
namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement
|
2015-01-27 19:47:30 +11:00
|
|
|
{
|
2020-12-22 10:30:16 +11:00
|
|
|
internal class PublicAccessRepository : EntityRepositoryBase<Guid, PublicAccessEntry>, IPublicAccessRepository
|
2015-01-27 19:47:30 +11:00
|
|
|
{
|
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
|
|
|
{ }
|
2016-01-07 16:31:20 +01:00
|
|
|
|
2017-12-15 16:29:14 +01:00
|
|
|
protected override IRepositoryCachePolicy<PublicAccessEntry, Guid> CreateCachePolicy()
|
2015-01-27 19:47:30 +11:00
|
|
|
{
|
2017-12-15 16:29:14 +01:00
|
|
|
return new FullDataSetRepositoryCachePolicy<PublicAccessEntry, Guid>(GlobalIsolatedCache, ScopeAccessor, GetEntityId, /*expires:*/ false);
|
2015-01-27 19:47:30 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override PublicAccessEntry PerformGet(Guid id)
|
|
|
|
|
{
|
2016-01-07 12:03:32 +01:00
|
|
|
//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);
|
2015-01-27 19:47:30 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 });
|
2015-01-27 19:47:30 +11:00
|
|
|
}
|
|
|
|
|
|
2016-11-03 10:31:44 +01:00
|
|
|
sql.OrderBy<AccessDto>(x => x.NodeId);
|
2020-09-17 09:42:55 +02:00
|
|
|
|
2016-04-12 15:11:07 +02:00
|
|
|
var dtos = Database.FetchOneToMany<AccessDto>(x => x.Rules, sql);
|
2018-06-29 14:38:50 +01:00
|
|
|
return dtos.Select(PublicAccessEntryFactory.BuildEntity);
|
2015-01-27 19:47:30 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
2016-04-12 15:11:07 +02:00
|
|
|
var dtos = Database.FetchOneToMany<AccessDto>(x => x.Rules, sql);
|
2018-06-29 14:38:50 +01:00
|
|
|
return dtos.Select(PublicAccessEntryFactory.BuildEntity);
|
2015-01-27 19:47:30 +11:00
|
|
|
}
|
|
|
|
|
|
2017-09-22 18:48:58 +02:00
|
|
|
protected override Sql<ISqlContext> GetBaseQuery(bool isCount)
|
2015-01-27 19:47:30 +11:00
|
|
|
{
|
2016-04-12 15:11:07 +02:00
|
|
|
return Sql()
|
|
|
|
|
.SelectAll()
|
|
|
|
|
.From<AccessDto>()
|
|
|
|
|
.LeftJoin<AccessRuleDto>()
|
|
|
|
|
.On<AccessDto, AccessRuleDto>(left => left.Id, right => right.AccessId);
|
2015-01-27 19:47:30 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override string GetBaseWhereClause()
|
|
|
|
|
{
|
2017-11-10 11:27:12 +01:00
|
|
|
return "umbracoAccess.id = @id";
|
2015-01-27 19:47:30 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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"
|
2015-01-27 19:47:30 +11:00
|
|
|
};
|
|
|
|
|
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);
|
2015-01-27 19:47:30 +11:00
|
|
|
|
|
|
|
|
Database.Insert(dto);
|
2015-01-28 18:24:12 +11:00
|
|
|
//update the id so HasEntity is correct
|
|
|
|
|
entity.Id = entity.Key.GetHashCode();
|
2015-01-27 19:47:30 +11:00
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
|
2015-01-27 19:47:30 +11:00
|
|
|
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);
|
2015-01-27 19:47:30 +11:00
|
|
|
|
|
|
|
|
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 });
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-27 19:47:30 +11:00
|
|
|
foreach (var rule in entity.Rules)
|
|
|
|
|
{
|
|
|
|
|
if (rule.HasIdentity)
|
|
|
|
|
{
|
2015-01-28 18:24:12 +11:00
|
|
|
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");
|
|
|
|
|
}
|
2015-01-27 19:47:30 +11:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Database.Insert(new AccessRuleDto
|
|
|
|
|
{
|
2015-01-28 18:24:12 +11:00
|
|
|
Id = rule.Key,
|
2015-01-28 13:16:50 +11:00
|
|
|
AccessId = dto.Id,
|
|
|
|
|
RuleValue = rule.RuleValue,
|
|
|
|
|
RuleType = rule.RuleType,
|
2015-01-27 19:47:30 +11:00
|
|
|
CreateDate = rule.CreateDate,
|
|
|
|
|
UpdateDate = rule.UpdateDate
|
|
|
|
|
});
|
2015-01-28 18:24:12 +11:00
|
|
|
//update the id so HasEntity is correct
|
|
|
|
|
rule.Id = rule.Key.GetHashCode();
|
2015-01-27 19:47:30 +11:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
entity.ResetDirtyProperties();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override Guid GetEntityId(PublicAccessEntry entity)
|
|
|
|
|
{
|
|
|
|
|
return entity.Key;
|
2017-07-20 11:21:28 +02:00
|
|
|
}
|
2015-01-27 19:47:30 +11:00
|
|
|
}
|
2017-07-20 11:21:28 +02:00
|
|
|
}
|