namespace TaxBaik.Infrastructure.Repositories; using Dapper; using TaxBaik.Domain.Entities; using TaxBaik.Domain.Interfaces; public class InquiryRepository(IDbConnectionFactory connectionFactory) : BaseRepository(connectionFactory), IInquiryRepository { public async Task CreateAsync(Inquiry inquiry, CancellationToken cancellationToken = default) { using var conn = Conn(); return await conn.QueryFirstAsync( @"INSERT INTO inquiries (name, phone, email, service_type, message, status, ip_address, created_at) VALUES (@Name, @Phone, @Email, @ServiceType, @Message, @Status, @IpAddress, NOW()) RETURNING id", inquiry); } public async Task GetByIdAsync(int id, CancellationToken cancellationToken = default) { using var conn = Conn(); return await conn.QueryFirstOrDefaultAsync( "SELECT id, name, phone, email, service_type, message, status, ip_address, created_at FROM inquiries WHERE id = @Id", new { Id = id }); } public async Task<(IEnumerable Items, int Total)> GetPagedAsync( int page, int pageSize, string? status = null, CancellationToken cancellationToken = default) { using var conn = Conn(); var offset = (page - 1) * pageSize; using var reader = await conn.QueryMultipleAsync( @"SELECT id, name, phone, email, service_type, message, status, ip_address, created_at FROM inquiries WHERE @Status::text IS NULL OR status = @Status ORDER BY created_at DESC LIMIT @PageSize OFFSET @Offset; SELECT COUNT(*) FROM inquiries WHERE @Status::text IS NULL OR status = @Status;", new { Status = status, PageSize = pageSize, Offset = offset }); var items = (await reader.ReadAsync()).ToList(); var total = await reader.ReadFirstAsync(); return (items, total); } public async Task UpdateStatusAsync(int id, string status, CancellationToken cancellationToken = default) { using var conn = Conn(); await conn.ExecuteAsync("UPDATE inquiries SET status = @Status WHERE id = @Id", new { Id = id, Status = status }); } }