using Dapper; using FastBlog.Core.Abstractions.Repositories.Users; using FastBlog.Core.Db; using FastBlog.Core.Models; using FastBlog.Core.Models.Users; namespace FastBlog.Core.Repositories; public sealed class UserRepository(SqliteConnectionFactory connectionFactory) : IUserRepository { public async Task Get(int id) { const string sql = "select * from Users where id = @id"; using var connection = connectionFactory.Create(); return await connection.QueryFirstOrDefaultAsync(sql, new { id }); } public async Task GetByName(string username) { const string sql = "select * from Users where username = @username and deleted is false"; using var connection = connectionFactory.Create(); return await connection.QueryFirstOrDefaultAsync(sql, new { username }); } public async Task SetPassword(int id, string newPassword) { const string sql = "update Users set passwordHash = @newPassword where id = @id"; using var connection = connectionFactory.Create(); return await connection.ExecuteAsync(sql, new { id, newPassword }) > 0; } public async Task> GetUsers(PagedRequest pagedRequest) { const string sql = """ select COUNT(*) from Users; select * from Users order by CreatedAt desc limit @Amount offset @Offset; """; using var connection = connectionFactory.Create(); await using var multi = await connection.QueryMultipleAsync(sql, pagedRequest); var total = await multi.ReadFirstAsync(); var result = (await multi.ReadAsync()).ToArray(); return PagedResponse.Create(total, total, pagedRequest.Offset, result); } public async Task CreateUser(NewUser newUser) { const string sql = "insert into Users (username, passwordHash, email) values (@Username, @Password, @Email) returning *"; using var connection = connectionFactory.Create(); return await connection.QueryFirstAsync(sql, newUser); } public async Task DeleteUser(int userId) { const string sql = "update Users set deleted = true where id = @userId"; using var connection = connectionFactory.Create(); return await connection.ExecuteAsync(sql, new { userId }) > 0; } }