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 SourcesTable : ISourcesRepository { private readonly string _connectionString; public SourcesTable(string connectionString) { _connectionString = connectionString; } public SourcesTable(IConfiguration configuration) { var connstr = configuration.GetConnectionString("database"); if (connstr is null) connstr = ""; _connectionString = connstr; } public SourceModel New(SourceModel model) { model.ID = Guid.NewGuid(); using var conn = OpenConnection(_connectionString); var query = "Insert Into Sources (ID, Site, Name, Source, Type, Value, Enabled, Url, Tags, YoutubeId) Values (@id ,@site,@name,@source,@type,@value,@enabled,@url,@tags,@youtubeid);"; conn.Execute(query, new { id = model.ID, model.Site, model.Name, model.Source, model.Type, model.Value, model.Enabled, model.Url, model.Tags, model.YoutubeId }); return model; } public SourceModel GetByID(Guid ID) { using var conn = OpenConnection(_connectionString); var query = "Select * From Sources where ID = @id Limit 1;"; var res = conn.Query(query, new { id = ID }); if (res.Count() == 0) return new SourceModel(); return res.First(); } public SourceModel GetByID(string ID) { var uid = Guid.Parse(ID); return GetByID(uid); } public SourceModel GetByName(string Name) { using var conn = OpenConnection(_connectionString); var query = "Select * from Sources where name = @name Limit 1;"; var res = conn.Query(query, new { name = Name }); if (res.Count() == 0) return new SourceModel(); return res.First(); } public SourceModel GetByNameAndType(string name, string type) { using var conn = OpenConnection(_connectionString); var query = "Select * from Sources WHERE name = @name and type = @type;"; var res = conn.Query(query, new { name, type }); if (res.Count() == 0) return new SourceModel(); return res.First(); } public SourceModel GetByUrl(string url) { using var conn = OpenConnection(_connectionString); var query = "Select * from Sources WHERE url = @url;"; var res = conn.Query(query, new { url }); if (res.ToList().Count == 0) return new SourceModel(); return res.First(); } public List List(int page = 0, int count = 25) { using var conn = OpenConnection(_connectionString); var query = @"Select * From Sources Offset @page Fetch Next @count Rows Only;"; return conn.Query(query, new { page = page * count, count }).ToList(); } public List ListBySource(string source, int limit = 25) { using var conn = OpenConnection(_connectionString); var query = "Select * From Sources where Source = @source Limit @limit;"; return conn.Query(query, new { source, limit }).ToList(); } public List ListByType(string type, int limit = 25) { using var conn = OpenConnection(_connectionString); var query = "Select * From Sources where Type = @type Limit @limit;"; return conn.Query(query, new { type, limit }).ToList(); } public int Disable(Guid id) { using var conn = OpenConnection(_connectionString); var query = "Update Sources Set Enabled = FALSE where ID = @id;"; return conn.Execute(query, new { id }); } public int Enable(Guid id) { using var conn = OpenConnection(_connectionString); var query = "Update Sources Set Enabled = TRUE where ID = @id;"; return conn.Execute(query, new { id }); } public void Delete(Guid id) { using var conn = OpenConnection(_connectionString); var query = "Delete From sources where id = @id;"; var res = conn.Execute(query, new { id }); if (res == 0) throw new Exception("Nothing was deleted"); } public int UpdateYoutubeId(Guid id, string youtubeId) { using var conn = OpenConnection(_connectionString); var query = "Update Sources Set youtubeid = @youtubeId where ID = @id;"; return conn.Execute(query, new { id, youtubeId }); } private IDbConnection OpenConnection(string connectionString) { var conn = new NpgsqlConnection(_connectionString); conn.Open(); return conn; } }