using System.Data; using Dapper; using PlotLine.Models; namespace PlotLine.Data; public interface IStoryIntelligencePipelineRepository { Task GetByBookAsync(int bookId); Task GetByBookForUserAsync(int bookId, int userId); Task> ListForUserAsync(int userId); Task UpsertAsync(StoryIntelligenceBookPipelineSaveRequest request); Task> ListCommittedRunsByBookAsync(int bookId, int userId); } public sealed class StoryIntelligencePipelineRepository(ISqlConnectionFactory connectionFactory) : IStoryIntelligencePipelineRepository { public async Task GetByBookAsync(int bookId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleOrDefaultAsync( "dbo.StoryIntelligenceBookPipeline_GetByBook", new { BookID = bookId }, commandType: CommandType.StoredProcedure); } public async Task GetByBookForUserAsync(int bookId, int userId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleOrDefaultAsync( "dbo.StoryIntelligenceBookPipeline_GetByBookForUser", new { BookID = bookId, UserID = userId }, commandType: CommandType.StoredProcedure); } public async Task> ListForUserAsync(int userId) { using var connection = connectionFactory.CreateConnection(); var rows = await connection.QueryAsync( "dbo.StoryIntelligenceBookPipeline_ListForUser", new { UserID = userId }, commandType: CommandType.StoredProcedure); return rows.ToList(); } public async Task UpsertAsync(StoryIntelligenceBookPipelineSaveRequest request) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.StoryIntelligenceBookPipeline_Upsert", new { request.ProjectID, request.BookID, request.CurrentStage, request.LastCompletedStage, request.CurrentReviewStage, request.Status, request.CompletedUtc, request.LastRunID }, commandType: CommandType.StoredProcedure); } public async Task> ListCommittedRunsByBookAsync(int bookId, int userId) { using var connection = connectionFactory.CreateConnection(); var rows = await connection.QueryAsync( "dbo.StoryIntelligenceBookPipeline_ListCommittedRunsByBook", new { BookID = bookId, UserID = userId }, commandType: CommandType.StoredProcedure); return rows.ToList(); } }