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.SharedPlaylist; using PlaylistShared.Shared.Yandex; 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(); if (string.IsNullOrEmpty(user.YandexAccessToken)) return BadRequest(ApiResponse.Fail(new ErrorResponse { StatusCode = 400, Message = "Токен Яндекс.Музыки не установлен или недействителен" })); List result; try { var (ownPlaylists, _) = await _yandexService.GetOwnFavoritesAsync(user); var sharedPlaylists = await _sharedService.GetAllByUserAsync(userId); result = (ownPlaylists ?? []).Select(p => new YandexPlaylistShare { 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(); } catch (Exception ex) { return BadRequest(ApiResponse.Fail(new ErrorResponse { StatusCode = 400, Message = ex.Message })); } 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 playlist = await _yandexService.GetPlaylistAsync(user, request.OwnerUid, request.Kind); if (playlist == null) return BadRequest(ApiResponse.Fail(new ErrorResponse { StatusCode = 404, Message = "Плейлист не найден" })); var dto = new SharePlaylistDto { YandexPlaylistUuid = playlist.PlaylistUuid, YandexPlaylistKind = request.Kind, YandexPlaylistOwnerUid = request.OwnerUid, Title = playlist.Title, Description = playlist.Description, ViewPermission = Shared.Enums.ViewPermission.Everyone, PlayPermission = Shared.Enums.ViewPermission.Everyone, AddPermission = Shared.Enums.EditPermission.AuthorizedOnly, RemovePermission = Shared.Enums.EditPermission.AddedByUserOnly, }; var result = await _sharedService.CreateAsync(userId, dto); return Ok(ApiResponse.Ok(result)); } }