diff --git a/LearningHub.Nhs.WebUI/Controllers/Api/ContributeController.cs b/LearningHub.Nhs.WebUI/Controllers/Api/ContributeController.cs index b6d3a706a..8a4ee438a 100644 --- a/LearningHub.Nhs.WebUI/Controllers/Api/ContributeController.cs +++ b/LearningHub.Nhs.WebUI/Controllers/Api/ContributeController.cs @@ -668,7 +668,7 @@ private async Task RemoveBlockCollectionFiles(int resourceVersionId, BlockCollec { foreach (var oldblock in existingAttachements) { - var entry = newBlocks.FirstOrDefault(x => x.BlockType == BlockType.Media && x.MediaBlock != null && x.MediaBlock.MediaType == MediaType.Attachment && x.MediaBlock.Attachment != null && x.MediaBlock.Attachment.File?.FileId == oldblock.MediaBlock.Attachment?.File?.FileId); + var entry = newBlocks.FirstOrDefault(x => x.BlockType == BlockType.Media && x.MediaBlock != null && x.MediaBlock.MediaType == MediaType.Attachment && x.MediaBlock.Attachment != null && (x.MediaBlock.Attachment.File?.FileId == oldblock.MediaBlock.Attachment?.File?.FileId || x.MediaBlock.Attachment.File?.FilePath == oldblock.MediaBlock.Attachment?.File?.FilePath)); if (entry == null) { filePaths.Add(oldblock.MediaBlock.Attachment?.File?.FilePath); @@ -681,7 +681,7 @@ private async Task RemoveBlockCollectionFiles(int resourceVersionId, BlockCollec { foreach (var oldblock in existingVideos) { - var entry = newBlocks.FirstOrDefault(x => x.BlockType == BlockType.Media && x.MediaBlock != null && x.MediaBlock.MediaType == MediaType.Video && x.MediaBlock.Video != null && x.MediaBlock.Video.VideoFile?.File?.FileId == oldblock.MediaBlock?.Video?.VideoFile?.File?.FileId); + var entry = newBlocks.FirstOrDefault(x => x.BlockType == BlockType.Media && x.MediaBlock != null && x.MediaBlock.MediaType == MediaType.Video && x.MediaBlock.Video != null && (x.MediaBlock.Video.VideoFile?.File?.FileId == oldblock.MediaBlock?.Video?.VideoFile?.File?.FileId || x.MediaBlock.Video.VideoFile?.File?.FilePath == oldblock.MediaBlock?.Video?.VideoFile?.File?.FilePath)); if (entry == null) { if (!string.IsNullOrWhiteSpace(oldblock.MediaBlock.Video.File.FilePath)) @@ -707,7 +707,7 @@ private async Task RemoveBlockCollectionFiles(int resourceVersionId, BlockCollec { foreach (var oldblock in existingImages) { - var entry = newBlocks.FirstOrDefault(x => x.BlockType == BlockType.Media && x.MediaBlock != null && x.MediaBlock.MediaType == MediaType.Image && x.MediaBlock.Image != null && x.MediaBlock?.Image?.File?.FileId == oldblock.MediaBlock?.Image?.File?.FileId); + var entry = newBlocks.FirstOrDefault(x => x.BlockType == BlockType.Media && x.MediaBlock != null && x.MediaBlock.MediaType == MediaType.Image && x.MediaBlock.Image != null && (x.MediaBlock?.Image?.File?.FileId == oldblock.MediaBlock?.Image?.File?.FileId || x.MediaBlock?.Image?.File?.FilePath == oldblock.MediaBlock?.Image?.File?.FilePath)); if (entry == null) { filePaths.Add(oldblock?.MediaBlock?.Image?.File?.FilePath); @@ -722,7 +722,7 @@ private async Task RemoveBlockCollectionFiles(int resourceVersionId, BlockCollec { foreach (var oldblock in imageBlock?.ImageCarouselBlock?.ImageBlockCollection?.Blocks) { - var entry = newBlocks.FirstOrDefault(x => x.BlockType == BlockType.ImageCarousel && x.ImageCarouselBlock != null && x.ImageCarouselBlock.ImageBlockCollection != null && x.ImageCarouselBlock.ImageBlockCollection.Blocks != null && x.ImageCarouselBlock.ImageBlockCollection.Blocks.Where(x => x.MediaBlock?.Image?.File?.FileId == oldblock.MediaBlock?.Image?.File?.FileId).Any()); + var entry = newBlocks.FirstOrDefault(x => x.BlockType == BlockType.ImageCarousel && x.ImageCarouselBlock != null && x.ImageCarouselBlock.ImageBlockCollection != null && x.ImageCarouselBlock.ImageBlockCollection.Blocks != null && x.ImageCarouselBlock.ImageBlockCollection.Blocks.Where(x => x.MediaBlock?.Image?.File?.FileId == oldblock.MediaBlock?.Image?.File?.FileId || x.MediaBlock?.Image?.File?.FilePath == oldblock.MediaBlock?.Image?.File?.FilePath).Any()); if (entry == null) { filePaths.Add(oldblock.MediaBlock?.Image?.File?.FilePath); @@ -738,7 +738,7 @@ private async Task RemoveBlockCollectionFiles(int resourceVersionId, BlockCollec { foreach (var oldblock in wsi?.WholeSlideImageBlock?.WholeSlideImageBlockItems) { - var entry = newBlocks.FirstOrDefault(x => x.WholeSlideImageBlock != null && x.WholeSlideImageBlock.WholeSlideImageBlockItems.Where(x => x.WholeSlideImage?.File?.FileId == oldblock.WholeSlideImage?.File?.FileId).Any()); + var entry = newBlocks.FirstOrDefault(x => x.WholeSlideImageBlock != null && x.WholeSlideImageBlock.WholeSlideImageBlockItems.Where(x => x.WholeSlideImage?.File?.FileId == oldblock.WholeSlideImage?.File?.FileId || x.WholeSlideImage?.File?.FilePath == oldblock.WholeSlideImage?.File?.FilePath).Any()); if (entry == null) { filePaths.Add(oldblock.WholeSlideImage?.File?.FilePath); diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/AssessmentContentBlockCollectionGetAll.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/AssessmentContentBlockCollectionGetAll.sql new file mode 100644 index 000000000..5fd15075a --- /dev/null +++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/AssessmentContentBlockCollectionGetAll.sql @@ -0,0 +1,339 @@ +------------------------------------------------------------------------------- +-- Author Tobi Awe +-- Created 30-05-2024 +-- Purpose Get all assessment content block collections of all undeleted resource version including published(current version only) versions while excluding the version being edited. +-- +-- Modification History +-- +-- 30-05-2024 TD-3023 Initial Revision +------------------------------------------------------------------------------- +CREATE PROCEDURE [resources].[AssessmentContentBlockCollectionGetAll] ( + @excludeResourceVersionId INT +) +AS +BEGIN + -- Table to hold BlockCollectionIds + DECLARE @BlockCollectionId TABLE (Id INT); + + -- Insert BlockCollectionIds based on the provided query + INSERT INTO @BlockCollectionId (Id) + SELECT DISTINCT [c].AssessmentContentId as [BlockCollectionId] + FROM [resources].AssessmentResourceVersion AS [c] + INNER JOIN ( + SELECT [r].[Id], [r].[ResourceId], [r].[VersionStatusId] + FROM [resources].[ResourceVersion] AS [r] + WHERE [r].[Deleted] = CAST(0 AS bit) + ) AS [t] ON [c].[ResourceVersionId] = [t].[Id] + INNER JOIN ( + SELECT [r0].[Id], [r0].[CurrentResourceVersionId] + FROM [resources].[Resource] AS [r0] + WHERE [r0].[Deleted] = CAST(0 AS bit) + ) AS [t0] ON [t].[ResourceId] = [t0].[Id] + WHERE ([c].[Deleted] = CAST(0 AS bit)) + AND ((([c].[ResourceVersionId] <> @excludeResourceVersionId) + AND ([c].[Deleted] = CAST(0 AS bit))) + AND (([t].[VersionStatusId] <> 2) + OR (([t].[VersionStatusId] = 2) + AND ([t0].[CurrentResourceVersionId] = [c].[ResourceVersionId])))) + AND [c].AssessmentContentId IS NOT NULL; + + -- Table to hold results for blocks + DECLARE @BlockResult TABLE ( + Id INT, + [Order] INT, + Title NVARCHAR(200), + BlockType INT, + BlockCollectionId INT + ); + + -- Insert block data + INSERT INTO @BlockResult + SELECT Id, [Order], Title, BlockType, BlockCollectionId + FROM resources.Block + WHERE Deleted = 0 AND BlockCollectionId IN (SELECT Id FROM @BlockCollectionId); + + -- Select block data + SELECT br.Id, [Order], Title, BlockType, BlockCollectionId + FROM @BlockResult br + JOIN @BlockCollectionId bc ON br.BlockCollectionId = bc.Id; + + -- Select text block data + SELECT t.* + FROM resources.TextBlock t + INNER JOIN @BlockResult b ON b.Id = t.BlockId + WHERE t.Deleted = 0; + + -- WholeSlide Image Block + DECLARE @WsibResult TABLE ( + Id INT, + BlockId INT + ); + + INSERT INTO @WsibResult + SELECT w.Id, w.BlockId + FROM resources.WholeSlideImageBlock w + INNER JOIN @BlockResult b ON b.Id = w.BlockId + WHERE w.Deleted = 0; + + SELECT * FROM @WsibResult; + + -- WholeSlide Image Block Items + DECLARE @WsibiResult TABLE ( + Id INT, + WholeSlideImageBlockId INT, + WholeSlideImageId INT, + PlaceholderText NVARCHAR(255), + [Order] INT + ); + + INSERT INTO @WsibiResult + SELECT wi.Id, wi.WholeSlideImageBlockId, wi.WholeSlideImageId, wi.PlaceholderText, wi.[Order] + FROM resources.WholeSlideImageBlockItem wi + INNER JOIN @WsibResult w ON wi.WholeSlideImageBlockId = w.Id + WHERE wi.Deleted = 0; + + SELECT * FROM @WsibiResult; + + -- WholeSlide Image + DECLARE @WsiResult TABLE ( + Id INT, + Title NVARCHAR(1000), + FileId INT + ); + + INSERT INTO @WsiResult + SELECT wsi.Id, wsi.Title, wsi.FileId + FROM resources.WholeSlideImage wsi + INNER JOIN @WsibiResult wi ON wsi.Id = wi.WholeSlideImageId + WHERE wsi.Deleted = 0; + + SELECT * FROM @WsiResult; + + -- WholeSlide Image File + DECLARE @WsiFileResult TABLE ( + Id INT, + FileTypeId INT, + FileChunkDetailId INT, + [FileName] NVARCHAR(255), + FilePath NVARCHAR(1024), + FileSizekb INT + ); + + INSERT INTO @WsiFileResult + SELECT f.Id, f.FileTypeId, f.FileChunkDetailId, f.[FileName], f.FilePath, f.FileSizeKb + FROM resources.[File] f + INNER JOIN @WsiResult wsi ON f.Id = wsi.FileId + WHERE f.Deleted = 0; + + SELECT * FROM @WsiFileResult; + + -- WholeSlide Image File - Partial File + SELECT pf.* + FROM resources.PartialFile pf + INNER JOIN @WsiFileResult wsi ON pf.FileId = wsi.Id + WHERE pf.Deleted = 0; + + -- WholeSlide Image File - Image File + SELECT wsif.* + FROM resources.WholeSlideImageFile wsif + INNER JOIN @WsiFileResult wsi ON wsif.FileId = wsi.Id + WHERE wsif.Deleted = 0; + + -- WholeSlide Image Annotation + DECLARE @WsiaResult TABLE ( + Id INT, + WholeSlideImageId INT, + ImageId INT, + [Order] INT, + Label NVARCHAR(255), + Description NVARCHAR(1000), + PinXCoordinate DECIMAL(22,19), + PinYCoordinate DECIMAL(22,19), + Colour INT + ); + + INSERT INTO @WsiaResult + SELECT ia.Id, ia.WholeSlideImageId, ia.ImageId, ia.[Order], ia.Label, ia.Description, ia.PinXCoordinate, ia.PinYCoordinate, ia.Colour + FROM resources.ImageAnnotation ia + INNER JOIN @WsiResult wsi ON ia.WholeSlideImageId = wsi.Id + WHERE ia.Deleted = 0; + + SELECT * FROM @WsiaResult; + + -- WholeSlide Image Annotation Mark + SELECT iam.* + FROM resources.ImageAnnotationMark iam + INNER JOIN @WsiaResult wsia ON iam.ImageAnnotationId = wsia.Id + WHERE iam.Deleted = 0; + + -- Media Block + DECLARE @MediaBlockResult TABLE ( + Id INT, + BlockId INT, + MediaType INT, + AttachmentId INT, + ImageId INT, + VideoId INT + ); + + INSERT INTO @MediaBlockResult + SELECT mb.Id, mb.BlockId, mb.MediaType, mb.AttachmentId, mb.ImageId, mb.VideoId + FROM resources.MediaBlock mb + INNER JOIN @BlockResult b ON mb.BlockId = b.Id + WHERE mb.Deleted = 0; + + SELECT * FROM @MediaBlockResult; + + -- Attachment + DECLARE @AttachmentResult TABLE ( + Id INT, + FileId INT + ); + + INSERT INTO @AttachmentResult + SELECT a.Id, a.FileId + FROM resources.Attachment a + INNER JOIN @MediaBlockResult mb ON a.Id = mb.AttachmentId + WHERE a.Deleted = 0; + + SELECT * FROM @AttachmentResult; + + -- Attachment File + DECLARE @AttachmentFileResult TABLE ( + Id INT, + FileTypeId INT, + FileChunkDetailId INT, + [FileName] NVARCHAR(255), + FilePath NVARCHAR(1024), + FileSizekb INT + ); + + INSERT INTO @AttachmentFileResult + SELECT f.Id, f.FileTypeId, f.FileChunkDetailId, f.[FileName], f.FilePath, f.FileSizeKb + FROM resources.[File] f + INNER JOIN @AttachmentResult ar ON f.Id = ar.FileId + WHERE f.Deleted = 0; + + SELECT * FROM @AttachmentFileResult; + + -- Attachment File - Partial File + SELECT pf.* + FROM resources.PartialFile pf + INNER JOIN @AttachmentFileResult af ON pf.FileId = af.Id + WHERE pf.Deleted = 0; + + -- Image + DECLARE @ImageResult TABLE ( + Id INT, + FileId INT, + AltText NVARCHAR(125), + Description NVARCHAR(250) + ); + + INSERT INTO @ImageResult + SELECT i.Id, i.FileId, i.AltText, i.Description + FROM resources.Image i + INNER JOIN @MediaBlockResult mb ON i.Id = mb.ImageId + WHERE i.Deleted = 0; + + SELECT * FROM @ImageResult; + + -- Image File + DECLARE @ImageFileResult TABLE ( + Id INT, + FileTypeId INT, + FileChunkDetailId INT, + [FileName] NVARCHAR(255), + FilePath NVARCHAR(1024), + FileSizekb INT + ); + + INSERT INTO @ImageFileResult + SELECT f.Id, f.FileTypeId, f.FileChunkDetailId, f.[FileName], f.FilePath, f.FileSizeKb + FROM resources.[File] f + INNER JOIN @ImageResult ir ON f.Id = ir.FileId + WHERE f.Deleted = 0; + + SELECT * FROM @ImageFileResult; + + -- Image File - Partial File + SELECT pf.* + FROM resources.PartialFile pf + INNER JOIN @ImageFileResult ifr ON pf.FileId = ifr.Id + WHERE pf.Deleted = 0; + + -- Video + DECLARE @VideoResult TABLE ( + Id INT, + FileId INT + ); + + INSERT INTO @VideoResult + SELECT v.Id, v.FileId + FROM resources.Video v + INNER JOIN @MediaBlockResult mb ON v.Id = mb.VideoId + WHERE v.Deleted = 0; + + SELECT * FROM @VideoResult; + + -- Video File + DECLARE @VideoFileResult TABLE ( + Id INT, + FileTypeId INT, + FileChunkDetailId INT, + [FileName] NVARCHAR(255), + FilePath NVARCHAR(1024), + FileSizekb INT + ); + + INSERT INTO @VideoFileResult + SELECT f.Id, f.FileTypeId, f.FileChunkDetailId, f.[FileName], f.FilePath, f.FileSizeKb + FROM resources.[File] f + INNER JOIN @VideoResult vr ON f.Id = vr.FileId + WHERE f.Deleted = 0; + + SELECT * FROM @VideoFileResult; + + -- Video File - Partial File + SELECT pf.* + FROM resources.PartialFile pf + INNER JOIN @VideoFileResult vf ON pf.FileId = vf.Id + WHERE pf.Deleted = 0; + + -- Video File Detail + SELECT vf.* + FROM resources.VideoFile vf + INNER JOIN @VideoFileResult vfr ON vf.FileId = vfr.Id + WHERE vf.Deleted = 0; + + -- Question Block + DECLARE @QuestionResult TABLE ( + Id INT, + BlockId INT, + QuestionBlockCollectionId INT, + FeedbackBlockCollectionId INT, + QuestionType INT, + AllowReveal BIT + ); + + INSERT INTO @QuestionResult + SELECT qb.Id, qb.BlockId, qb.QuestionBlockCollectionId, qb.FeedbackBlockCollectionId, qb.QuestionType, qb.AllowReveal + FROM resources.QuestionBlock qb + INNER JOIN @BlockResult b ON qb.BlockId = b.Id + WHERE qb.Deleted = 0; + + SELECT * FROM @QuestionResult; + + -- Question Answer + SELECT qa.* + FROM resources.QuestionAnswer qa + INNER JOIN @QuestionResult qr ON qa.QuestionBlockId = qr.Id + WHERE qa.Deleted = 0; + + -- Image Carousel Block + SELECT icb.* + FROM resources.ImageCarouselBlock icb + INNER JOIN @BlockResult b ON icb.BlockId = b.Id + WHERE icb.Deleted = 0; +END +GO \ No newline at end of file diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/AssessmentGuidanceBlockCollectionGetAll.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/AssessmentGuidanceBlockCollectionGetAll.sql new file mode 100644 index 000000000..f8e96a7ba --- /dev/null +++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/AssessmentGuidanceBlockCollectionGetAll.sql @@ -0,0 +1,339 @@ +------------------------------------------------------------------------------- +-- Author Tobi Awe +-- Created 30-05-2024 +-- Purpose Get all assessment guidance block collections of all undeleted resource version including published(current version only) versions while excluding the version being edited. +-- +-- Modification History +-- +-- 30-05-2024 TD-3023 Initial Revision +------------------------------------------------------------------------------- +CREATE PROCEDURE [resources].[AssessmentGuidanceBlockCollectionGetAll] ( + @excludeResourceVersionId INT +) +AS +BEGIN + -- Table to hold BlockCollectionIds + DECLARE @BlockCollectionId TABLE (Id INT); + + -- Insert BlockCollectionIds based on the provided query + INSERT INTO @BlockCollectionId (Id) + SELECT DISTINCT [c].EndGuidanceId as [BlockCollectionId] + FROM [resources].AssessmentResourceVersion AS [c] + INNER JOIN ( + SELECT [r].[Id], [r].[ResourceId], [r].[VersionStatusId] + FROM [resources].[ResourceVersion] AS [r] + WHERE [r].[Deleted] = CAST(0 AS bit) + ) AS [t] ON [c].[ResourceVersionId] = [t].[Id] + INNER JOIN ( + SELECT [r0].[Id], [r0].[CurrentResourceVersionId] + FROM [resources].[Resource] AS [r0] + WHERE [r0].[Deleted] = CAST(0 AS bit) + ) AS [t0] ON [t].[ResourceId] = [t0].[Id] + WHERE ([c].[Deleted] = CAST(0 AS bit)) + AND ((([c].[ResourceVersionId] <> @excludeResourceVersionId) + AND ([c].[Deleted] = CAST(0 AS bit))) + AND (([t].[VersionStatusId] <> 2) + OR (([t].[VersionStatusId] = 2) + AND ([t0].[CurrentResourceVersionId] = [c].[ResourceVersionId])))) + AND [c].EndGuidanceId IS NOT NULL; + + -- Table to hold results for blocks + DECLARE @BlockResult TABLE ( + Id INT, + [Order] INT, + Title NVARCHAR(200), + BlockType INT, + BlockCollectionId INT + ); + + -- Insert block data + INSERT INTO @BlockResult + SELECT Id, [Order], Title, BlockType, BlockCollectionId + FROM resources.Block + WHERE Deleted = 0 AND BlockCollectionId IN (SELECT Id FROM @BlockCollectionId); + + -- Select block data + SELECT br.Id, [Order], Title, BlockType, BlockCollectionId + FROM @BlockResult br + JOIN @BlockCollectionId bc ON br.BlockCollectionId = bc.Id; + + -- Select text block data + SELECT t.* + FROM resources.TextBlock t + INNER JOIN @BlockResult b ON b.Id = t.BlockId + WHERE t.Deleted = 0; + + -- WholeSlide Image Block + DECLARE @WsibResult TABLE ( + Id INT, + BlockId INT + ); + + INSERT INTO @WsibResult + SELECT w.Id, w.BlockId + FROM resources.WholeSlideImageBlock w + INNER JOIN @BlockResult b ON b.Id = w.BlockId + WHERE w.Deleted = 0; + + SELECT * FROM @WsibResult; + + -- WholeSlide Image Block Items + DECLARE @WsibiResult TABLE ( + Id INT, + WholeSlideImageBlockId INT, + WholeSlideImageId INT, + PlaceholderText NVARCHAR(255), + [Order] INT + ); + + INSERT INTO @WsibiResult + SELECT wi.Id, wi.WholeSlideImageBlockId, wi.WholeSlideImageId, wi.PlaceholderText, wi.[Order] + FROM resources.WholeSlideImageBlockItem wi + INNER JOIN @WsibResult w ON wi.WholeSlideImageBlockId = w.Id + WHERE wi.Deleted = 0; + + SELECT * FROM @WsibiResult; + + -- WholeSlide Image + DECLARE @WsiResult TABLE ( + Id INT, + Title NVARCHAR(1000), + FileId INT + ); + + INSERT INTO @WsiResult + SELECT wsi.Id, wsi.Title, wsi.FileId + FROM resources.WholeSlideImage wsi + INNER JOIN @WsibiResult wi ON wsi.Id = wi.WholeSlideImageId + WHERE wsi.Deleted = 0; + + SELECT * FROM @WsiResult; + + -- WholeSlide Image File + DECLARE @WsiFileResult TABLE ( + Id INT, + FileTypeId INT, + FileChunkDetailId INT, + [FileName] NVARCHAR(255), + FilePath NVARCHAR(1024), + FileSizekb INT + ); + + INSERT INTO @WsiFileResult + SELECT f.Id, f.FileTypeId, f.FileChunkDetailId, f.[FileName], f.FilePath, f.FileSizeKb + FROM resources.[File] f + INNER JOIN @WsiResult wsi ON f.Id = wsi.FileId + WHERE f.Deleted = 0; + + SELECT * FROM @WsiFileResult; + + -- WholeSlide Image File - Partial File + SELECT pf.* + FROM resources.PartialFile pf + INNER JOIN @WsiFileResult wsi ON pf.FileId = wsi.Id + WHERE pf.Deleted = 0; + + -- WholeSlide Image File - Image File + SELECT wsif.* + FROM resources.WholeSlideImageFile wsif + INNER JOIN @WsiFileResult wsi ON wsif.FileId = wsi.Id + WHERE wsif.Deleted = 0; + + -- WholeSlide Image Annotation + DECLARE @WsiaResult TABLE ( + Id INT, + WholeSlideImageId INT, + ImageId INT, + [Order] INT, + Label NVARCHAR(255), + Description NVARCHAR(1000), + PinXCoordinate DECIMAL(22,19), + PinYCoordinate DECIMAL(22,19), + Colour INT + ); + + INSERT INTO @WsiaResult + SELECT ia.Id, ia.WholeSlideImageId, ia.ImageId, ia.[Order], ia.Label, ia.Description, ia.PinXCoordinate, ia.PinYCoordinate, ia.Colour + FROM resources.ImageAnnotation ia + INNER JOIN @WsiResult wsi ON ia.WholeSlideImageId = wsi.Id + WHERE ia.Deleted = 0; + + SELECT * FROM @WsiaResult; + + -- WholeSlide Image Annotation Mark + SELECT iam.* + FROM resources.ImageAnnotationMark iam + INNER JOIN @WsiaResult wsia ON iam.ImageAnnotationId = wsia.Id + WHERE iam.Deleted = 0; + + -- Media Block + DECLARE @MediaBlockResult TABLE ( + Id INT, + BlockId INT, + MediaType INT, + AttachmentId INT, + ImageId INT, + VideoId INT + ); + + INSERT INTO @MediaBlockResult + SELECT mb.Id, mb.BlockId, mb.MediaType, mb.AttachmentId, mb.ImageId, mb.VideoId + FROM resources.MediaBlock mb + INNER JOIN @BlockResult b ON mb.BlockId = b.Id + WHERE mb.Deleted = 0; + + SELECT * FROM @MediaBlockResult; + + -- Attachment + DECLARE @AttachmentResult TABLE ( + Id INT, + FileId INT + ); + + INSERT INTO @AttachmentResult + SELECT a.Id, a.FileId + FROM resources.Attachment a + INNER JOIN @MediaBlockResult mb ON a.Id = mb.AttachmentId + WHERE a.Deleted = 0; + + SELECT * FROM @AttachmentResult; + + -- Attachment File + DECLARE @AttachmentFileResult TABLE ( + Id INT, + FileTypeId INT, + FileChunkDetailId INT, + [FileName] NVARCHAR(255), + FilePath NVARCHAR(1024), + FileSizekb INT + ); + + INSERT INTO @AttachmentFileResult + SELECT f.Id, f.FileTypeId, f.FileChunkDetailId, f.[FileName], f.FilePath, f.FileSizeKb + FROM resources.[File] f + INNER JOIN @AttachmentResult ar ON f.Id = ar.FileId + WHERE f.Deleted = 0; + + SELECT * FROM @AttachmentFileResult; + + -- Attachment File - Partial File + SELECT pf.* + FROM resources.PartialFile pf + INNER JOIN @AttachmentFileResult af ON pf.FileId = af.Id + WHERE pf.Deleted = 0; + + -- Image + DECLARE @ImageResult TABLE ( + Id INT, + FileId INT, + AltText NVARCHAR(125), + Description NVARCHAR(250) + ); + + INSERT INTO @ImageResult + SELECT i.Id, i.FileId, i.AltText, i.Description + FROM resources.Image i + INNER JOIN @MediaBlockResult mb ON i.Id = mb.ImageId + WHERE i.Deleted = 0; + + SELECT * FROM @ImageResult; + + -- Image File + DECLARE @ImageFileResult TABLE ( + Id INT, + FileTypeId INT, + FileChunkDetailId INT, + [FileName] NVARCHAR(255), + FilePath NVARCHAR(1024), + FileSizekb INT + ); + + INSERT INTO @ImageFileResult + SELECT f.Id, f.FileTypeId, f.FileChunkDetailId, f.[FileName], f.FilePath, f.FileSizeKb + FROM resources.[File] f + INNER JOIN @ImageResult ir ON f.Id = ir.FileId + WHERE f.Deleted = 0; + + SELECT * FROM @ImageFileResult; + + -- Image File - Partial File + SELECT pf.* + FROM resources.PartialFile pf + INNER JOIN @ImageFileResult ifr ON pf.FileId = ifr.Id + WHERE pf.Deleted = 0; + + -- Video + DECLARE @VideoResult TABLE ( + Id INT, + FileId INT + ); + + INSERT INTO @VideoResult + SELECT v.Id, v.FileId + FROM resources.Video v + INNER JOIN @MediaBlockResult mb ON v.Id = mb.VideoId + WHERE v.Deleted = 0; + + SELECT * FROM @VideoResult; + + -- Video File + DECLARE @VideoFileResult TABLE ( + Id INT, + FileTypeId INT, + FileChunkDetailId INT, + [FileName] NVARCHAR(255), + FilePath NVARCHAR(1024), + FileSizekb INT + ); + + INSERT INTO @VideoFileResult + SELECT f.Id, f.FileTypeId, f.FileChunkDetailId, f.[FileName], f.FilePath, f.FileSizeKb + FROM resources.[File] f + INNER JOIN @VideoResult vr ON f.Id = vr.FileId + WHERE f.Deleted = 0; + + SELECT * FROM @VideoFileResult; + + -- Video File - Partial File + SELECT pf.* + FROM resources.PartialFile pf + INNER JOIN @VideoFileResult vf ON pf.FileId = vf.Id + WHERE pf.Deleted = 0; + + -- Video File Detail + SELECT vf.* + FROM resources.VideoFile vf + INNER JOIN @VideoFileResult vfr ON vf.FileId = vfr.Id + WHERE vf.Deleted = 0; + + -- Question Block + DECLARE @QuestionResult TABLE ( + Id INT, + BlockId INT, + QuestionBlockCollectionId INT, + FeedbackBlockCollectionId INT, + QuestionType INT, + AllowReveal BIT + ); + + INSERT INTO @QuestionResult + SELECT qb.Id, qb.BlockId, qb.QuestionBlockCollectionId, qb.FeedbackBlockCollectionId, qb.QuestionType, qb.AllowReveal + FROM resources.QuestionBlock qb + INNER JOIN @BlockResult b ON qb.BlockId = b.Id + WHERE qb.Deleted = 0; + + SELECT * FROM @QuestionResult; + + -- Question Answer + SELECT qa.* + FROM resources.QuestionAnswer qa + INNER JOIN @QuestionResult qr ON qa.QuestionBlockId = qr.Id + WHERE qa.Deleted = 0; + + -- Image Carousel Block + SELECT icb.* + FROM resources.ImageCarouselBlock icb + INNER JOIN @BlockResult b ON icb.BlockId = b.Id + WHERE icb.Deleted = 0; +END +GO \ No newline at end of file diff --git a/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/CaseBlockCollectionGetAll.sql b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/CaseBlockCollectionGetAll.sql new file mode 100644 index 000000000..710829583 --- /dev/null +++ b/WebAPI/LearningHub.Nhs.Database/Stored Procedures/Resources/CaseBlockCollectionGetAll.sql @@ -0,0 +1,339 @@ +------------------------------------------------------------------------------- +-- Author Tobi Awe +-- Created 30-05-2024 +-- Purpose Get all case content block collections of all undeleted resource version including published(current version only) versions while excluding the version being edited. +-- +-- Modification History +-- +-- 30-05-2024 TD-3023 Initial Revision +------------------------------------------------------------------------------- +CREATE PROCEDURE [resources].[CaseBlockCollectionGetAll] ( + @excludeResourceVersionId INT +) +AS +BEGIN + -- Table to hold BlockCollectionIds + DECLARE @BlockCollectionId TABLE (Id INT); + + -- Insert BlockCollectionIds based on the provided query + INSERT INTO @BlockCollectionId (Id) + SELECT DISTINCT [c].[BlockCollectionId] + FROM [resources].[CaseResourceVersion] AS [c] + INNER JOIN ( + SELECT [r].[Id], [r].[ResourceId], [r].[VersionStatusId] + FROM [resources].[ResourceVersion] AS [r] + WHERE [r].[Deleted] = CAST(0 AS bit) + ) AS [t] ON [c].[ResourceVersionId] = [t].[Id] + INNER JOIN ( + SELECT [r0].[Id], [r0].[CurrentResourceVersionId] + FROM [resources].[Resource] AS [r0] + WHERE [r0].[Deleted] = CAST(0 AS bit) + ) AS [t0] ON [t].[ResourceId] = [t0].[Id] + WHERE ([c].[Deleted] = CAST(0 AS bit)) + AND ((([c].[ResourceVersionId] <> @excludeResourceVersionId) + AND ([c].[Deleted] = CAST(0 AS bit))) + AND (([t].[VersionStatusId] <> 2) + OR (([t].[VersionStatusId] = 2) + AND ([t0].[CurrentResourceVersionId] = [c].[ResourceVersionId])))) + AND [c].[BlockCollectionId] IS NOT NULL; + + -- Table to hold results for blocks + DECLARE @BlockResult TABLE ( + Id INT, + [Order] INT, + Title NVARCHAR(200), + BlockType INT, + BlockCollectionId INT + ); + + -- Insert block data + INSERT INTO @BlockResult + SELECT Id, [Order], Title, BlockType, BlockCollectionId + FROM resources.Block + WHERE Deleted = 0 AND BlockCollectionId IN (SELECT Id FROM @BlockCollectionId); + + -- Select block data + SELECT br.Id, [Order], Title, BlockType, BlockCollectionId + FROM @BlockResult br + JOIN @BlockCollectionId bc ON br.BlockCollectionId = bc.Id; + + -- Select text block data + SELECT t.* + FROM resources.TextBlock t + INNER JOIN @BlockResult b ON b.Id = t.BlockId + WHERE t.Deleted = 0; + + -- WholeSlide Image Block + DECLARE @WsibResult TABLE ( + Id INT, + BlockId INT + ); + + INSERT INTO @WsibResult + SELECT w.Id, w.BlockId + FROM resources.WholeSlideImageBlock w + INNER JOIN @BlockResult b ON b.Id = w.BlockId + WHERE w.Deleted = 0; + + SELECT * FROM @WsibResult; + + -- WholeSlide Image Block Items + DECLARE @WsibiResult TABLE ( + Id INT, + WholeSlideImageBlockId INT, + WholeSlideImageId INT, + PlaceholderText NVARCHAR(255), + [Order] INT + ); + + INSERT INTO @WsibiResult + SELECT wi.Id, wi.WholeSlideImageBlockId, wi.WholeSlideImageId, wi.PlaceholderText, wi.[Order] + FROM resources.WholeSlideImageBlockItem wi + INNER JOIN @WsibResult w ON wi.WholeSlideImageBlockId = w.Id + WHERE wi.Deleted = 0; + + SELECT * FROM @WsibiResult; + + -- WholeSlide Image + DECLARE @WsiResult TABLE ( + Id INT, + Title NVARCHAR(1000), + FileId INT + ); + + INSERT INTO @WsiResult + SELECT wsi.Id, wsi.Title, wsi.FileId + FROM resources.WholeSlideImage wsi + INNER JOIN @WsibiResult wi ON wsi.Id = wi.WholeSlideImageId + WHERE wsi.Deleted = 0; + + SELECT * FROM @WsiResult; + + -- WholeSlide Image File + DECLARE @WsiFileResult TABLE ( + Id INT, + FileTypeId INT, + FileChunkDetailId INT, + [FileName] NVARCHAR(255), + FilePath NVARCHAR(1024), + FileSizekb INT + ); + + INSERT INTO @WsiFileResult + SELECT f.Id, f.FileTypeId, f.FileChunkDetailId, f.[FileName], f.FilePath, f.FileSizeKb + FROM resources.[File] f + INNER JOIN @WsiResult wsi ON f.Id = wsi.FileId + WHERE f.Deleted = 0; + + SELECT * FROM @WsiFileResult; + + -- WholeSlide Image File - Partial File + SELECT pf.* + FROM resources.PartialFile pf + INNER JOIN @WsiFileResult wsi ON pf.FileId = wsi.Id + WHERE pf.Deleted = 0; + + -- WholeSlide Image File - Image File + SELECT wsif.* + FROM resources.WholeSlideImageFile wsif + INNER JOIN @WsiFileResult wsi ON wsif.FileId = wsi.Id + WHERE wsif.Deleted = 0; + + -- WholeSlide Image Annotation + DECLARE @WsiaResult TABLE ( + Id INT, + WholeSlideImageId INT, + ImageId INT, + [Order] INT, + Label NVARCHAR(255), + Description NVARCHAR(1000), + PinXCoordinate DECIMAL(22,19), + PinYCoordinate DECIMAL(22,19), + Colour INT + ); + + INSERT INTO @WsiaResult + SELECT ia.Id, ia.WholeSlideImageId, ia.ImageId, ia.[Order], ia.Label, ia.Description, ia.PinXCoordinate, ia.PinYCoordinate, ia.Colour + FROM resources.ImageAnnotation ia + INNER JOIN @WsiResult wsi ON ia.WholeSlideImageId = wsi.Id + WHERE ia.Deleted = 0; + + SELECT * FROM @WsiaResult; + + -- WholeSlide Image Annotation Mark + SELECT iam.* + FROM resources.ImageAnnotationMark iam + INNER JOIN @WsiaResult wsia ON iam.ImageAnnotationId = wsia.Id + WHERE iam.Deleted = 0; + + -- Media Block + DECLARE @MediaBlockResult TABLE ( + Id INT, + BlockId INT, + MediaType INT, + AttachmentId INT, + ImageId INT, + VideoId INT + ); + + INSERT INTO @MediaBlockResult + SELECT mb.Id, mb.BlockId, mb.MediaType, mb.AttachmentId, mb.ImageId, mb.VideoId + FROM resources.MediaBlock mb + INNER JOIN @BlockResult b ON mb.BlockId = b.Id + WHERE mb.Deleted = 0; + + SELECT * FROM @MediaBlockResult; + + -- Attachment + DECLARE @AttachmentResult TABLE ( + Id INT, + FileId INT + ); + + INSERT INTO @AttachmentResult + SELECT a.Id, a.FileId + FROM resources.Attachment a + INNER JOIN @MediaBlockResult mb ON a.Id = mb.AttachmentId + WHERE a.Deleted = 0; + + SELECT * FROM @AttachmentResult; + + -- Attachment File + DECLARE @AttachmentFileResult TABLE ( + Id INT, + FileTypeId INT, + FileChunkDetailId INT, + [FileName] NVARCHAR(255), + FilePath NVARCHAR(1024), + FileSizekb INT + ); + + INSERT INTO @AttachmentFileResult + SELECT f.Id, f.FileTypeId, f.FileChunkDetailId, f.[FileName], f.FilePath, f.FileSizeKb + FROM resources.[File] f + INNER JOIN @AttachmentResult ar ON f.Id = ar.FileId + WHERE f.Deleted = 0; + + SELECT * FROM @AttachmentFileResult; + + -- Attachment File - Partial File + SELECT pf.* + FROM resources.PartialFile pf + INNER JOIN @AttachmentFileResult af ON pf.FileId = af.Id + WHERE pf.Deleted = 0; + + -- Image + DECLARE @ImageResult TABLE ( + Id INT, + FileId INT, + AltText NVARCHAR(125), + Description NVARCHAR(250) + ); + + INSERT INTO @ImageResult + SELECT i.Id, i.FileId, i.AltText, i.Description + FROM resources.Image i + INNER JOIN @MediaBlockResult mb ON i.Id = mb.ImageId + WHERE i.Deleted = 0; + + SELECT * FROM @ImageResult; + + -- Image File + DECLARE @ImageFileResult TABLE ( + Id INT, + FileTypeId INT, + FileChunkDetailId INT, + [FileName] NVARCHAR(255), + FilePath NVARCHAR(1024), + FileSizekb INT + ); + + INSERT INTO @ImageFileResult + SELECT f.Id, f.FileTypeId, f.FileChunkDetailId, f.[FileName], f.FilePath, f.FileSizeKb + FROM resources.[File] f + INNER JOIN @ImageResult ir ON f.Id = ir.FileId + WHERE f.Deleted = 0; + + SELECT * FROM @ImageFileResult; + + -- Image File - Partial File + SELECT pf.* + FROM resources.PartialFile pf + INNER JOIN @ImageFileResult ifr ON pf.FileId = ifr.Id + WHERE pf.Deleted = 0; + + -- Video + DECLARE @VideoResult TABLE ( + Id INT, + FileId INT + ); + + INSERT INTO @VideoResult + SELECT v.Id, v.FileId + FROM resources.Video v + INNER JOIN @MediaBlockResult mb ON v.Id = mb.VideoId + WHERE v.Deleted = 0; + + SELECT * FROM @VideoResult; + + -- Video File + DECLARE @VideoFileResult TABLE ( + Id INT, + FileTypeId INT, + FileChunkDetailId INT, + [FileName] NVARCHAR(255), + FilePath NVARCHAR(1024), + FileSizekb INT + ); + + INSERT INTO @VideoFileResult + SELECT f.Id, f.FileTypeId, f.FileChunkDetailId, f.[FileName], f.FilePath, f.FileSizeKb + FROM resources.[File] f + INNER JOIN @VideoResult vr ON f.Id = vr.FileId + WHERE f.Deleted = 0; + + SELECT * FROM @VideoFileResult; + + -- Video File - Partial File + SELECT pf.* + FROM resources.PartialFile pf + INNER JOIN @VideoFileResult vf ON pf.FileId = vf.Id + WHERE pf.Deleted = 0; + + -- Video File Detail + SELECT vf.* + FROM resources.VideoFile vf + INNER JOIN @VideoFileResult vfr ON vf.FileId = vfr.Id + WHERE vf.Deleted = 0; + + -- Question Block + DECLARE @QuestionResult TABLE ( + Id INT, + BlockId INT, + QuestionBlockCollectionId INT, + FeedbackBlockCollectionId INT, + QuestionType INT, + AllowReveal BIT + ); + + INSERT INTO @QuestionResult + SELECT qb.Id, qb.BlockId, qb.QuestionBlockCollectionId, qb.FeedbackBlockCollectionId, qb.QuestionType, qb.AllowReveal + FROM resources.QuestionBlock qb + INNER JOIN @BlockResult b ON qb.BlockId = b.Id + WHERE qb.Deleted = 0; + + SELECT * FROM @QuestionResult; + + -- Question Answer + SELECT qa.* + FROM resources.QuestionAnswer qa + INNER JOIN @QuestionResult qr ON qa.QuestionBlockId = qr.Id + WHERE qa.Deleted = 0; + + -- Image Carousel Block + SELECT icb.* + FROM resources.ImageCarouselBlock icb + INNER JOIN @BlockResult b ON icb.BlockId = b.Id + WHERE icb.Deleted = 0; +END +GO \ No newline at end of file diff --git a/WebAPI/LearningHub.Nhs.Repository.Interface/Resources/IBlockCollectionRepository.cs b/WebAPI/LearningHub.Nhs.Repository.Interface/Resources/IBlockCollectionRepository.cs index 0a1a52618..e24e35540 100644 --- a/WebAPI/LearningHub.Nhs.Repository.Interface/Resources/IBlockCollectionRepository.cs +++ b/WebAPI/LearningHub.Nhs.Repository.Interface/Resources/IBlockCollectionRepository.cs @@ -1,8 +1,10 @@ namespace LearningHub.Nhs.Repository.Interface.Resources { + using System; using System.Collections.Generic; using System.Threading.Tasks; using LearningHub.Nhs.Models.Entities.Resource.Blocks; + using LearningHub.Nhs.Models.Enums; /// /// The BlockRepository interface. @@ -30,5 +32,13 @@ public interface IBlockCollectionRepository : IGenericRepositoryThe Block Collection Id. /// The . Task> GetQuestionBlocks(int blockCollectionId); + + /// + /// Gets the Case, AssessmentContent, AssessmentGuidance Block Collections (including child Blocks, TextBlocks, WholeSlideImageBlocks and Files) except that of the provided resource version. + /// + /// The excluded ResourceVersion Id. + /// The resource type. + /// The . + Task> GetAllBlockCollections(int excludeResourceVersionId, ResourceTypeEnum resourceTypeEnum); } } diff --git a/WebAPI/LearningHub.Nhs.Repository/Resources/BlockCollectionRepository.cs b/WebAPI/LearningHub.Nhs.Repository/Resources/BlockCollectionRepository.cs index be2bc4f98..0f027f426 100644 --- a/WebAPI/LearningHub.Nhs.Repository/Resources/BlockCollectionRepository.cs +++ b/WebAPI/LearningHub.Nhs.Repository/Resources/BlockCollectionRepository.cs @@ -166,6 +166,37 @@ await Task.WhenAll(blockCollection.Blocks return blockCollection; } + /// + /// Gets the Case, AssessmentContent, AssessmentGuidance Block Collections (including child Blocks, TextBlocks, WholeSlideImageBlocks and Files) except that of the provided resource version. + /// + /// The excluded ResourceVersion Id. + /// The resource type. + /// The . + public async Task> GetAllBlockCollections(int excludeResourceVersionId, ResourceTypeEnum resourceTypeEnum) + { + if (resourceTypeEnum == ResourceTypeEnum.Case) + { + var caseContent = await this.GetAllCaseBlockCollections(excludeResourceVersionId); + return new Tuple(caseContent, null, null); + } + else if (resourceTypeEnum == ResourceTypeEnum.Assessment) + { + var assessmentContentTask = this.GetAllAssessmentContentBlockCollections(excludeResourceVersionId); + var assessmentGuidanceTask = this.GetAllAssessmentGuidanceBlockCollections(excludeResourceVersionId); + + await Task.WhenAll(assessmentContentTask, assessmentGuidanceTask); + + return new Tuple( + null, + await assessmentContentTask, + await assessmentGuidanceTask); + } + else + { + return new Tuple(null, null, null); + } + } + /// /// Gets the Question blocks for a particular blockCollectionId. /// @@ -416,5 +447,209 @@ private void SetAuditFieldsOnChildren(int userId, ImageCarouselBlock imageCarous this.SetAuditFieldsForCreateOrDelete(userId, imageCarouselBlock.ImageBlockCollection, isCreate); this.SetAuditFieldsOnChildren(userId, imageCarouselBlock.ImageBlockCollection, isCreate); } + + private async Task GetAllCaseBlockCollections(int excludeResourceVersionId) + { + var command = new SqlCommand + { + CommandType = CommandType.StoredProcedure, + CommandText = "[resources].[CaseBlockCollectionGetAll]", + Parameters = { new SqlParameter("@excludeResourceVersionId", SqlDbType.Int) { Value = excludeResourceVersionId } }, + }; + + var results = this.DbContext.MultipleResults(command) + .With() + .With() + .With() + .With() + .With() + .With() + .With() + .With() + .With() + .With() + .With() + .With() + .With() + .With() + .With() + .With() + .With() + .With