using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using EllieBot.GrpcVotesApi; namespace EllieBot.VotesApi.Controllers { [ApiController] public class WebhookController(ILogger<WebhookController> logger, VoteService.VoteServiceClient client) : ControllerBase { [HttpPost("/discordswebhook")] [Authorize(Policy = Policies.DiscordsAuth)] public async Task<IActionResult> DiscordsWebhook([FromBody] DiscordsVoteWebhookModel data) { if ((data.Type?.Contains("vote") ?? false) == false) return Ok(); logger.LogInformation("User {UserId} has voted for Bot {BotId} on {Platform}", data.User, data.Bot, "discords.com"); await client.VoteReceivedAsync(new GrpcVoteData() { Type = VoteType.Discords, UserId = data.User, }); return Ok(); } [HttpPost("/topggwebhook")] [Authorize(Policy = Policies.TopggAuth)] public async Task<IActionResult> TopggWebhook([FromBody] TopggVoteWebhookModel data) { logger.LogInformation("User {UserId} has voted for Bot {BotId} on {Platform}", data.User, data.Bot, "top.gg"); await client.VoteReceivedAsync(new GrpcVoteData() { Type = VoteType.Topgg, UserId = data.User, }); return Ok(); } [HttpPost("/discordbotlistwebhook")] [Authorize(Policy = Policies.DiscordbotlistAuth)] public async Task<IActionResult> DiscordbotlistWebhook([FromBody] DiscordbotlistVoteWebhookModel data) { logger.LogInformation("User {UserId} has voted for Bot on {Platform}", data.Id, "discordbotlist.com"); await client.VoteReceivedAsync(new GrpcVoteData() { Type = VoteType.Discordbotlist, UserId = data.Id, }); return Ok(); } } }