using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Newsbot.Collector.Database.Repositories; using Newsbot.Collector.Domain.Consts; using Newsbot.Collector.Domain.Dto; using Newsbot.Collector.Domain.Entities; using Newsbot.Collector.Domain.Interfaces; using Newsbot.Collector.Domain.Models; using Newsbot.Collector.Services.HtmlParser; namespace Newsbot.Collector.Api.Controllers; [ApiController] [Route("api/sources")] public class SourcesController : ControllerBase { private readonly IArticlesRepository _articles; //private readonly ConnectionStrings _settings; private readonly IIconsRepository _icons; private readonly ILogger _logger; private readonly ISourcesRepository _sources; public SourcesController(ILogger logger, IOptions settings) { _logger = logger; //_settings = settings.Value; _sources = new SourcesTable(settings.Value.Database); _icons = new IconsTable(settings.Value.Database); _articles = new ArticlesTable(settings.Value.Database); } [HttpGet(Name = "GetSources")] public IEnumerable Get(int page) { var res = new List(); var temp = _sources.List(page, 25); foreach (var item in temp) res.Add(SourceDto.Convert(item)); return res; } [HttpGet("by/type")] public IEnumerable GetByType(string type, int page) { var res = new List(); var temp = _sources.ListByType(type, page); foreach (var item in temp) res.Add(SourceDto.Convert(item)); return res; } [HttpPost("new/reddit")] public SourceDto NewReddit(string name) { var res = _sources.GetByNameAndType(name, SourceTypes.Reddit); if (res.Id != Guid.Empty) return SourceDto.Convert(res); var uri = new Uri($"https://reddit.com/r/{name}"); var pageReader = new HtmlPageReader(new HtmlPageReaderOptions { Url = uri.ToString() }); pageReader.Parse(); var item = _sources.New(new SourceEntity { Site = SourceTypes.Reddit, Name = name, Type = SourceTypes.Reddit, Source = "feed", Enabled = true, Url = uri.ToString(), Tags = $"{SourceTypes.Reddit},{name}" }); // Not all subreddits have an Icon, so we only want to add a record when it has one. if (pageReader.Data.Header.Image != "") _icons.New(new IconEntity() { Id = Guid.NewGuid(), FileName = pageReader.Data.Header.Image, SourceId = item.Id }); return SourceDto.Convert(item); } [HttpPost("new/rss")] public SourceDto NewRss(string name, string url) { var res = _sources.GetByNameAndType(name, SourceTypes.Rss); if (res.Id != Guid.Empty) return SourceDto.Convert(res); var m = new SourceEntity { Site = SourceTypes.Rss, Name = name, Type = SourceTypes.Rss, Source = "feed", Enabled = true, Url = url, Tags = $"{SourceTypes.Rss},{name}" }; var item = _sources.New(m); return SourceDto.Convert(item); } [HttpPost("new/youtube")] public SourceDto NewYoutube(string url) { var res = _sources.GetByUrl(url); if (res.Id != Guid.Empty) return SourceDto.Convert(res); var htmlClient = new HtmlPageReader(new HtmlPageReaderOptions { Url = url }); htmlClient.Parse(); var item = _sources.New(new SourceEntity { Site = SourceTypes.YouTube, Type = SourceTypes.YouTube, Name = htmlClient.Data.Header.Title, Source = "feed", Url = url, Enabled = true, Tags = $"{SourceTypes.YouTube},{htmlClient.Data.Header.Title}", YoutubeId = htmlClient.Data.Header.YoutubeChannelID ?? "" }); _icons.New(new IconEntity() { Id = Guid.NewGuid(), FileName = htmlClient.Data.Header.Image, SourceId = item.Id }); return SourceDto.Convert(item); } [HttpPost("new/twitch")] public SourceDto NewTwitch(string name) { var res = _sources.GetByNameAndType(name, SourceTypes.Twitch); if (res.Id != Guid.Empty) return SourceDto.Convert(res); var item = _sources.New(new SourceEntity { Site = SourceTypes.Twitch, Type = SourceTypes.Twitch, Name = name, Url = $"https://twitch.tv/{name}", Source = "api", Enabled = true, Tags = $"{SourceTypes.Twitch},{name}" }); return SourceDto.Convert(item); } [HttpPost("new/codeproject")] public SourceDto NewGithub(string url) { //if (!url.Contains("github.com")) return new SourceDto(); var res = _sources.GetByUrl(url); if (res.Id != Guid.Empty) return SourceDto.Convert(res); var slice = url.Split('/'); var pageReader = new HtmlPageReader(new HtmlPageReaderOptions { Url = url }); pageReader.Parse(); var item = _sources.New(new SourceEntity { Site = SourceTypes.CodeProject, Type = SourceTypes.CodeProject, Name = $"{slice[3]}/{slice[4]}", Url = url, Source = "feed", Enabled = true, Tags = $"{slice[2]},{slice[3]},{slice[4]}" }); _icons.New(new IconEntity() { Id = Guid.NewGuid(), FileName = pageReader.Data.Header.Image, SourceId = item.Id }); return SourceDto.Convert(item); } [HttpGet("{id}")] public SourceDto GetById(Guid id) { var item = _sources.GetById(id); return SourceDto.Convert(item); } [HttpPost("{id}/disable")] public void Disable(Guid id) { _sources.Disable(id); } [HttpPost("{id}/enable")] public void Enable(Guid id) { _sources.Enable(id); } [HttpDelete("{id}")] public void Delete(Guid id, bool purgeOrphanedRecords) { _sources.Delete(id); } }