using FlatRender.ContentSvc.Application.Services; using FlatRender.ContentSvc.Models.Requests; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace FlatRender.ContentSvc.Controllers; [ApiController] [Route("v1")] public class TaxonomyController(TaxonomyService svc) : ControllerBase { // ── Categories ──────────────────────────────────────────────────────────── [HttpGet("categories")] public async Task GetCategories() => Ok(await svc.GetCategoryTreeAsync()); [Authorize(Roles = "Admin")] [HttpPost("categories")] public async Task CreateCategory([FromBody] CreateCategoryRequest req) => Ok(await svc.CreateCategoryAsync(req)); [Authorize(Roles = "Admin")] [HttpPut("categories/{id:guid}")] public async Task UpdateCategory(Guid id, [FromBody] UpdateCategoryRequest req) => Ok(await svc.UpdateCategoryAsync(id, req)); [Authorize(Roles = "Admin")] [HttpDelete("categories/{id:guid}")] public async Task DeleteCategory(Guid id) { await svc.DeleteCategoryAsync(id); return NoContent(); } // ── Tags ────────────────────────────────────────────────────────────────── [HttpGet("tags")] public async Task GetTags( [FromQuery] int page = 1, [FromQuery] int pageSize = 50, [FromQuery] string? search = null) => Ok(await svc.GetTagsAsync(page, pageSize, search)); [Authorize(Roles = "Admin")] [HttpPost("tags")] public async Task CreateTag([FromBody] CreateTagRequest req) => Ok(await svc.CreateTagAsync(req)); [Authorize(Roles = "Admin")] [HttpPut("tags/{id:guid}")] public async Task UpdateTag(Guid id, [FromBody] UpdateTagRequest req) => Ok(await svc.UpdateTagAsync(id, req)); [Authorize(Roles = "Admin")] [HttpDelete("tags/{id:guid}")] public async Task DeleteTag(Guid id) { await svc.DeleteTagAsync(id); return NoContent(); } // ── Fonts ───────────────────────────────────────────────────────────────── [HttpGet("fonts")] public async Task GetFonts( [FromQuery] int page = 1, [FromQuery] int pageSize = 50, [FromQuery] string? search = null, [FromQuery] string? direction = null) => Ok(await svc.GetFontsAsync(page, pageSize, search, direction)); [Authorize(Roles = "Admin")] [HttpPost("fonts")] public async Task CreateFont([FromBody] CreateFontRequest req) => Ok(await svc.CreateFontAsync(req)); [Authorize(Roles = "Admin")] [HttpPut("fonts/{id:guid}")] public async Task UpdateFont(Guid id, [FromBody] UpdateFontRequest req) => Ok(await svc.UpdateFontAsync(id, req)); [Authorize(Roles = "Admin")] [HttpDelete("fonts/{id:guid}")] public async Task DeleteFont(Guid id) { await svc.DeleteFontAsync(id); return NoContent(); } // ── Music Tracks ────────────────────────────────────────────────────────── [HttpGet("music")] public async Task GetMusicTracks( [FromQuery] int page = 1, [FromQuery] int pageSize = 50, [FromQuery] string? search = null) => Ok(await svc.GetMusicTracksAsync(page, pageSize, search)); [Authorize(Roles = "Admin")] [HttpPost("music")] public async Task CreateMusicTrack([FromBody] CreateMusicTrackRequest req) => Ok(await svc.CreateMusicTrackAsync(req)); [Authorize(Roles = "Admin")] [HttpDelete("music/{id:guid}")] public async Task DeleteMusicTrack(Guid id) { await svc.DeleteMusicTrackAsync(id); return NoContent(); } }