using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using UniVerse.Application.DTOs.Common; using UniVerse.Application.DTOs.Reviews; using UniVerse.Application.Interfaces; using System.Security.Claims; namespace UniVerse.Api.Controllers; [ApiController] [Route("api/v1/reviews")] [Authorize] public class ReviewsController : ControllerBase { private readonly IReviewService _reviews; public ReviewsController(IReviewService reviews) => _reviews = reviews; private int CurrentUserId => int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier) ?? User.FindFirstValue("sub") ?? "0"); [Authorize(Roles = "Student")] [HttpPost] public async Task> Create([FromBody] CreateReviewRequest req) => CreatedAtAction(nameof(Get), new { id = 0 }, await _reviews.CreateAsync(CurrentUserId, req)); [HttpGet("{id:int}")] public async Task> Get(int id) => Ok(await _reviews.GetByIdAsync(id)); [HttpPut("{id:int}")] public async Task> Update(int id, [FromBody] UpdateReviewRequest req) => Ok(await _reviews.UpdateAsync(id, CurrentUserId, req)); [HttpDelete("{id:int}")] public async Task Delete(int id) { await _reviews.DeleteAsync(id, CurrentUserId, User.IsInRole("Admin")); return NoContent(); } [Authorize(Roles = "Admin")] [HttpGet("pending")] public async Task Pending([FromQuery] PaginationRequest pagination) => Ok(await _reviews.GetPendingAsync(pagination)); [Authorize(Roles = "Admin")] [HttpPost("{id:int}/reanalyze")] public async Task Reanalyze(int id) { await _reviews.ReanalyzeAsync(id); return NoContent(); } }