using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading.Tasks; using ChaosBot.Models; using ChaosBot.WebServer.Models; using ChaosBot.WebServer.Services; using FlexLabs.EntityFrameworkCore.Upsert; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace ChaosBot.WebServer.App.ApiControllers { [ApiController] [Route("/api/custom-commands")] public class CustomCommandController : BaseApiController { public CustomCommandController( AccessTokenCache accessTokenCache, ValidationService validationService ) : base( accessTokenCache, validationService ) {} [HttpGet] [Route("{guildId}")] public async Task IndexAction(ulong guildId) { return await Index(guildId); } [HttpPost] [Route("{guildId}")] public async Task UpsertAction( [FromRoute] ulong guildId, [FromBody] JsonElement requestBody) { return await Upsert(guildId, requestBody); } [HttpDelete] [Route("{guildId}/{command}")] public async Task DeleteAction([FromRoute]ulong guildId, [FromRoute]string command) { return await Delete(guildId, command); } protected override DbSet GetBasicQuery(DatabaseContext context) { return context.CustomCommands; } protected override IQueryable ApplyFilterForCurrentGuild(IQueryable query, ulong guildId) { return query.Where(e => e.DiscordGuildId == guildId); } protected override List GetIndexFields() { return new List { "Command", "Type", "Content" }; } protected override Dictionary> GetValidationRules() { return new Dictionary> { {"Command", new List{"required", "type:string", "min:1", "max:128"}}, {"Type", new List{"required", "type:integer", "in:CustomCommandType"}}, {"Content", new List{"required", "type:string"}}, }; } protected override UpsertCommandBuilder ApplyFilterForUpsert( UpsertCommandBuilder builder) { return builder.On(cc => new {cc.DiscordGuildId, cc.Command}); } protected override CustomCommand FilterQueryForDeletion(IQueryable query, ulong guildId, string deleteParameter) { return query .Where(cc => cc.DiscordGuildId == guildId) .First(cc => cc.Command == deleteParameter) ; } protected override List FilterQueryMultipleForDeletion(IQueryable query, ulong guildId, string deleteParameter) { return new List(); } protected override CustomCommand SetDefaultFieldsForUpsert(CustomCommand obj, ulong guildId) { obj.DiscordGuildId = guildId; return obj; } } }