using System.Data; using Dapper; using PlotLine.Models; namespace PlotLine.Data; public interface IFeatureRequestRepository { Task CreateAsync(int userId, string title, string description, string? appArea, string? importance); Task GetForUserAsync(int featureRequestId, int userId); Task GetForAdminAsync(int featureRequestId); Task> ListForUserAsync(int userId); Task> ListForAdminAsync(string? status); Task UpdateStatusAsync(int featureRequestId, string status, bool isPublicCandidate); Task UpdateAdminNotesAsync(int featureRequestId, string? adminNotes); Task AddMessageAsync(int featureRequestId, int? userId, bool isAdmin, string messageBody); Task> ListMessagesAsync(int featureRequestId); } public sealed class FeatureRequestRepository(ISqlConnectionFactory connectionFactory) : IFeatureRequestRepository { public async Task CreateAsync(int userId, string title, string description, string? appArea, string? importance) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.FeatureRequest_Create", new { UserID = userId, Title = title, Description = description, AppArea = appArea, Importance = importance }, commandType: CommandType.StoredProcedure); } public async Task GetForUserAsync(int featureRequestId, int userId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleOrDefaultAsync( "dbo.FeatureRequest_GetForUser", new { FeatureRequestID = featureRequestId, UserID = userId }, commandType: CommandType.StoredProcedure); } public async Task GetForAdminAsync(int featureRequestId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleOrDefaultAsync( "dbo.FeatureRequest_GetForAdmin", new { FeatureRequestID = featureRequestId }, commandType: CommandType.StoredProcedure); } public async Task> ListForUserAsync(int userId) { using var connection = connectionFactory.CreateConnection(); var rows = await connection.QueryAsync( "dbo.FeatureRequest_ListForUser", new { UserID = userId }, commandType: CommandType.StoredProcedure); return rows.ToList(); } public async Task> ListForAdminAsync(string? status) { using var connection = connectionFactory.CreateConnection(); var rows = await connection.QueryAsync( "dbo.FeatureRequest_ListForAdmin", new { Status = status }, commandType: CommandType.StoredProcedure); return rows.ToList(); } public async Task UpdateStatusAsync(int featureRequestId, string status, bool isPublicCandidate) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleOrDefaultAsync( "dbo.FeatureRequest_UpdateStatus", new { FeatureRequestID = featureRequestId, Status = status, IsPublicCandidate = isPublicCandidate }, commandType: CommandType.StoredProcedure); } public async Task UpdateAdminNotesAsync(int featureRequestId, string? adminNotes) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleOrDefaultAsync( "dbo.FeatureRequest_UpdateAdminNotes", new { FeatureRequestID = featureRequestId, AdminNotes = adminNotes }, commandType: CommandType.StoredProcedure); } public async Task AddMessageAsync(int featureRequestId, int? userId, bool isAdmin, string messageBody) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleOrDefaultAsync( "dbo.FeatureRequestMessage_Add", new { FeatureRequestID = featureRequestId, UserID = userId, IsAdmin = isAdmin, MessageBody = messageBody }, commandType: CommandType.StoredProcedure); } public async Task> ListMessagesAsync(int featureRequestId) { using var connection = connectionFactory.CreateConnection(); var rows = await connection.QueryAsync( "dbo.FeatureRequestMessage_List", new { FeatureRequestID = featureRequestId }, commandType: CommandType.StoredProcedure); return rows.ToList(); } }