using System.Data; using Dapper; using PlotLine.Models; namespace PlotLine.Data; public interface ISubscriptionRepository { Task GetCurrentSubscriptionAsync(int userId); Task GetSubscriptionLevelAsync(int subscriptionLevelId); Task> GetActiveSubscriptionLevelsAsync(); Task GetOwnedBookCountAsync(int userId); Task GetChapterCountForBookAsync(int bookId); Task GetSceneCountForBookAsync(int bookId); Task GetCharacterCountForProjectAsync(int projectId); Task GetCollaboratorCountForOwnerAsync(int userId); Task GetUsageSummaryForOwnerAsync(int userId); } public sealed class SubscriptionRepository(ISqlConnectionFactory connectionFactory) : ISubscriptionRepository { public async Task GetCurrentSubscriptionAsync(int userId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleOrDefaultAsync( "dbo.UserSubscription_GetCurrent", new { UserID = userId }, commandType: CommandType.StoredProcedure); } public async Task GetSubscriptionLevelAsync(int subscriptionLevelId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleOrDefaultAsync( "dbo.SubscriptionLevel_Get", new { SubscriptionLevelID = subscriptionLevelId }, commandType: CommandType.StoredProcedure); } public async Task> GetActiveSubscriptionLevelsAsync() { using var connection = connectionFactory.CreateConnection(); var rows = await connection.QueryAsync( "dbo.SubscriptionLevel_ListActive", commandType: CommandType.StoredProcedure); return rows.ToList(); } public async Task GetOwnedBookCountAsync(int userId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.SubscriptionUsage_BookCountForOwner", new { UserID = userId }, commandType: CommandType.StoredProcedure); } public async Task GetChapterCountForBookAsync(int bookId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.SubscriptionUsage_ChapterCountForBook", new { BookID = bookId }, commandType: CommandType.StoredProcedure); } public async Task GetSceneCountForBookAsync(int bookId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.SubscriptionUsage_SceneCountForBook", new { BookID = bookId }, commandType: CommandType.StoredProcedure); } public async Task GetCharacterCountForProjectAsync(int projectId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.SubscriptionUsage_CharacterCountForProject", new { ProjectID = projectId }, commandType: CommandType.StoredProcedure); } public async Task GetCollaboratorCountForOwnerAsync(int userId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.SubscriptionUsage_CollaboratorCountForOwner", new { UserID = userId }, commandType: CommandType.StoredProcedure); } public async Task GetUsageSummaryForOwnerAsync(int userId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.SubscriptionUsage_GetSummaryForOwner", new { UserID = userId }, commandType: CommandType.StoredProcedure); } }