using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using PlaylistShared.Api.Entities; using PlaylistShared.Api.Extensions; using PlaylistShared.Api.Services; using PlaylistShared.Shared; using PlaylistShared.Shared.Shared; namespace PlaylistShared.Api.Controllers; [ApiController] [Route("api/[controller]")] [Authorize] public class FavoritesController : ControllerBase { private readonly UserManager _userManager; private readonly FavoritesService _favoritesService; private readonly SharedPlaylistService _sharedPlaylistService; public FavoritesController( UserManager userManager, FavoritesService favoritesService, SharedPlaylistService sharedPlaylistService) { _userManager = userManager; _favoritesService = favoritesService; _sharedPlaylistService = sharedPlaylistService; } /// Получить список избранных плейлистов текущего пользователя. [HttpGet] public async Task>>> GetFavorites() { var userId = User.GetUserId(); var user = await _userManager.FindByIdAsync(userId.ToString()); if (user == null) return Unauthorized(); var favorites = await _favoritesService.GetUserFavoritesAsync(userId); return Ok(ApiResponse>.Ok(favorites)); } /// Проверить, добавлен ли плейлист в избранное. [HttpGet("{shareToken}/check")] public async Task>> CheckFavorite(string shareToken) { var userId = User.GetUserId(); var user = await _userManager.FindByIdAsync(userId.ToString()); if (user == null) return Unauthorized(); var isFavorite = await _favoritesService.IsFavoriteAsync(userId, shareToken); return Ok(ApiResponse.Ok(isFavorite)); } /// Добавить плейлист в избранное. [HttpPost("{shareToken}")] public async Task>> AddFavorite(string shareToken) { var userId = User.GetUserId(); var user = await _userManager.FindByIdAsync(userId.ToString()); if (user == null) return Unauthorized(); var playlist = await _sharedPlaylistService.GetEntityByTokenAsync(shareToken); if (playlist == null) return NotFound(ApiResponse.Fail(new ErrorResponse { StatusCode = 404, Message = "Плейлист не найден" })); await _favoritesService.AddFavoriteAsync(userId, shareToken); return Ok(ApiResponse.Ok(new { message = "Плейлист добавлен в избранное" })); } /// Удалить плейлист из избранного. [HttpDelete("{shareToken}")] public async Task>> RemoveFavorite(string shareToken) { var userId = User.GetUserId(); var user = await _userManager.FindByIdAsync(userId.ToString()); if (user == null) return Unauthorized(); await _favoritesService.RemoveFavoriteAsync(userId, shareToken); return Ok(ApiResponse.Ok(new { message = "Плейлист удалён из избранного" })); } }