#nullable enable using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Levels; using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.PlayerData.Profiles; using LBPUnion.ProjectLighthouse.Types; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; // I would like to apologize in advance for anyone dealing with this file. // Theres probably a better way to do this with delegates but I'm tired. // TODO: Clean up this file // - jvyden namespace LBPUnion.ProjectLighthouse.Servers.Website.Controllers; [ApiController] [Route("slot/{id:int}")] public class SlotPageController : ControllerBase { private readonly Database database; public SlotPageController(Database database) { this.database = database; } [HttpGet("rateComment")] public async Task RateComment([FromRoute] int id, [FromQuery] int commentId, [FromQuery] int rating) { User? user = this.database.UserFromWebRequest(this.Request); if (user == null) return this.Redirect("~/login"); await this.database.RateComment(user, commentId, rating); return this.Redirect($"~/slot/{id}#{commentId}"); } [HttpPost("postComment")] public async Task PostComment([FromRoute] int id, [FromForm] string? msg) { User? user = this.database.UserFromWebRequest(this.Request); if (user == null) return this.Redirect("~/login"); if (msg == null) { Logger.Error($"Refusing to post comment from {user.UserId} on user {id}, {nameof(msg)} is null", LogArea.Comments); return this.Redirect("~/slot/" + id); } msg = SanitizationHelper.SanitizeString(msg); await this.database.PostComment(user, id, CommentType.Level, msg); Logger.Success($"Posted comment from {user.UserId}: \"{msg}\" on user {id}", LogArea.Comments); return this.Redirect("~/slot/" + id); } [HttpGet("heart")] public async Task HeartLevel([FromRoute] int id, [FromQuery] string? callbackUrl) { if (string.IsNullOrEmpty(callbackUrl)) callbackUrl = "~/slot/" + id; User? user = this.database.UserFromWebRequest(this.Request); if (user == null) return this.Redirect("~/login"); Slot? heartedSlot = await this.database.Slots.FirstOrDefaultAsync(s => s.SlotId == id); if (heartedSlot == null) return this.NotFound(); await this.database.HeartLevel(user, heartedSlot); return this.Redirect(callbackUrl); } [HttpGet("unheart")] public async Task UnheartLevel([FromRoute] int id, [FromQuery] string? callbackUrl) { if (string.IsNullOrEmpty(callbackUrl)) callbackUrl = "~/slot/" + id; User? user = this.database.UserFromWebRequest(this.Request); if (user == null) return this.Redirect("~/login"); Slot? heartedSlot = await this.database.Slots.FirstOrDefaultAsync(s => s.SlotId == id); if (heartedSlot == null) return this.NotFound(); await this.database.UnheartLevel(user, heartedSlot); return this.Redirect(callbackUrl); } [HttpGet("queue")] public async Task QueueLevel([FromRoute] int id, [FromQuery] string? callbackUrl) { if (string.IsNullOrEmpty(callbackUrl)) callbackUrl = "~/slot/" + id; User? user = this.database.UserFromWebRequest(this.Request); if (user == null) return this.Redirect("~/login"); Slot? queuedSlot = await this.database.Slots.FirstOrDefaultAsync(s => s.SlotId == id); if (queuedSlot == null) return this.NotFound(); await this.database.QueueLevel(user, queuedSlot); return this.Redirect(callbackUrl); } [HttpGet("unqueue")] public async Task UnqueueLevel([FromRoute] int id, [FromQuery] string? callbackUrl) { if (string.IsNullOrEmpty(callbackUrl)) callbackUrl = "~/slot/" + id; User? user = this.database.UserFromWebRequest(this.Request); if (user == null) return this.Redirect("~/login"); Slot? queuedSlot = await this.database.Slots.FirstOrDefaultAsync(s => s.SlotId == id); if (queuedSlot == null) return this.NotFound(); await this.database.UnqueueLevel(user, queuedSlot); return this.Redirect(callbackUrl); } }