using BantFlags.Data; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Threading.Tasks; namespace BantFlags.Controllers { [ApiController] [Route("api")] public class FlagsController : Controller { private DatabaseService Database { get; } private ILogger Logger { get; } private string FlagList { get; set; } private HashSet DatabaseFlags { get; set; } public FlagsController(DatabaseService db, ILogger logger) { Database = db; Logger = logger; // During initialisation we get the current list of flags for // resolving supported flags and preventing duplicate flags from // being created List flags = Database.GetFlags().Result; FlagList = string.Join("\n", flags); DatabaseFlags = flags.ToHashSet(); } [HttpPost] [Route("get")] [Consumes("application/x-www-form-urlencoded")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task Get([FromForm]string post_nrs, [FromForm]string board, [FromForm]string version) { try { var posts = await Database.GetPosts(post_nrs); return Json(posts); } catch (Exception e) { return Problem(e.Message, statusCode: StatusCodes.Status400BadRequest); // TODO: We shouldn't send the exception message } } [HttpPost] [Route("post")] [Consumes("application/x-www-form-urlencoded")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task Post([FromForm]string post_nr, [FromForm]string board, [FromForm]string regions) { try // We only care if the post if valid. { // TODO: Currently we skip over invalid flags. Should we error instead? var flags = regions.Split("||").Where(x => DatabaseFlags.Contains(x)); FlagModel post = new FlagModel { PostNumber = int.TryParse(post_nr, out int temp) ? temp : throw new FormatException("Bad post number."), Board = board == "bant" ? "bant" : throw new FormatException("Board parameter wasn't formatted correctly."), Flags = flags.Count() > 0 ? flags : throw new FormatException("Your post didn't include any flags, or your flags were invalid.") }; await Database.InsertPost(post); return Ok(post); } catch (Exception e) { return Problem(detail: ErrorMessage(e), statusCode: StatusCodes.Status400BadRequest); } } [HttpGet] [Route("flags")] public IActionResult Flags() => Ok(FlagList); private string ErrorMessage(Exception exception) => exception switch { FormatException e => e.Message, DbException _ => "Internal database error.", ArgumentNullException _ => "No regions sent", Exception e => e.Message, // Don't do this. _ => "how in the hell" }; // This needs more testing. } }