From 080bf7293d188fe7185c7bf6f54fccb5d447c7bd Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 10 Jul 2014 12:11:47 +1000 Subject: [PATCH] replaces the tuple collection for bulk permission assignment to use a new model: EntityPermissionSet --- .../Models/Membership/EntityPermission.cs | 4 +- .../Models/Membership/EntityPermissionSet.cs | 59 +++++++++++++++++++ .../Repositories/ContentRepository.cs | 6 +- .../Repositories/PermissionRepository.cs | 16 +++-- src/Umbraco.Core/Umbraco.Core.csproj | 1 + 5 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 src/Umbraco.Core/Models/Membership/EntityPermissionSet.cs diff --git a/src/Umbraco.Core/Models/Membership/EntityPermission.cs b/src/Umbraco.Core/Models/Membership/EntityPermission.cs index 175e571fdf..7ab1ddc817 100644 --- a/src/Umbraco.Core/Models/Membership/EntityPermission.cs +++ b/src/Umbraco.Core/Models/Membership/EntityPermission.cs @@ -1,4 +1,6 @@ -namespace Umbraco.Core.Models.Membership +using System.Collections; + +namespace Umbraco.Core.Models.Membership { /// /// Represents a user -> entity permission diff --git a/src/Umbraco.Core/Models/Membership/EntityPermissionSet.cs b/src/Umbraco.Core/Models/Membership/EntityPermissionSet.cs new file mode 100644 index 0000000000..c4669caf59 --- /dev/null +++ b/src/Umbraco.Core/Models/Membership/EntityPermissionSet.cs @@ -0,0 +1,59 @@ +using System.Collections.Generic; + +namespace Umbraco.Core.Models.Membership +{ + /// + /// Represents an entity -> user & permission key value pair collection + /// + public class EntityPermissionSet + { + /// + /// The entity id with permissions assigned + /// + public int EntityId { get; private set; } + + /// + /// The key/value pairs of user id & single permission + /// + public IEnumerable UserPermissionsSet { get; private set; } + + public EntityPermissionSet(int entityId, IEnumerable userPermissionsSet) + { + EntityId = entityId; + UserPermissionsSet = userPermissionsSet; + } + + public class UserPermission + { + public UserPermission(int userId, string permission) + { + UserId = userId; + Permission = permission; + } + + public int UserId { get; private set; } + public string Permission { get; private set; } + + protected bool Equals(UserPermission other) + { + return UserId == other.UserId && string.Equals(Permission, other.Permission); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((UserPermission) obj); + } + + public override int GetHashCode() + { + unchecked + { + return (UserId*397) ^ Permission.GetHashCode(); + } + } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index 08c159481b..7d584a7322 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -296,9 +296,9 @@ namespace Umbraco.Core.Persistence.Repositories var userPermissions = ( from perm in parentPermissions from p in perm.AssignedPermissions - select new Tuple(perm.UserId, p)).ToList(); - - permissionsRepo.ReplaceEntityPermissions(entity, userPermissions); + select new EntityPermissionSet.UserPermission(perm.UserId, p)).ToList(); + + permissionsRepo.ReplaceEntityPermissions(new EntityPermissionSet(entity.Id, userPermissions)); //flag the entity's permissions changed flag so we can track those changes. //Currently only used for the cache refreshers to detect if we should refresh all user permissions cache. ((Content) entity).PermissionsChanged = true; diff --git a/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs index d3b6a586fe..e28f2a0b65 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PermissionRepository.cs @@ -191,25 +191,23 @@ namespace Umbraco.Core.Persistence.Repositories /// /// Assigns permissions to an entity for multiple users/permission entries /// - /// - /// - /// A key/value pair list containing a userId and a permission to assign + /// /// /// /// This will first clear the permissions for this entity then re-create them /// - public void ReplaceEntityPermissions(TEntity entity, IEnumerable> userPermissions) + public void ReplaceEntityPermissions(EntityPermissionSet permissionSet) { var db = _unitOfWork.Database; using (var trans = db.GetTransaction()) { - db.Execute("DELETE FROM umbracoUser2NodePermission WHERE nodeId=@nodeId", new { nodeId = entity.Id }); + db.Execute("DELETE FROM umbracoUser2NodePermission WHERE nodeId=@nodeId", new { nodeId = permissionSet.EntityId }); - var actions = userPermissions.Select(p => new User2NodePermissionDto + var actions = permissionSet.UserPermissionsSet.Select(p => new User2NodePermissionDto { - NodeId = entity.Id, - Permission = p.Item2, - UserId = p.Item1 + NodeId = permissionSet.EntityId, + Permission = p.Permission, + UserId = p.UserId }).ToArray(); _unitOfWork.Database.BulkInsertRecords(actions, trans); diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 94df94f57f..17709c7283 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -351,6 +351,7 @@ +