Files
Umbraco-CMS/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/PublicAccessRepository.cs
Shannon e4807c2430 New table and service to store auth tokens
Implements the auth token retrieval and storage for the identity implementation. This is now automatically done for providers and the back office user manager can be used to retreive and store all tokens.

Fixes locking on the config writer.

Removes the abstract NodeObjectTypeId from the base repo since it shouldn't be there.
2021-03-11 19:35:43 +11:00

164 lines
5.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
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
{
internal class PublicAccessRepository : EntityRepositoryBase<Guid, PublicAccessEntry>, IPublicAccessRepository
{
public PublicAccessRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger<PublicAccessRepository> logger)
: base(scopeAccessor, cache, logger)
{ }
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
return GetMany().FirstOrDefault(x => x.Key == id);
}
protected override IEnumerable<PublicAccessEntry> PerformGetAll(params Guid[] ids)
{
var sql = GetBaseQuery(false);
if (ids.Any())
{
sql.Where("umbracoAccess.id IN (@ids)", new { ids });
}
sql.OrderBy<AccessDto>(x => x.NodeId);
var dtos = Database.FetchOneToMany<AccessDto>(x => x.Rules, sql);
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();
var dtos = Database.FetchOneToMany<AccessDto>(x => x.Rules, sql);
return dtos.Select(PublicAccessEntryFactory.BuildEntity);
}
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()
{
return "umbracoAccess.id = @id";
}
protected override IEnumerable<string> GetDeleteClauses()
{
var list = new List<string>
{
"DELETE FROM umbracoAccessRule WHERE accessId = @id",
"DELETE FROM umbracoAccess WHERE id = @id"
};
return list;
}
protected override void PersistNewItem(PublicAccessEntry entity)
{
entity.AddingEntity();
foreach (var rule in entity.Rules)
rule.AddingEntity();
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);
}
//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();
foreach (var rule in entity.Rules)
{
if (rule.HasIdentity)
rule.UpdatingEntity();
else
rule.AddingEntity();
}
var dto = PublicAccessEntryFactory.BuildDto(entity);
Database.Update(dto);
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;
}
}
}