using DeluxeBackend.Models; using DeluxeBackend.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System.ComponentModel.DataAnnotations; using System.Text.Json; using System.Text.Json.Serialization; using static DeluxeBackend.Enums; namespace DeluxeBackend.Controllers.Api { [Route("api/images")] [ApiController] public class ImagesController(IJwtService jwt, ILiteDbService db, ICdnService cdn, DiscordBotService discord) : ControllerBase { [HttpGet("v2/named")] public async Task Named() { return Ok(new List()); } [HttpGet("v5/cheered/bulk")] public async Task cheeredBulk() { return Ok(new List()); } [HttpGet("v5/player/{accId}")] public async Task FromPlayer(long accId) { var images = db.SavedImages.Include(x => x.Player).Find(x => x.Player.Id == accId && x.Accessibility == SavedImageAccessibility.Public).OrderByDescending(x => x.Id).Select(image => image.ToDictionary()).ToList(); return Ok(images); } public class SavedImageMetaDTO { [JsonPropertyName("playerIds")] [Required] public required List PlayerIds { get; set; } [JsonPropertyName("savedImageType")] [Required] public required SavedImageType SavedImageType { get; set; } [JsonPropertyName("roomId")] [Required] public required long RoomId { get; set; } [JsonPropertyName("accessibility")] [Required] public required SavedImageAccessibility Accessibility { get; set; } } [HttpPost("v4/uploadsaved")] [Authorize(Roles = "gameClient")] //[Consumes("image/jpeg")] public async Task UploadSaved([FromForm(Name = "image"), Required] IFormFile Image, [FromForm(Name = "imgMeta"), Required] string metaJson) { Account? account = await jwt.GetLogin(User); if (account == null) { return NotFound("User not found in database"); } SavedImageMetaDTO? Meta; try { Meta = JsonSerializer.Deserialize(metaJson); if (Meta == null) return BadRequest("Invalid metadata format."); } catch { return BadRequest("Metadata is not valid JSON."); } using var stream = Image.OpenReadStream(); string? remotePath = await cdn.UploadFile( stream, "img" ); if (remotePath == null) { return StatusCode(500, "Failed to upload image to the CDN."); } SavedImage image = new() { Player = account, PlayerIds = Meta.PlayerIds, ImageName = remotePath, SavedImageType = Meta.SavedImageType, Accessibility = Meta.Accessibility, RoomId = Meta.RoomId == -1 ? null : Meta.RoomId }; db.SavedImages.Insert(image); await discord.SendSavedImg(account, image); return Ok(new { ImageName = remotePath }); } [HttpGet("v6")] public async Task GetByName([FromQuery] string name) { SavedImage? image = db.SavedImages.Include(x => x.Player).FindOne(x => x.ImageName == name); if (image == null) { return NotFound(); } return Ok(image.ToDictionary()); } [HttpGet("v4/room/{roomId}")] public async Task GetByRoom([FromQuery] long roomId) { var images = db.SavedImages.Include(x => x.Player).Find(x => x.RoomId == roomId && x.Accessibility == SavedImageAccessibility.Public).OrderByDescending(x => x.Id).Select(image => image.ToDictionary()).ToList(); return Ok(images); } } }