PlotDirector/PlotLine/Sql/149_Phase24_LeanImportCompletionNotifications.sql

123 lines
3.7 KiB
Transact-SQL

SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
IF COL_LENGTH(N'dbo.StoryIntelligenceBookPipelines', N'CompletionEmailQueuedUtc') IS NULL
BEGIN
ALTER TABLE dbo.StoryIntelligenceBookPipelines
ADD CompletionEmailQueuedUtc datetime2 NULL;
END;
GO
IF COL_LENGTH(N'dbo.StoryIntelligenceBookPipelines', N'FailureEmailQueuedUtc') IS NULL
BEGIN
ALTER TABLE dbo.StoryIntelligenceBookPipelines
ADD FailureEmailQueuedUtc datetime2 NULL;
END;
GO
CREATE OR ALTER PROCEDURE dbo.StoryIntelligenceBookPipeline_TryBeginCompletionNotification
@BookID int,
@UserID int
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @ImportSessionID int;
DECLARE @ProjectID int;
DECLARE @HasActiveRuns bit;
DECLARE @HasFailedRuns bit;
DECLARE @ChapterCount int;
DECLARE @CompletedChapterCount int;
DECLARE @FailedChapterCount int;
DECLARE @NotificationKind nvarchar(20);
SELECT @ImportSessionID = p.StoryIntelligenceBookPipelineID,
@ProjectID = p.ProjectID
FROM dbo.StoryIntelligenceBookPipelines p
INNER JOIN dbo.ProjectUserAccess access ON access.ProjectID = p.ProjectID
AND access.UserID = @UserID
AND access.IsActive = 1
WHERE p.BookID = @BookID;
IF @ImportSessionID IS NULL
RETURN;
SELECT @HasActiveRuns = CASE WHEN EXISTS
(
SELECT 1
FROM dbo.StoryIntelligenceRuns
WHERE BookID = @BookID
AND UserID = @UserID
AND Status IN (N'Pending', N'Running')
) THEN 1 ELSE 0 END;
IF @HasActiveRuns = 1
RETURN;
SELECT @ChapterCount = COUNT(1),
@CompletedChapterCount = SUM(CASE WHEN Status IN (N'Completed', N'CompletedWithWarnings') THEN 1 ELSE 0 END),
@FailedChapterCount = SUM(CASE WHEN Status IN (N'Failed', N'Cancelled') THEN 1 ELSE 0 END),
@HasFailedRuns = CASE WHEN SUM(CASE WHEN Status IN (N'Failed', N'Cancelled') THEN 1 ELSE 0 END) > 0 THEN 1 ELSE 0 END
FROM dbo.StoryIntelligenceRuns
WHERE BookID = @BookID
AND UserID = @UserID;
IF COALESCE(@ChapterCount, 0) = 0
RETURN;
SET @NotificationKind = CASE WHEN @HasFailedRuns = 1 THEN N'Failure' ELSE N'Success' END;
BEGIN TRANSACTION;
IF @NotificationKind = N'Failure'
BEGIN
UPDATE dbo.StoryIntelligenceBookPipelines
SET FailureEmailQueuedUtc = SYSUTCDATETIME(),
UpdatedUtc = SYSUTCDATETIME()
WHERE StoryIntelligenceBookPipelineID = @ImportSessionID
AND FailureEmailQueuedUtc IS NULL;
IF @@ROWCOUNT = 0
BEGIN
ROLLBACK TRANSACTION;
RETURN;
END;
END
ELSE
BEGIN
UPDATE dbo.StoryIntelligenceBookPipelines
SET CompletionEmailQueuedUtc = SYSUTCDATETIME(),
UpdatedUtc = SYSUTCDATETIME()
WHERE StoryIntelligenceBookPipelineID = @ImportSessionID
AND CompletionEmailQueuedUtc IS NULL;
IF @@ROWCOUNT = 0
BEGIN
ROLLBACK TRANSACTION;
RETURN;
END;
END;
COMMIT TRANSACTION;
SELECT @ImportSessionID AS ImportSessionID,
@UserID AS UserID,
p.ProjectID,
project.ProjectName,
p.BookID,
book.BookTitle,
book.Subtitle AS BookSubtitle,
@ChapterCount AS ChapterCount,
@CompletedChapterCount AS CompletedChapterCount,
@FailedChapterCount AS FailedChapterCount,
@NotificationKind AS NotificationKind
FROM dbo.StoryIntelligenceBookPipelines p
INNER JOIN dbo.Projects project ON project.ProjectID = p.ProjectID
INNER JOIN dbo.Books book ON book.BookID = p.BookID
WHERE p.StoryIntelligenceBookPipelineID = @ImportSessionID;
END;
GO