Fix hard delete for manuscript source rows
This commit is contained in:
parent
5a38560f47
commit
e0c3171329
@ -176,6 +176,7 @@ static void ProjectHardDeleteClearsStoryIntelligenceDependenciesInTransaction()
|
|||||||
{
|
{
|
||||||
var root = Path.Combine(AppContext.BaseDirectory, "../../../../PlotLine");
|
var root = Path.Combine(AppContext.BaseDirectory, "../../../../PlotLine");
|
||||||
var repository = File.ReadAllText(Path.Combine(root, "Data/Repositories.cs"));
|
var repository = File.ReadAllText(Path.Combine(root, "Data/Repositories.cs"));
|
||||||
|
var cascadeMigration = File.ReadAllText(Path.Combine(root, "Sql/159_Phase25D_ManuscriptSourceHardDeleteCascades.sql"));
|
||||||
|
|
||||||
Assert(repository.Contains("using var transaction = connection.BeginTransaction()", StringComparison.Ordinal), "Project hard delete should be wrapped by a repository transaction.");
|
Assert(repository.Contains("using var transaction = connection.BeginTransaction()", StringComparison.Ordinal), "Project hard delete should be wrapped by a repository transaction.");
|
||||||
Assert(repository.Contains("ProjectHardDeleteStoryIntelligenceDependencyCleanupSql", StringComparison.Ordinal), "Project hard delete should run scoped Story Intelligence dependency cleanup before the stored procedure.");
|
Assert(repository.Contains("ProjectHardDeleteStoryIntelligenceDependencyCleanupSql", StringComparison.Ordinal), "Project hard delete should run scoped Story Intelligence dependency cleanup before the stored procedure.");
|
||||||
@ -186,6 +187,10 @@ static void ProjectHardDeleteClearsStoryIntelligenceDependenciesInTransaction()
|
|||||||
Assert(repository.Contains("StoryMemoryProcessedSceneResults", StringComparison.Ordinal), "Hard delete cleanup should remove durable story memory scene-result rows.");
|
Assert(repository.Contains("StoryMemoryProcessedSceneResults", StringComparison.Ordinal), "Hard delete cleanup should remove durable story memory scene-result rows.");
|
||||||
Assert(repository.Contains("StoryMemoryImportPreferences", StringComparison.Ordinal), "Hard delete cleanup should remove durable story memory import rows.");
|
Assert(repository.Contains("StoryMemoryImportPreferences", StringComparison.Ordinal), "Hard delete cleanup should remove durable story memory import rows.");
|
||||||
Assert(repository.Contains("WHERE ProjectID = @ProjectID", StringComparison.Ordinal), "Hard delete cleanup must be scoped by project id.");
|
Assert(repository.Contains("WHERE ProjectID = @ProjectID", StringComparison.Ordinal), "Hard delete cleanup must be scoped by project id.");
|
||||||
|
Assert(cascadeMigration.Contains("FK_SceneManuscriptSources_Scenes", StringComparison.Ordinal)
|
||||||
|
&& cascadeMigration.Contains("REFERENCES dbo.Scenes(SceneID) ON DELETE CASCADE", StringComparison.Ordinal), "Scene manuscript source text should not block permanent scene deletion.");
|
||||||
|
Assert(cascadeMigration.Contains("FK_ManuscriptStructuralChapterSources_Chapters", StringComparison.Ordinal)
|
||||||
|
&& cascadeMigration.Contains("REFERENCES dbo.Chapters(ChapterID) ON DELETE CASCADE", StringComparison.Ordinal), "Structural chapter source text should not block permanent chapter deletion.");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void PermanentProjectDeleteKeepsArchiveAndNameSafetyGates()
|
static void PermanentProjectDeleteKeepsArchiveAndNameSafetyGates()
|
||||||
|
|||||||
@ -0,0 +1,64 @@
|
|||||||
|
SET ANSI_NULLS ON;
|
||||||
|
GO
|
||||||
|
SET QUOTED_IDENTIFIER ON;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.SceneManuscriptSources', N'U') IS NOT NULL
|
||||||
|
AND EXISTS
|
||||||
|
(
|
||||||
|
SELECT 1
|
||||||
|
FROM sys.foreign_keys
|
||||||
|
WHERE name = N'FK_SceneManuscriptSources_Scenes'
|
||||||
|
AND parent_object_id = OBJECT_ID(N'dbo.SceneManuscriptSources')
|
||||||
|
AND delete_referential_action_desc <> N'CASCADE'
|
||||||
|
)
|
||||||
|
BEGIN
|
||||||
|
ALTER TABLE dbo.SceneManuscriptSources DROP CONSTRAINT FK_SceneManuscriptSources_Scenes;
|
||||||
|
|
||||||
|
ALTER TABLE dbo.SceneManuscriptSources WITH CHECK
|
||||||
|
ADD CONSTRAINT FK_SceneManuscriptSources_Scenes
|
||||||
|
FOREIGN KEY (SceneID) REFERENCES dbo.Scenes(SceneID) ON DELETE CASCADE;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.SceneManuscriptSources', N'U') IS NOT NULL
|
||||||
|
AND NOT EXISTS
|
||||||
|
(
|
||||||
|
SELECT 1
|
||||||
|
FROM sys.foreign_keys
|
||||||
|
WHERE name = N'FK_SceneManuscriptSources_Scenes'
|
||||||
|
AND parent_object_id = OBJECT_ID(N'dbo.SceneManuscriptSources')
|
||||||
|
AND delete_referential_action_desc = N'CASCADE'
|
||||||
|
)
|
||||||
|
THROW 52010, 'Scene manuscript source hard-delete cascade was not applied.', 1;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.ManuscriptStructuralChapterSources', N'U') IS NOT NULL
|
||||||
|
AND NOT EXISTS
|
||||||
|
(
|
||||||
|
SELECT 1
|
||||||
|
FROM sys.foreign_keys
|
||||||
|
WHERE name = N'FK_ManuscriptStructuralChapterSources_Chapters'
|
||||||
|
AND parent_object_id = OBJECT_ID(N'dbo.ManuscriptStructuralChapterSources')
|
||||||
|
AND delete_referential_action_desc = N'CASCADE'
|
||||||
|
)
|
||||||
|
THROW 52011, 'Structural chapter source hard-delete cascade was not applied.', 1;
|
||||||
|
GO
|
||||||
|
|
||||||
|
IF OBJECT_ID(N'dbo.ManuscriptStructuralChapterSources', N'U') IS NOT NULL
|
||||||
|
AND EXISTS
|
||||||
|
(
|
||||||
|
SELECT 1
|
||||||
|
FROM sys.foreign_keys
|
||||||
|
WHERE name = N'FK_ManuscriptStructuralChapterSources_Chapters'
|
||||||
|
AND parent_object_id = OBJECT_ID(N'dbo.ManuscriptStructuralChapterSources')
|
||||||
|
AND delete_referential_action_desc <> N'CASCADE'
|
||||||
|
)
|
||||||
|
BEGIN
|
||||||
|
ALTER TABLE dbo.ManuscriptStructuralChapterSources DROP CONSTRAINT FK_ManuscriptStructuralChapterSources_Chapters;
|
||||||
|
|
||||||
|
ALTER TABLE dbo.ManuscriptStructuralChapterSources WITH CHECK
|
||||||
|
ADD CONSTRAINT FK_ManuscriptStructuralChapterSources_Chapters
|
||||||
|
FOREIGN KEY (ChapterID) REFERENCES dbo.Chapters(ChapterID) ON DELETE CASCADE;
|
||||||
|
END;
|
||||||
|
GO
|
||||||
Loading…
x
Reference in New Issue
Block a user