using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using QuotifyBE.Data; using QuotifyBE.Entities; using System.Security.Claims; using Microsoft.EntityFrameworkCore; namespace QuotifyBE.Controllers { [ApiController] [Route("controller")] public class QuotesController : ControllerBase { private readonly ApplicationDbContext _db; public QuotesController(ApplicationDbContext db) { _db = db; } [HttpPost] [Authorize(Roles = "Admin")] public async Task CreateQuote([FromBody] CreateQuoteRequest request) { // Get user ID from claims var userIdClaim = User.FindFirst(ClaimTypes.NameIdentifier)?.Value; if (userIdClaim == null || !int.TryParse(userIdClaim, out int userId)) return Unauthorized("Invalid user ID"); // Find or create image Image? image = null; if (!string.IsNullOrEmpty(request.ImageUrl)) { image = await _db.Images.FirstOrDefaultAsync(i => i.Url == request.ImageUrl); if (image == null) { image = new Image { Url = request.ImageUrl }; _db.Images.Add(image); await _db.SaveChangesAsync(); } } // Create quote var quote = new Quote { Text = request.Text, Author = request.Author, CreatedAt = DateTime.UtcNow, LastUpdatedAt = DateTime.UtcNow, ImageId = image?.Id ?? 0, UserId = userId, QuoteCategories = new List() }; // Attach categories foreach (var categoryId in request.CategoryIds) { var categoryExists = await _db.Categories.AnyAsync(c => c.Id == categoryId); if (!categoryExists) return BadRequest($"Category ID {categoryId} not found"); quote.QuoteCategories.Add(new QuoteCategory { CategoryId = categoryId, Quote = quote }); } _db.Quotes.Add(quote); await _db.SaveChangesAsync(); return CreatedAtAction(nameof(GetQuoteById), new { id = quote.Id }, quote); } [HttpGet("{id}")] public async Task GetQuoteById(int id) { var quote = await _db.Quotes .Include(q => q.QuoteCategories) .ThenInclude(qc => qc.Category) .Include(q => q.User) .Include(q => q.ImageId) .FirstOrDefaultAsync(q => q.Id == id); if (quote == null) return NotFound(); return Ok(quote); } } }