using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Newsbot.Collector.Database.Repositories; using Newsbot.Collector.Domain.Dto; using Newsbot.Collector.Domain.Interfaces; using Newsbot.Collector.Domain.Models; namespace Newsbot.Collector.Api.Controllers; [ApiController] [Route("api/subscriptions")] public class SubscriptionsController : ControllerBase { private readonly ILogger _logger; private readonly ISubscriptionRepository _subscription; private readonly IDiscordWebHooksRepository _discord; private readonly ISourcesRepository _sources; public SubscriptionsController(ILogger logger, IOptions settings) { _logger = logger; _subscription = new SubscriptionsTable(settings.Value.Database); _discord = new DiscordWebhooksTable(settings.Value.Database); _sources = new SourcesTable(settings.Value.Database); } [HttpGet(Name = "ListSubscriptions")] public IEnumerable List(int page) { var res = new List(); var items = _subscription.List(page); foreach (var item in items) { res.Add(SubscriptionDto.Convert(item)); } return res; } [HttpGet("{id}")] public SubscriptionDto GetById(Guid id) { return SubscriptionDto.Convert(_subscription.GetById(id)); } [HttpGet("{id}/details")] public SubscriptionDetailsDto GetDetailsById(Guid id) { var sub = _subscription.GetById(id); var webhook = _discord.GetByID(sub.DiscordWebHookID); var source = _sources.GetByID(sub.SourceID); return SubscriptionDetailsDto.Convert(sub, source, webhook); } [HttpPost("{id}/delete")] public void DeleteById(Guid id) { _subscription.Delete(id); } [HttpGet("by/discordid")] public IEnumerable GetByDiscordId(Guid id) { var res = new List(); var items = _subscription.ListByWebhook(id); foreach (var item in items) { res.Add(SubscriptionDto.Convert(item)); } return res; } [HttpGet("by/sourceId")] public IEnumerable GetBySourceId(Guid id) { var res = new List(); var items = _subscription.ListBySourceID(id); foreach (var item in items) { res.Add(SubscriptionDto.Convert(item)); } return res; } [HttpPost(Name = "New Subscription")] public SubscriptionDto New(Guid sourceId, Guid discordId) { var exists = _subscription.GetByWebhookAndSource(discordId, sourceId); // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract if (exists is not null) { return SubscriptionDto.Convert(exists); } var item = _subscription.New(new SubscriptionModel { ID = Guid.NewGuid(), SourceID = sourceId, DiscordWebHookID = discordId }); return SubscriptionDto.Convert(item); } }