using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using RadicadeServer.Clubs; using RadicadeServer.DB; using RadicadeServer.Extensions; using RadicadeServer.Utils; namespace RadicadeServer.Admin { [Route("admin/clubs")] [EnableCors("AdminPanel")] public class AdminClubAPI(RecDBContext db) : Controller { private Task RejectInvalidKey(string key) { return Task.FromResult(key.IsAdminKey() ? null : Unauthorized("Invalid secret")); } [HttpPost("upload/image")] public async Task UploadImage([FromQuery] string key, [FromQuery] long clubId, [FromForm] IFormFile file) { var rejection = await RejectInvalidKey(key); if (rejection != null) return rejection; var clubs = await ClubStore.LoadAsync(db); var club = clubs.FirstOrDefault(x => x.clubId == clubId); if (club == null) return NotFound("Club does not exist."); if (file == null || file.Length == 0) return BadRequest("No file provided."); var allowed = new[] { ".png", ".jpg", ".jpeg", ".gif", ".webp", ".bmp" }; var ext = Path.GetExtension(file.FileName).ToLowerInvariant(); if (string.IsNullOrEmpty(ext) || !allowed.Contains(ext)) return BadRequest($"Unsupported image format '{(string.IsNullOrEmpty(ext) ? "no extension" : ext)}'. Use png/jpg/jpeg/gif/webp."); Directory.CreateDirectory(DBConfig.CDNImages); var name = Guid.NewGuid().ToString() + ext; var path = Path.Join(DBConfig.CDNImages, name); using (var stream = new FileStream(path, FileMode.Create)) { await file.CopyToAsync(stream); } club.imageName = name; await ClubStore.SaveAsync(db, clubs); return Ok($"Uploaded {name}!\nURL: {DBConfig.ServerUrl}/images/img/{name}"); } [HttpGet("set/image")] public async Task SetImage([FromQuery] string key, [FromQuery] long clubId, [FromQuery] string imgName) { var rejection = await RejectInvalidKey(key); if (rejection != null) return rejection; var clubs = await ClubStore.LoadAsync(db); var club = clubs.FirstOrDefault(x => x.clubId == clubId); if (club == null) return NotFound("Club does not exist."); imgName = Path.GetFileName(imgName ?? "").Trim(); if (string.IsNullOrEmpty(imgName)) imgName = ClubStore.DefaultImageName; club.imageName = imgName; await ClubStore.SaveAsync(db, clubs); return Ok($"Set to {imgName}!\nURL: {DBConfig.ServerUrl}/images/img/{imgName}"); } } }