using System.Collections.Generic; using System.Threading.Tasks; using Dapper; namespace MiniWiki.Data.Documents; public class DocumentsDatabaseRepository(IDbConnectionFactory connectionFactory) : IDocumentsRepository { public async Task> GetLatestDocumentsAsync(int count) { const string query = "SELECT * FROM documents ORDER BY updated_at DESC LIMIT @count"; using var connection = connectionFactory.CreateConnection(); return await connection.QueryAsync(query, new { count }); } public Task> GetMultipleAsync(IEnumerable slugs) { var query = "SELECT * FROM documents WHERE slug IN @slugs"; var connection = connectionFactory.CreateConnection(); return connection.QueryAsync(query, new { slugs }); } public async Task CreateAsync(Document document) { const string statement = """ INSERT INTO documents (title, slug, body, created_at, updated_at, created_by, updated_by) VALUES (@Title, @Slug, @Body, @CreatedAt, @UpdatedAt, @CreatedBy, @UpdatedBy) """; using var connection = connectionFactory.CreateConnection(); await connection.ExecuteAsync(statement, document); return document; } public async Task UpdateAsync(Document document) { const string statement = """ UPDATE documents SET title = @Title, slug=@Slug, body=@Body, updated_at=@UpdatedAt, updated_by=@UpdatedBy WHERE slug=@Slug """; using var connection = connectionFactory.CreateConnection(); await connection.ExecuteAsync(statement, document); return document; } public async Task GetBySlugAsync(string slug) { const string query = "SELECT * FROM documents WHERE slug = @slug"; using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleOrDefaultAsync(query, new { slug }); } }