using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Nuuru.Server.Auth; using Nuuru.Server.Extensions; using Nuuru.Server.Services; using Nuuru.Server.Services.Search; namespace Nuuru.Server.Controllers { [ApiController] [Route("api/booru/posts/{postId:int}/favorite")] public class FavoriteController : ControllerBase { private readonly IFavoriteService _favoriteService; private readonly IDefaultQueryFilterService _defaultQueryFilterService; private readonly ILogger _logger; public FavoriteController( IFavoriteService favoriteService, IDefaultQueryFilterService defaultQueryFilterService, ILogger logger) { _favoriteService = favoriteService; _defaultQueryFilterService = defaultQueryFilterService; _logger = logger; } /// /// Get favorite state for a post /// [HttpGet] [Authorize] public async Task GetFavoriteState(int postId) { try { if (!await _defaultQueryFilterService.IsPostVisibleAsync(postId)) { return NotFound(new { error = "Post not found" }); } var userId = User.GetUserId(); var state = await _favoriteService.GetFavoriteStateAsync(postId, userId); return Ok(state); } catch (Exception ex) { _logger.LogError(ex, "Error getting favorite state for post {PostId}", postId); return StatusCode(500, new { error = "Failed to get favorite state" }); } } /// /// Toggle favorite on a post /// [HttpPost] [Authorize(Policy = Permissions.User.Favorite)] public async Task ToggleFavorite(int postId) { try { var userId = User.GetUserId(); if (userId == null) { return Unauthorized(new { error = "User ID not found in token" }); } if (!await _defaultQueryFilterService.IsPostVisibleAsync(postId)) { return NotFound(new { error = "Post not found" }); } var result = await _favoriteService.ToggleFavoriteAsync(postId, userId.Value); if (result == null) { return NotFound(new { error = "Post not found" }); } return Ok(result); } catch (Exception ex) { _logger.LogError(ex, "Error toggling favorite on post {PostId}", postId); return StatusCode(500, new { error = "Failed to toggle favorite" }); } } } }