diff --git a/Controllers/QuoteAddController.cs b/Controllers/QuoteAddController.cs new file mode 100644 index 0000000..d171711 --- /dev/null +++ b/Controllers/QuoteAddController.cs @@ -0,0 +1,92 @@ +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); + } + } +} \ No newline at end of file diff --git a/Controllers/WeatherForecastController.cs b/Controllers/WeatherForecastController.cs deleted file mode 100644 index f886d77..0000000 --- a/Controllers/WeatherForecastController.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace QuotifyBE.Controllers -{ - [ApiController] - [Route("[controller]")] - public class WeatherForecastController : ControllerBase - { - private static readonly string[] Summaries = new[] - { - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" - }; - - private readonly ILogger _logger; - - public WeatherForecastController(ILogger logger) - { - _logger = logger; - } - - [HttpGet(Name = "GetWeatherForecast")] - public IEnumerable Get() - { - return Enumerable.Range(1, 5).Select(index => new WeatherForecast - { - Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), - TemperatureC = Random.Shared.Next(-20, 55), - Summary = Summaries[Random.Shared.Next(Summaries.Length)] - }) - .ToArray(); - } - } -} diff --git a/DTOs/CreateQuote.cs b/DTOs/CreateQuote.cs new file mode 100644 index 0000000..ca35264 --- /dev/null +++ b/DTOs/CreateQuote.cs @@ -0,0 +1,7 @@ +public record class CreateQuoteRequest +{ + public string Text { get; set; } + public string Author { get; set; } + public List CategoryIds { get; set; } + public string? ImageUrl { get; set; } +}; \ No newline at end of file