using System.Data; using Dapper; using Microsoft.Extensions.Configuration; using Newsbot.Collector.Domain.Interfaces; using Newsbot.Collector.Domain.Models; using Npgsql; namespace Newsbot.Collector.Database.Repositories; public class ArticlesTable : IArticlesRepository { private string _connectionString; public ArticlesTable(string connectionString) { _connectionString = connectionString; } public ArticlesTable(IConfiguration configuration) { var conn = configuration.GetConnectionString("database"); if (conn is null) { conn = ""; } _connectionString = conn; } private IDbConnection OpenConnection(string connectionString) { var conn = new NpgsqlConnection(_connectionString); conn.Open(); return conn; } public List List(int page = 0, int count = 25) { using var conn = OpenConnection(_connectionString); var res = conn.Query(@"select * from articles Order By PubDate Desc Offset @Page Fetch Next @Count Rows Only", new { Page = page * count, Count = count }) .ToList(); return res; } public ArticlesModel GetById(Guid ID) { using var conn = OpenConnection(_connectionString); var res = conn.Query("select * from articles where ID = @ID", new { ID = ID }); if (res.Count() == 0) { return new ArticlesModel(); } return res.First(); } public ArticlesModel GetByUrl(string url) { using var conn = OpenConnection(_connectionString); var res = conn.Query("select * from articles where Url = @Url Limit 1", new { Url = url }); if (res.Count() == 0) { return new ArticlesModel(); } return res.First(); } public List ListBySourceId(Guid id, int page, int count) { using var conn = OpenConnection(_connectionString); var query = @"Select * from articles where sourceid = @sourceid Offset @page Fetch next @count rows only"; return conn.Query(query, new { sourceid = id, page = page * count, count = count }).ToList(); } public ArticlesModel New(ArticlesModel model) { model.ID = Guid.NewGuid(); using var conn = OpenConnection(_connectionString); var q = "INSERT INTO Articles (id, sourceid, tags, title, url, pubdate, video, videoheight, videowidth, thumbnail, description, authorname, authorimage) Values (@id, @sourceid, @tags, @title, @url, @pubdate, @video, @videoheight, @videowidth, @thumbnail, @description, @authorname, @authorimage);"; var res = conn.Execute(q, new { id = Guid.NewGuid(), sourceid = model.SourceID, tags = model.Tags, title = model.Title, url = model.URL, pubdate = model.PubDate, video = model.Video, videoheight = model.VideoHeight, videowidth = model.VideoWidth, thumbnail = model.Thumbnail, description = model.Description, authorname = model.AuthorName, authorimage = model.AuthorImage }); return model; } }