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.DTO; using PlaylistShared.Shared.Enums; using PlaylistShared.Shared.Models; using YandexMusic; namespace PlaylistShared.Api.Controllers; [ApiController] [Route("api/[controller]")] [Authorize] public class PlaylistsController : ControllerBase { private readonly UserManager _userManager; private readonly SharedPlaylistService _sharedService; private readonly YandexMusicService _yandexService; public PlaylistsController( UserManager userManager, SharedPlaylistService sharedService, YandexMusicService yandexService) { _userManager = userManager; _sharedService = sharedService; _yandexService = yandexService; } [HttpGet] public async Task>>> GetMyPlaylists() { var userId = User.GetUserId(); var user = await _userManager.FindByIdAsync(userId.ToString()); if (user == null) return Unauthorized(); var decryptedToken = _yandexService.DecryptToken(user.YandexAccessToken); if (string.IsNullOrEmpty(decryptedToken)) return BadRequest(ApiResponse.Fail(new ErrorResponse { StatusCode = 400, Message = "Токен Яндекс.Музыки не установлен или недействителен" })); var yandexClient = new YandexMusicClient(); var authSuccess = await yandexClient.Authorize(decryptedToken); if (!authSuccess) return BadRequest(ApiResponse.Fail(new ErrorResponse { StatusCode = 400, Message = "Не удалось авторизоваться в Яндекс.Музыке. Проверьте токен." })); var favorites = await yandexClient.GetFavoritesAsync(); var ownPlaylists = favorites.Where(p => p.Owner.Uid == yandexClient.Account.Uid).ToList(); var sharedPlaylists = await _sharedService.GetAllByUserAsync(userId); var result = ownPlaylists.Select(p => new YandexPlaylistInfo { Kind = p.Kind, OwnerUid = p.Owner.Uid, Title = p.Title, CoverUrl = p.Cover?.GetUrl() ?? "", TrackCount = p.TrackCount, IsShared = sharedPlaylists.Any(s => s.YandexPlaylistKind == p.Kind && s.YandexPlaylistOwnerUid == p.Owner.Uid), ShareToken = sharedPlaylists.FirstOrDefault(s => s.YandexPlaylistKind == p.Kind && s.YandexPlaylistOwnerUid == p.Owner.Uid)?.ShareToken, }).ToList(); return Ok(ApiResponse>.Ok(result)); } [HttpPost("share")] public async Task>> SharePlaylist([FromBody] SharePlaylistRequest request) { var userId = User.GetUserId(); var user = await _userManager.FindByIdAsync(userId.ToString()); if (user == null) return Unauthorized(); // Проверяем, что плейлист действительно принадлежит пользователю var yandexClient = new YandexMusicClient(); await yandexClient.Authorize(_yandexService.DecryptToken(user.YandexAccessToken)); var playlist = await yandexClient.GetPlaylistAsync(request.OwnerUid, request.Kind); if (playlist == null || playlist.Owner.Uid != yandexClient.Account.Uid) return BadRequest(ApiResponse.Fail(new ErrorResponse { StatusCode = 400, Message = "Плейлист не принадлежит вам" })); var dto = new SharePlaylistDto { YandexPlaylistKind = request.Kind, YandexPlaylistOwnerUid = request.OwnerUid, Title = playlist.Title, Description = playlist.Description, ViewPermission = ViewPermission.Everyone, AddPermission = EditPermission.AuthorizedOnly, RemovePermission = EditPermission.AddedByUserOnly }; var result = await _sharedService.CreateAsync(userId, dto); return Ok(ApiResponse.Ok(result)); } }