using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using TaxBaik.Application.Services; using TaxBaik.Application.DTOs; namespace TaxBaik.Web.Controllers; [ApiController] [Route("api/[controller]")] public class BlogController : ControllerBase { private readonly BlogService _blogService; public BlogController(BlogService blogService) { _blogService = blogService; } [HttpGet] public async Task GetPublished([FromQuery] int page = 1, [FromQuery] int pageSize = 12) { var (items, total) = await _blogService.GetPublishedPagedAsync(page, pageSize); return Ok(new { data = items, total, page, pageSize }); } [HttpGet("{slug}")] public async Task GetBySlug(string slug) { var post = await _blogService.GetBySlugAsync(slug); if (post == null) return NotFound(new { message = "Post not found" }); return Ok(post); } [HttpGet("admin/all")] [Authorize] public async Task GetAll() { var posts = await _blogService.GetAllAsync(); return Ok(posts); } [HttpPost] [Authorize] public async Task Create([FromBody] CreateBlogPostDto dto) { if (string.IsNullOrWhiteSpace(dto.Title) || string.IsNullOrWhiteSpace(dto.Content)) return BadRequest(new { message = "Title and content are required" }); var result = await _blogService.CreateAsync(dto); return CreatedAtAction(nameof(GetBySlug), new { slug = result.Slug }, result); } [HttpPut("{id}")] [Authorize] public async Task Update(int id, [FromBody] CreateBlogPostDto dto) { var result = await _blogService.UpdateAsync(id, dto); if (result == null) return NotFound(new { message = "Post not found" }); return Ok(result); } [HttpDelete("{id}")] [Authorize] public async Task Delete(int id) { await _blogService.DeleteAsync(id); return NoContent(); } }