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 IDiscordWebHooksRepository _discord; private readonly ILogger _logger; private readonly ISourcesRepository _sources; private readonly ISubscriptionRepository _subscription; 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/{id}")] 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/{id}")] 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 ActionResult New(Guid sourceId, Guid discordId) { if (sourceId == Guid.Empty) return new BadRequestResult(); if (discordId == Guid.Empty) return new BadRequestResult(); var exists = _subscription.GetByWebhookAndSource(discordId, sourceId); if (exists.Id != Guid.Empty) return SubscriptionDto.Convert(exists); var discord = _discord.GetById(discordId); if (discord.Id == Guid.Empty) return new BadRequestResult(); var source = _sources.GetById(sourceId); if (source.Id == Guid.Empty) return new BadRequestResult(); var item = _subscription.New(new SubscriptionModel { Id = Guid.NewGuid(), SourceId = sourceId, DiscordWebHookId = discordId, CodeAllowCommits = false, CodeAllowReleases = false }); return SubscriptionDto.Convert(item); } [HttpPost("new/codeproject")] public ActionResult NewCodeProjectSubscription(Guid sourceId, Guid discordId, bool allowReleases, bool allowCommits) { if (sourceId == Guid.Empty) return new BadRequestResult(); if (discordId == Guid.Empty) return new BadRequestResult(); var exists = _subscription.GetByWebhookAndSource(discordId, sourceId); if (exists.Id != Guid.Empty) return SubscriptionDto.Convert(exists); var discord = _discord.GetById(discordId); if (discord.Id == Guid.Empty) return new BadRequestResult(); var source = _sources.GetById(sourceId); if (source.Id == Guid.Empty) return new BadRequestResult(); var sub = _subscription.New(new SubscriptionModel { DiscordWebHookId = discordId, SourceId = sourceId, CodeAllowCommits = allowCommits, CodeAllowReleases = allowReleases }); return new SubscriptionDto(); } }