using System.Data; using Dapper; using PlotLine.Models; namespace PlotLine.Data; public interface IOnboardingRepository { Task GetAsync(int userId); Task GetOrCreateAsync(int userId); Task SetCurrentStepAsync(int userId, string currentStep); Task SaveWritingJourneyAsync(int userId, string writingJourney); Task SaveWritingSoftwareAsync(int userId, string writingSoftware); Task MarkCompletedAsync(int userId); Task ShouldShowWordCompanionHeaderAsync(int userId); } public sealed class OnboardingRepository(ISqlConnectionFactory connectionFactory) : IOnboardingRepository { public async Task GetAsync(int userId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleOrDefaultAsync( "dbo.UserOnboarding_Get", new { UserID = userId }, commandType: CommandType.StoredProcedure); } public async Task GetOrCreateAsync(int userId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.UserOnboarding_GetOrCreate", new { UserID = userId }, commandType: CommandType.StoredProcedure); } public async Task SetCurrentStepAsync(int userId, string currentStep) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.UserOnboarding_SetCurrentStep", new { UserID = userId, CurrentStep = currentStep }, commandType: CommandType.StoredProcedure); } public async Task SaveWritingJourneyAsync(int userId, string writingJourney) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.UserOnboarding_SaveWritingJourney", new { UserID = userId, WritingJourney = writingJourney }, commandType: CommandType.StoredProcedure); } public async Task SaveWritingSoftwareAsync(int userId, string writingSoftware) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.UserOnboarding_SaveWritingSoftware", new { UserID = userId, WritingSoftware = writingSoftware }, commandType: CommandType.StoredProcedure); } public async Task MarkCompletedAsync(int userId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.UserOnboarding_MarkCompleted", new { UserID = userId }, commandType: CommandType.StoredProcedure); } public async Task ShouldShowWordCompanionHeaderAsync(int userId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.UserOnboarding_ShouldShowWordCompanionHeader", new { UserID = userId }, commandType: CommandType.StoredProcedure); } }