diff --git a/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.sqlproj b/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.sqlproj index c18fe1cae..48da4063a 100644 --- a/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.sqlproj +++ b/WebAPI/LearningHub.Nhs.Database/LearningHub.Nhs.Database.sqlproj @@ -548,6 +548,8 @@ + + diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditCreateNodeReference.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditCreateNodeReference.sql new file mode 100644 index 000000000..e525067ad --- /dev/null +++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditCreateNodeReference.sql @@ -0,0 +1,93 @@ +------------------------------------------------------------------------------- +-- Author Swapnamol Abraham +-- Created 18-09-2024 +-- Purpose Create node resource reference within a Hierarchy Edit. +-- +-- Modification History +-- +-- 18-09-2024 SA Initial Revision. +------------------------------------------------------------------------------- +CREATE PROCEDURE [hierarchy].[HierarchyEditCreateNodeReference] +( + @HierarchyEditDetailId int, + @MoveToHierarchyEditDetailId int, + @UserId int, + @UserTimezoneOffset int = NULL +) + +AS + +BEGIN + + BEGIN TRY + + BEGIN TRAN + + DECLARE @AmendDate datetimeoffset(7) = ISNULL(TODATETIMEOFFSET(DATEADD(mi, @UserTimezoneOffset, GETUTCDATE()), @UserTimezoneOffset), SYSDATETIMEOFFSET()) + + DECLARE @HierarchyEditId int + DECLARE @ResourceId int, @ParentNodeId INT + SELECT @HierarchyEditId = HierarchyEditId, @ResourceId = ResourceId,@ParentNodeId = ParentNodeId FROM [hierarchy].[HierarchyEditDetail] WHERE Id = @HierarchyEditDetailId + + + -- creating a folder reference into a referenced folder should affect all instances of the referenced folder. + + DECLARE @CurrentNodeId INT, + @ReferenceHierarchyEditDetailId INT + + SELECT @CurrentNodeId = hed.NodeId + FROM [hierarchy].[HierarchyEditDetail] hed + WHERE hed.Id = @MoveToHierarchyEditDetailId + AND HierarchyEditId = @HierarchyEditId + + -- Declare the cursor + + DECLARE NodeCursor CURSOR FOR + SELECT Id AS ReferenceHierarchyEditDetailId + FROM hierarchy.HierarchyEditDetail + WHERE NodeId = @CurrentNodeId + AND HierarchyEditId = @HierarchyEditId + AND deleted = 0 + -- Open the cursor + OPEN NodeCursor; + + -- Fetch the first row from the cursor + FETCH NEXT FROM NodeCursor + INTO @ReferenceHierarchyEditDetailId; + + -- Loop until no more rows are returned + WHILE @@FETCH_STATUS = 0 + BEGIN + --Execute the script to add new folder references in all referenced instances + EXEC [hierarchy].[HierarchyEditReferenceNode] @HierarchyEditDetailId, @ReferenceHierarchyEditDetailId, @UserId,@UserTimezoneOffset + + -- Fetch the next row from the cursor + FETCH NEXT FROM NodeCursor + INTO @ReferenceHierarchyEditDetailId; + END + + -- Close and deallocate the cursor + CLOSE NodeCursor; + --DEALLOCATE NodeCursor; + + COMMIT + + END TRY + BEGIN CATCH + DECLARE @ErrorMessage NVARCHAR(4000); + DECLARE @ErrorSeverity INT; + DECLARE @ErrorState INT; + + SELECT + @ErrorMessage = ERROR_MESSAGE(), + @ErrorSeverity = ERROR_SEVERITY(), + @ErrorState = ERROR_STATE(); + + IF @@TRANCOUNT > 0 + ROLLBACK TRAN; + + RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState); + + END CATCH +END +Go \ No newline at end of file diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditCreateResourceReference.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditCreateResourceReference.sql new file mode 100644 index 000000000..f07690cd0 --- /dev/null +++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditCreateResourceReference.sql @@ -0,0 +1,93 @@ +------------------------------------------------------------------------------- +-- Author Swapnamol Abraham +-- Created 18-09-2024 +-- Purpose Create a resource reference within a Hierarchy Edit. +-- +-- Modification History +-- +-- 18-09-2024 SA Initial Revision. +------------------------------------------------------------------------------- +CREATE PROCEDURE [hierarchy].[HierarchyEditCreateResourceReference] +( + @HierarchyEditDetailId int, + @MoveToHierarchyEditDetailId int, + @UserId int, + @UserTimezoneOffset int = NULL +) + +AS + +BEGIN + + BEGIN TRY + + BEGIN TRAN + + DECLARE @AmendDate datetimeoffset(7) = ISNULL(TODATETIMEOFFSET(DATEADD(mi, @UserTimezoneOffset, GETUTCDATE()), @UserTimezoneOffset), SYSDATETIMEOFFSET()) + + DECLARE @HierarchyEditId int + DECLARE @ResourceId int, @ParentNodeId INT + SELECT @HierarchyEditId = HierarchyEditId, @ResourceId = ResourceId,@ParentNodeId = ParentNodeId FROM [hierarchy].[HierarchyEditDetail] WHERE Id = @HierarchyEditDetailId + + + -- creating a resource reference into a referenced folder should affect all instances of the referenced folder + + DECLARE @CurrentNodeId INT, + @ReferenceHierarchyEditDetailId INT + + SELECT @CurrentNodeId = hed.NodeId + FROM [hierarchy].[HierarchyEditDetail] hed + WHERE hed.Id = @MoveToHierarchyEditDetailId + AND HierarchyEditId = @HierarchyEditId + + -- Declare the cursor + + DECLARE NodeCursor CURSOR FOR + SELECT Id AS ReferenceHierarchyEditDetailId + FROM hierarchy.HierarchyEditDetail + WHERE NodeId = @CurrentNodeId + AND HierarchyEditId = @HierarchyEditId + AND deleted = 0 + -- Open the cursor + OPEN NodeCursor; + + -- Fetch the first row from the cursor + FETCH NEXT FROM NodeCursor + INTO @ReferenceHierarchyEditDetailId; + + -- Loop until no more rows are returned + WHILE @@FETCH_STATUS = 0 + BEGIN + -- Execute the update statement for the current row + EXEC [hierarchy].[HierarchyEditReferenceResource] @HierarchyEditDetailId, @ReferenceHierarchyEditDetailId, @UserId,@UserTimezoneOffset + + -- Fetch the next row from the cursor + FETCH NEXT FROM NodeCursor + INTO @ReferenceHierarchyEditDetailId; + END + + -- Close and deallocate the cursor + CLOSE NodeCursor; + DEALLOCATE NodeCursor; + + COMMIT + + END TRY + BEGIN CATCH + DECLARE @ErrorMessage NVARCHAR(4000); + DECLARE @ErrorSeverity INT; + DECLARE @ErrorState INT; + + SELECT + @ErrorMessage = ERROR_MESSAGE(), + @ErrorSeverity = ERROR_SEVERITY(), + @ErrorState = ERROR_STATE(); + + IF @@TRANCOUNT > 0 + ROLLBACK TRAN; + + RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState); + + END CATCH +END +GO \ No newline at end of file diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditPublish.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditPublish.sql index 32c0f74e0..6ae6d9325 100644 --- a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditPublish.sql +++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditPublish.sql @@ -132,20 +132,24 @@ BEGIN -- UPDATE NodeLink 'deleted' for remove reference - UPDATE - nl - SET - Deleted = 1, - AmendUserId = @AmendUserId, - AmendDate = @AmendDate - FROM - hierarchy.HierarchyEditDetail hed - INNER JOIN - hierarchy.NodeLink nl ON hed.NodeLinkId = nl.Id - WHERE - HierarchyEditId = @HierarchyEditId - AND hed.HierarchyEditDetailTypeId = 4 -- Node Link - AND hed.Deleted = 1 + UPDATE nl + SET nl.Deleted = 1 + FROM hierarchy.NodeLink nl + INNER JOIN ( + SELECT hed.NodeLinkId + FROM hierarchy.HierarchyEditDetail hed + WHERE hed.HierarchyEditId = @HierarchyEditId + AND hed.Deleted = 1 + --Only include rows where no corresponding non-deleted row exists + AND NOT EXISTS ( + SELECT 1 + FROM hierarchy.HierarchyEditDetail hed2 + WHERE hed2.HierarchyEditId = @HierarchyEditId + AND hed2.Deleted = 0 + AND hed2.NodeLinkId = hed.NodeLinkId + ) + ) AS filtered + ON nl.Id = filtered.NodeLinkId -- For moved nodes, delete the original NodeLinks, providing they have not been used (by a reference to the original position). UPDATE diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditReferenceNode.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditReferenceNode.sql index d697061a2..1bf4f5b7e 100644 --- a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditReferenceNode.sql +++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Hierarchy/HierarchyEditReferenceNode.sql @@ -8,6 +8,7 @@ -- 29-04-2024 DB Initial Revision. -- 13-05-2024 DB Set the parent node path id for the new reference node. -- 08-07-2024 DB Populate the PrimaryCatalogueNodeId. +-- 24-09-2024 SA Correct the display order of the referenced folder. ------------------------------------------------------------------------------- CREATE PROCEDURE [hierarchy].[HierarchyEditReferenceNode] ( @@ -49,24 +50,18 @@ BEGIN WHERE Id = @ReferenceToHierarchyEditDetailId -- Increment display order of nodes in destination. - UPDATE - hed_moveTo_children - SET - HierarchyEditDetailOperationId = CASE WHEN hed_moveTo_children.HierarchyEditDetailOperationId IS NULL THEN 2 ELSE hed_moveTo_children.HierarchyEditDetailOperationId END, - DisplayOrder = hed_moveTo_children.DisplayOrder + 1, + UPDATE + [hierarchy].[HierarchyEditDetail] + SET + HierarchyEditDetailOperationId = CASE WHEN HierarchyEditDetailOperationId IS NULL THEN 2 ELSE HierarchyEditDetailOperationId END, + DisplayOrder = DisplayOrder + 1, AmendDate = @AmendDate - FROM - [hierarchy].[HierarchyEditDetail] hed_moveTo - INNER JOIN - [hierarchy].[HierarchyEditDetail] hed_moveTo_children ON hed_moveTo_children.HierarchyEditId = hed_moveTo.HierarchyEditId - AND hed_moveTo_children.ParentNodeId = hed_moveTo.NodeId - AND ISNULL(hed_moveTo_children.HierarchyEditDetailOperationId, 0) != 3 -- ignore deletes. - WHERE - hed_moveTo.Id = @ReferenceToHierarchyEditDetailId - AND hed_moveTo.ResourceId IS NULL - AND hed_moveTo.Deleted = 0 - AND hed_moveTo_children.Deleted = 0 - + where + HierarchyEditId = @HierarchyEditId AND + ParentNodeId = @NewParentNodeId + and ParentNodePathId = @NewParentNodePathId + AND ISNULL(HierarchyEditDetailOperationId, 0) != 3 + AND Deleted = 0 -- Create the new Hierarchy Edit Detail records for the reference nodes and resources. DECLARE @OriginalNodePath NVARCHAR(256) @@ -98,7 +93,7 @@ BEGIN ResourceVersionId, NULL AS ResourceReferenceId, -- Populated further down NodeResourceId, - DisplayOrder, + 1, NULL AS InitialNodePath, @DestinationParentNodePath + SUBSTRING(ISNULL(NewNodePath, InitialNodePath), LEN(@OriginalParentNodePath)+1, LEN(ISNULL(NewNodePath, InitialNodePath))) AS NewNodePath, -- Not using REPLACE incase number of digits in nodeIds are not consistant 0 AS Deleted, diff --git a/WebAPI/LearningHub.Nhs.Repository/Hierarchy/HierarchyEditRepository.cs b/WebAPI/LearningHub.Nhs.Repository/Hierarchy/HierarchyEditRepository.cs index be0fc8455..21524cf76 100644 --- a/WebAPI/LearningHub.Nhs.Repository/Hierarchy/HierarchyEditRepository.cs +++ b/WebAPI/LearningHub.Nhs.Repository/Hierarchy/HierarchyEditRepository.cs @@ -253,7 +253,7 @@ public async Task ReferenceNode(MoveNodeViewModel moveNodeViewModel, int userId) var param3 = new SqlParameter("@p2", SqlDbType.Int) { Value = userId }; var param2 = new SqlParameter("@p3", SqlDbType.Int) { Value = this.TimezoneOffsetManager.UserTimezoneOffset ?? (object)DBNull.Value }; - string sql = "hierarchy.HierarchyEditReferenceNode @p0, @p1, @p2, @p3"; + string sql = "hierarchy.HierarchyEditCreateNodeReference @p0, @p1, @p2, @p3"; var sqlParams = new List() { param0, param1, param2, param3 }; await this.DbContext.Database.ExecuteSqlRawAsync(sql, sqlParams); @@ -336,7 +336,7 @@ public async Task HierarchyEditReferenceResource(HierarchyEditMoveResourceViewMo var param2 = new SqlParameter("@p2", SqlDbType.Int) { Value = userId }; var param3 = new SqlParameter("@p3", SqlDbType.Int) { Value = this.TimezoneOffsetManager.UserTimezoneOffset ?? (object)DBNull.Value }; - string sql = "hierarchy.HierarchyEditReferenceResource @p0, @p1, @p2, @p3"; + string sql = "hierarchy.HierarchyEditCreateResourceReference @p0, @p1, @p2, @p3"; var sqlParams = new List() { param0, param1, param2, param3 }; await this.DbContext.Database.ExecuteSqlRawAsync(sql, sqlParams);