using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using eprintServer.Services; using eprintServer.Requests; using eprintServer.Responses; using eprintServer.Interfaces; namespace eprintServer.Controllers; [ApiController] [Route("api/v1/cms/blogs")] [Authorize(Roles = "ADMIN,SUB_ADMIN")] public class BlogController : ControllerBase { private readonly BlogService _blogService; private readonly IFileStorageService _fileStorageService; public BlogController(BlogService blogService, IFileStorageService fileStorageService) { _blogService = blogService; _fileStorageService = fileStorageService; } [HttpGet] public async Task>> GetBlogPosts() { var blogs = await _blogService.GetAllBlogPostsAsync(); var response = blogs .Select(BlogPostResponse.FromEntity) .ToList(); return Ok(response); } [HttpGet("{blogId:int}")] public async Task> GetBlogPost(int blogId) { var blog = await _blogService.GetBlogPostByIdAsync(blogId); if (blog == null) { return NotFound($"Blog post with ID {blogId} not found."); } return Ok(BlogPostResponse.FromEntity(blog)); } [HttpPost] public async Task> CreateBlogPost([FromBody] CreateBlogPostRequest request) { var blog = await _blogService.CreateBlogPostAsync(request); return CreatedAtAction(nameof(GetBlogPost), new { blogId = blog.Id }, BlogPostResponse.FromEntity(blog)); } [HttpPut("{blogId:int}")] public async Task> UpdateBlogPost(int blogId, [FromBody] UpdateBlogPostRequest request) { var updatedBlog = await _blogService.UpdateBlogPostAsync(blogId, request); if (updatedBlog == null) { return NotFound($"Blog post with ID {blogId} not found."); } return Ok(BlogPostResponse.FromEntity(updatedBlog)); } [HttpDelete("{blogId:int}")] public async Task DeleteBlogPost(int blogId) { var deleted = await _blogService.DeleteBlogPostAsync(blogId); if (!deleted) { return NotFound($"Blog post with ID {blogId} not found."); } return NoContent(); } [HttpPatch("{blogId:int}/status")] public async Task> ToggleBlogPostStatus(int blogId, [FromBody] ToggleBlogPostStatusRequest request) { var toggledBlog = await _blogService.ToggleBlogPostStatusAsync(blogId, request.Published); if (toggledBlog == null) { return NotFound($"Blog post with ID {blogId} not found."); } return Ok(BlogPostResponse.FromEntity(toggledBlog)); } [HttpPost("{blogId:int}/upload-image")] public async Task> UploadBlogImage(int blogId, IFormFile image) { if (image == null || image.Length == 0) { return BadRequest("An image file is required."); } try { const string SubDirectory = "blogImages"; var fileModel = await _fileStorageService.SaveFileAsync(image, SubDirectory); var updatedBlog = await _blogService.UpdateBlogImageAsync(blogId, fileModel); if (updatedBlog == null) { // Cleanup uploaded file if blog update failed await _fileStorageService.DeleteFileAsync(fileModel.Id); return NotFound($"Blog post with ID {blogId} not found. Image upload failed."); } var response = new BlogImageUploadResponse(fileModel); return Ok(response); } catch (Exception ex) { return StatusCode(500, $"Something went wrong during blog image upload: {ex.Message}"); } } }