From 2cd23cb24f0771bf2eda7a8a4b3d0e81e5151caa Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 25 May 2017 02:46:21 +1000 Subject: [PATCH] Updates business logic to persist the start nodes for users --- .../Models/Rdbms/UserStartNodeDto.cs | 2 +- .../Persistence/Factories/UserFactory.cs | 4 +- .../Repositories/UserRepository.cs | 51 ++++++++++++++++++- src/umbraco.businesslogic/User.cs | 10 +--- 4 files changed, 54 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Core/Models/Rdbms/UserStartNodeDto.cs b/src/Umbraco.Core/Models/Rdbms/UserStartNodeDto.cs index e872111829..42f3e5a7ca 100644 --- a/src/Umbraco.Core/Models/Rdbms/UserStartNodeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/UserStartNodeDto.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Models.Rdbms [Column("startNodeType")] [NullSetting(NullSetting = NullSettings.NotNull)] - [Index(IndexTypes.UniqueNonClustered, ForColumns = "startNodeType, startNode", Name = "IX_umbracoUserStartNode_startNodeType")] + [Index(IndexTypes.UniqueNonClustered, ForColumns = "startNodeType, startNode, userId", Name = "IX_umbracoUserStartNode_startNodeType")] public int StartNodeType { get; set; } public enum StartNodeTypeValue diff --git a/src/Umbraco.Core/Persistence/Factories/UserFactory.cs b/src/Umbraco.Core/Persistence/Factories/UserFactory.cs index e7f2aba08b..c4154a7908 100644 --- a/src/Umbraco.Core/Persistence/Factories/UserFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/UserFactory.cs @@ -32,8 +32,8 @@ namespace Umbraco.Core.Persistence.Factories user.DisableChangeTracking(); user.Key = guidId; - user.StartContentIds = dto.UserStartNodeDtos.Where(x => x.StartNodeType == (int)UserStartNodeDto.StartNodeTypeValue.Content).Select(x => x.Id).ToArray(); - user.StartMediaIds = dto.UserStartNodeDtos.Where(x => x.StartNodeType == (int) UserStartNodeDto.StartNodeTypeValue.Media).Select(x => x.Id).ToArray(); + user.StartContentIds = dto.UserStartNodeDtos.Where(x => x.StartNodeType == (int)UserStartNodeDto.StartNodeTypeValue.Content).Select(x => x.StartNode).ToArray(); + user.StartMediaIds = dto.UserStartNodeDtos.Where(x => x.StartNodeType == (int) UserStartNodeDto.StartNodeTypeValue.Media).Select(x => x.StartNode).ToArray(); user.IsLockedOut = dto.NoConsole; user.IsApproved = dto.Disabled == false; user.Language = dto.UserLanguage; diff --git a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs index 4b05b5a47a..4f3fb1b6e7 100644 --- a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs @@ -204,6 +204,18 @@ namespace Umbraco.Core.Persistence.Repositories var id = Convert.ToInt32(Database.Insert(userDto)); entity.Id = id; + if (entity.IsPropertyDirty("StartContentIds") || entity.IsPropertyDirty("StartMediaIds")) + { + if (entity.IsPropertyDirty("StartContentIds")) + { + AddingOrUpdateStartNodes(entity, Enumerable.Empty(), UserStartNodeDto.StartNodeTypeValue.Content, entity.StartContentIds); + } + if (entity.IsPropertyDirty("StartMediaIds")) + { + AddingOrUpdateStartNodes(entity, Enumerable.Empty(), UserStartNodeDto.StartNodeTypeValue.Media, entity.StartMediaIds); + } + } + if (entity.IsPropertyDirty("Groups")) { //lookup all assigned @@ -228,7 +240,7 @@ namespace Umbraco.Core.Persistence.Repositories protected override void PersistUpdatedItem(IUser entity) { //Updates Modified date - ((User)entity).UpdatingEntity(); + ((User)entity).UpdatingEntity(); //ensure security stamp if non if (entity.SecurityStamp.IsNullOrWhiteSpace()) @@ -287,8 +299,21 @@ namespace Umbraco.Core.Persistence.Repositories Database.Update(userDto, changedCols); } + if (entity.IsPropertyDirty("StartContentIds") || entity.IsPropertyDirty("StartMediaIds")) + { + var assignedStartNodes = Database.Fetch("SELECT * FROM umbracoUserStartNode WHERE userId = @userId", new { userId = entity.Id }); + if (entity.IsPropertyDirty("StartContentIds")) + { + AddingOrUpdateStartNodes(entity, assignedStartNodes, UserStartNodeDto.StartNodeTypeValue.Content, entity.StartContentIds); + } + if (entity.IsPropertyDirty("StartMediaIds")) + { + AddingOrUpdateStartNodes(entity, assignedStartNodes, UserStartNodeDto.StartNodeTypeValue.Media, entity.StartMediaIds); + } + } + if (entity.IsPropertyDirty("Groups")) - { + { //lookup all assigned var assigned = entity.Groups == null || entity.Groups.Any() == false ? new List() @@ -312,6 +337,28 @@ namespace Umbraco.Core.Persistence.Repositories entity.ResetDirtyProperties(); } + private void AddingOrUpdateStartNodes(IEntity entity, IEnumerable current, UserStartNodeDto.StartNodeTypeValue startNodeType, int[] entityStartIds) + { + var assignedIds = current.Where(x => x.StartNodeType == (int)startNodeType).Select(x => x.StartNode).ToArray(); + + //remove the ones not assigned to the entity + var toDelete = assignedIds.Except(entityStartIds).ToArray(); + if (toDelete.Length > 0) + Database.Delete("WHERE UserId = @UserId AND startNode IN (@startNodes)", new {UserId = entity.Id, startNodes = toDelete}); + //add the ones not currently in the db + var toAdd = entityStartIds.Except(assignedIds).ToArray(); + foreach (var i in toAdd) + { + var dto = new UserStartNodeDto + { + StartNode = i, + StartNodeType = (int)startNodeType, + UserId = entity.Id + }; + Database.Insert(dto); + } + } + #endregion #region Implementation of IUserRepository diff --git a/src/umbraco.businesslogic/User.cs b/src/umbraco.businesslogic/User.cs index 75fa3d903d..114c77e340 100644 --- a/src/umbraco.businesslogic/User.cs +++ b/src/umbraco.businesslogic/User.cs @@ -718,10 +718,7 @@ namespace umbraco.BusinessLogic } set { - if (UserEntity.StartContentIds == null) - UserEntity.StartContentIds = new int[] {value}; - else if (UserEntity.StartContentIds.Contains(value) == false) - UserEntity.StartContentIds = UserEntity.StartContentIds.Concat(new[] {value}).ToArray(); + UserEntity.StartContentIds = new int[] { value }; } } @@ -735,10 +732,7 @@ namespace umbraco.BusinessLogic } set { - if (UserEntity.StartMediaIds == null) - UserEntity.StartMediaIds = new int[] { value }; - else if (UserEntity.StartMediaIds.Contains(value) == false) - UserEntity.StartMediaIds = UserEntity.StartMediaIds.Concat(new[] { value }).ToArray(); + UserEntity.StartMediaIds = new int[] { value }; } }