using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Newsbot.Collector.Domain.Dto; using Newsbot.Collector.Domain.Entities; using Newsbot.Collector.Domain.Interfaces; namespace Newsbot.Collector.Api.Controllers; [ApiController] [Route("api/subscriptions")] [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] public class DiscordNotificationController : ControllerBase { private readonly ILogger _logger; private readonly IDiscordWebHooksRepository _discord; private readonly ISourcesRepository _sources; private readonly IDiscordNotificationRepository _discordNotification; public DiscordNotificationController(ILogger logger, IDiscordWebHooksRepository discord, ISourcesRepository sources, IDiscordNotificationRepository discordNotification) { _logger = logger; _discord = discord; _sources = sources; _discordNotification = discordNotification; } [HttpGet(Name = "ListSubscriptions")] public IEnumerable List(int page) { var res = new List(); var items = _discordNotification.List(page); foreach (var item in items) res.Add(DiscordNotificationDto.Convert(item)); return res; } [HttpGet("{id}")] public DiscordNotificationDto GetById(Guid id) { return DiscordNotificationDto.Convert(_discordNotification.GetById(id)); } [HttpGet("{id}/details")] public DiscordNotificationDetailsDto GetDetailsById(Guid id) { var sub = _discordNotification.GetById(id); var webhook = _discord.GetById(sub.DiscordWebHookId); var source = _sources.GetById(sub.SourceId); return DiscordNotificationDetailsDto.Convert(sub, source, webhook); } [HttpPost("{id}/delete")] public void DeleteById(Guid id) { _discordNotification.Delete(id); } [HttpGet("by/discordId/{id}")] public IEnumerable GetByDiscordId(Guid id) { var res = new List(); var items = _discordNotification.ListByWebhook(id); foreach (var item in items) res.Add(DiscordNotificationDto.Convert(item)); return res; } [HttpGet("by/sourceId/{id}")] public IEnumerable GetBySourceId(Guid id) { var res = new List(); var items = _discordNotification.ListBySourceId(id); foreach (var item in items) res.Add(DiscordNotificationDto.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 = _discordNotification.GetByWebhookAndSource(discordId, sourceId); if (exists.Id != Guid.Empty) return DiscordNotificationDto.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 = _discordNotification.New(new DiscordNotificationEntity { Id = Guid.NewGuid(), SourceId = sourceId, DiscordWebHookId = discordId, CodeAllowCommits = false, CodeAllowReleases = false }); return DiscordNotificationDto.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 = _discordNotification.GetByWebhookAndSource(discordId, sourceId); if (exists.Id != Guid.Empty) return DiscordNotificationDto.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 = _discordNotification.New(new DiscordNotificationEntity { DiscordWebHookId = discordId, SourceId = sourceId, CodeAllowCommits = allowCommits, CodeAllowReleases = allowReleases }); return new DiscordNotificationDto(); } }