using System.Threading.Tasks; using System.Linq; using Dapper; using Website.Models; using Website.Data.States; using System.Collections.Generic; namespace Website.Data { public class BlogRepository { private readonly IDatabaseProvider _dbProvider; public BlogRepository(IDatabaseProvider dbProvider) => _dbProvider = dbProvider; public async Task GetPostByUrlAsync(string url) { const string query = "SELECT * FROM blog_posts WHERE post_url=@url AND post_deleted=0"; using (var connection = _dbProvider.NewConnection()) { connection.Open(); var result = await connection.QueryAsync(query, new{url}); return new BlogPost(result.First()); } } public async Task> GetLatestPostsAsync(int limit, int offset = 0) { const string query = "SELECT * FROM blog_posts WHERE post_content<>'' AND post_deleted=0 ORDER BY post_timestamp DESC LIMIT @offset,@limit"; using (var connection = _dbProvider.NewConnection()) { connection.Open(); var results = await connection.QueryAsync(query, new{limit, offset}); return results.Select(result => new BlogPost(result)); } } public async Task GetLatestPostAsync() => (await GetLatestPostsAsync(1)).First(); public async Task GetCountAsync() { var query="SELECT COUNT(*) FROM blog_posts WHERE post_content<>'' AND post_deleted=0"; using(var connection = _dbProvider.NewConnection()) { connection.Open(); var result = await connection.QueryAsync(query); return result.First(); } } public async Task GetPostByIdAsync(int id) { const string query = "SELECT * FROM blog_posts WHERE post_id=@id AND post_deleted=0"; using (var connection = _dbProvider.NewConnection()) { connection.Open(); var result = await connection.QueryAsync(query, new {id}); return new BlogPost(result.First()); } } public async Task SavePost(BlogPost post) { const string newPostQuery = "INSERT INTO blog_posts (post_title, post_content, post_draft, post_url) VALUES (@title, @content, @draft, @url); SELECT CAST(LAST_INSERT_ID() as int)"; const string updatePostQuery = "UPDATE blog_posts SET post_id = @id, post_title = @title, post_content = @content, post_draft = @draft, post_url = @url WHERE post_id = @id "; var newPost = post.Id == 0; using (var connection = _dbProvider.NewConnection()) { connection.Open(); var result = await connection.QueryAsync(newPost ? newPostQuery : updatePostQuery, post); return newPost ? await GetPostByIdAsync(result.Single()) : post; } } public async Task> GetAllPostsAsync() { const string query = "SELECT * FROM blog_posts WHERE post_deleted=0"; using (var connection = _dbProvider.NewConnection()) { connection.Open(); var result = await connection.QueryAsync(query); return result.Select(state => new BlogPost(state)); } } public async Task DeletePostAsync(int id) { const string query = "UPDATE blog_posts SET post_deleted=1 WHERE post_id=@id"; using (var connection = _dbProvider.NewConnection()) { connection.Open(); await connection.ExecuteAsync(query, new {id}); } } } }