99 lines
4.4 KiB
C#
99 lines
4.4 KiB
C#
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.Enums;
|
||
using PlaylistShared.Shared.Yandex;
|
||
using PlaylistShared.Shared.SharedPlaylist;
|
||
using YandexMusic;
|
||
|
||
namespace PlaylistShared.Api.Controllers;
|
||
|
||
[ApiController]
|
||
[Route("api/[controller]")]
|
||
[Authorize]
|
||
public class PlaylistsController : ControllerBase
|
||
{
|
||
private readonly UserManager<ApplicationUser> _userManager;
|
||
private readonly SharedPlaylistService _sharedService;
|
||
private readonly YandexMusicService _yandexService;
|
||
|
||
public PlaylistsController(
|
||
UserManager<ApplicationUser> userManager,
|
||
SharedPlaylistService sharedService,
|
||
YandexMusicService yandexService)
|
||
{
|
||
_userManager = userManager;
|
||
_sharedService = sharedService;
|
||
_yandexService = yandexService;
|
||
}
|
||
|
||
[HttpGet]
|
||
public async Task<ActionResult<ApiResponse<List<YandexPlaylistShare>>>> 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<object>.Fail(new ErrorResponse { StatusCode = 400, Message = "Токен Яндекс.Музыки не установлен или недействителен" }));
|
||
|
||
var yandexClient = new YandexMusicClient();
|
||
var authSuccess = await yandexClient.Authorize(decryptedToken);
|
||
if (!authSuccess)
|
||
return BadRequest(ApiResponse<object>.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 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();
|
||
|
||
return Ok(ApiResponse<List<YandexPlaylistShare>>.Ok(result));
|
||
}
|
||
|
||
[HttpPost("share")]
|
||
public async Task<ActionResult<ApiResponse<SharedPlaylistDto>>> 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<object>.Fail(new ErrorResponse { StatusCode = 400, Message = "Плейлист не принадлежит вам" }));
|
||
|
||
var dto = new SharePlaylistDto
|
||
{
|
||
YandexPlaylistUuid = playlist.PlaylistUuid,
|
||
YandexPlaylistKind = request.Kind,
|
||
YandexPlaylistOwnerUid = request.OwnerUid,
|
||
Title = playlist.Title,
|
||
Description = playlist.Description,
|
||
ViewPermission = ViewPermission.Everyone,
|
||
PlayPermission = ViewPermission.Everyone,
|
||
AddPermission = EditPermission.AuthorizedOnly,
|
||
RemovePermission = EditPermission.AddedByUserOnly,
|
||
};
|
||
|
||
var result = await _sharedService.CreateAsync(userId, dto);
|
||
return Ok(ApiResponse<SharedPlaylistDto>.Ok(result));
|
||
}
|
||
} |