95 lines
3.8 KiB
C#
95 lines
3.8 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.SharedPlaylist;
|
|
using PlaylistShared.Shared.Yandex;
|
|
|
|
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();
|
|
|
|
if (string.IsNullOrEmpty(user.YandexAccessToken))
|
|
return BadRequest(ApiResponse<object>.Fail(new ErrorResponse { StatusCode = 400, Message = "Токен Яндекс.Музыки не установлен или недействителен" }));
|
|
|
|
List<YandexPlaylistShare> 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<object>.Fail(new ErrorResponse { StatusCode = 400, Message = ex.Message }));
|
|
}
|
|
|
|
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 playlist = await _yandexService.GetPlaylistAsync(user, request.OwnerUid, request.Kind);
|
|
if (playlist == null)
|
|
return BadRequest(ApiResponse<object>.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<SharedPlaylistDto>.Ok(result));
|
|
}
|
|
}
|