Добавление треков
This commit is contained in:
@@ -1,11 +1,12 @@
|
||||
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.Models;
|
||||
|
||||
namespace PlaylistShared.Api.Controllers;
|
||||
using YandexMusic.API.Models.Playlist;
|
||||
|
||||
[ApiController]
|
||||
[Route("api/[controller]")]
|
||||
@@ -13,25 +14,22 @@ public class SharedPlaylistController : ControllerBase
|
||||
{
|
||||
private readonly SharedPlaylistService _sharedService;
|
||||
private readonly YandexMusicService _yandexService;
|
||||
private readonly UserManager<ApplicationUser> _userManager;
|
||||
private readonly TrackAdditionLogService _trackLogService;
|
||||
|
||||
public SharedPlaylistController(SharedPlaylistService sharedService, YandexMusicService yandexService)
|
||||
public SharedPlaylistController(
|
||||
SharedPlaylistService sharedService,
|
||||
YandexMusicService yandexService,
|
||||
UserManager<ApplicationUser> userManager,
|
||||
TrackAdditionLogService trackLogService)
|
||||
{
|
||||
_sharedService = sharedService;
|
||||
_yandexService = yandexService;
|
||||
_userManager = userManager;
|
||||
_trackLogService = trackLogService;
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Authorize]
|
||||
public async Task<ActionResult<ApiResponse<SharedPlaylistDto>>> Create([FromBody] SharePlaylistDto dto)
|
||||
{
|
||||
var userId = User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value;
|
||||
if (string.IsNullOrEmpty(userId) || !Guid.TryParse(userId, out var guid))
|
||||
return Unauthorized();
|
||||
|
||||
var result = await _sharedService.CreateAsync(guid, dto);
|
||||
return Ok(ApiResponse<SharedPlaylistDto>.Ok(result));
|
||||
}
|
||||
|
||||
// GET /api/sharedplaylist/{token}
|
||||
[HttpGet("{token}")]
|
||||
public async Task<ActionResult<ApiResponse<SharedPlaylistDto>>> GetByToken(string token)
|
||||
{
|
||||
@@ -50,6 +48,31 @@ public class SharedPlaylistController : ControllerBase
|
||||
return Ok(ApiResponse<SharedPlaylistDto>.Ok(playlist));
|
||||
}
|
||||
|
||||
// GET /api/sharedplaylist/{token}/tracks
|
||||
[HttpGet("{token}/tracks")]
|
||||
public async Task<ActionResult<ApiResponse<YandexPlaylistData>>> GetTracks(string token)
|
||||
{
|
||||
var currentUserId = User.GetUserIdOrNull();
|
||||
var playlist = await _sharedService.GetEntityByTokenAsync(token);
|
||||
if (playlist == null)
|
||||
return NotFound(ApiResponse<YandexPlaylistData>.Fail(new ErrorResponse { StatusCode = 404, Message = "Плейлист не найден" }));
|
||||
|
||||
if (!await _sharedService.CanViewAsync(playlist, currentUserId))
|
||||
return Unauthorized();
|
||||
|
||||
var creator = await _userManager.FindByIdAsync(playlist.CreatorUserId.ToString());
|
||||
if (creator == null)
|
||||
return StatusCode(500, ApiResponse<YandexPlaylistData>.Fail(new ErrorResponse { StatusCode = 500, Message = "Владелец плейлиста не найден" }));
|
||||
|
||||
var yandexPlaylist = await _yandexService.GetPlaylistAsync(creator, playlist.YandexPlaylistOwnerUid, playlist.YandexPlaylistKind);
|
||||
if (yandexPlaylist == null)
|
||||
return NotFound(ApiResponse<YandexPlaylistData>.Fail(new ErrorResponse { StatusCode = 404, Message = "Плейлист не найден в Яндекс.Музыке" }));
|
||||
|
||||
var dto = MapToYandexPlaylistData(yandexPlaylist);
|
||||
return Ok(ApiResponse<YandexPlaylistData>.Ok(dto));
|
||||
}
|
||||
|
||||
// PUT /api/sharedplaylist/{token}/permissions
|
||||
[HttpPut("{token}/permissions")]
|
||||
[Authorize]
|
||||
public async Task<ActionResult<ApiResponse<SharedPlaylistDto>>> UpdatePermissions(string token, [FromBody] UpdatePermissionsDto dto)
|
||||
@@ -68,4 +91,90 @@ public class SharedPlaylistController : ControllerBase
|
||||
|
||||
return Ok(ApiResponse<SharedPlaylistDto>.Ok(updated));
|
||||
}
|
||||
|
||||
// POST /api/sharedplaylist/{token}/add-tracks
|
||||
[HttpPost("{token}/add-tracks")]
|
||||
public async Task<ActionResult<ApiResponse<object>>> AddTracks(string token, [FromBody] AddTracksRequest request)
|
||||
{
|
||||
var currentUserId = User.GetUserIdOrNull();
|
||||
var playlist = await _sharedService.GetEntityByTokenAsync(token);
|
||||
if (playlist == null)
|
||||
return NotFound(ApiResponse<object>.Fail(new ErrorResponse { StatusCode = 404, Message = "Плейлист не найден" }));
|
||||
|
||||
if (!await _sharedService.CanAddTrackAsync(playlist, currentUserId))
|
||||
return StatusCode(403, ApiResponse<object>.Fail(new ErrorResponse { StatusCode = 403, Message = "Недостаточно прав для добавления треков" }));
|
||||
|
||||
var creator = await _userManager.FindByIdAsync(playlist.CreatorUserId.ToString());
|
||||
if (creator == null)
|
||||
return StatusCode(500, ApiResponse<object>.Fail(new ErrorResponse { StatusCode = 500, Message = "Владелец плейлиста не найден" }));
|
||||
|
||||
var updatedPlaylist = await _yandexService.AddTracksAsync(creator, playlist.YandexPlaylistOwnerUid, playlist.YandexPlaylistKind, request.TrackIds);
|
||||
if (updatedPlaylist == null)
|
||||
return StatusCode(500, ApiResponse<object>.Fail(new ErrorResponse { StatusCode = 500, Message = "Ошибка при добавлении треков" }));
|
||||
|
||||
return Ok(ApiResponse<object>.Ok(new { message = "Треки добавлены" }));
|
||||
}
|
||||
|
||||
// POST /api/sharedplaylist/{token}/remove-tracks
|
||||
[HttpPost("{token}/remove-tracks")]
|
||||
public async Task<ActionResult<ApiResponse<object>>> RemoveTracks(string token, [FromBody] RemoveTracksRequest request)
|
||||
{
|
||||
var currentUserId = User.GetUserIdOrNull();
|
||||
var playlist = await _sharedService.GetEntityByTokenAsync(token);
|
||||
if (playlist == null)
|
||||
return NotFound(ApiResponse<object>.Fail(new ErrorResponse { StatusCode = 404, Message = "Плейлист не найден" }));
|
||||
|
||||
foreach (var trackId in request.TrackIds)
|
||||
{
|
||||
if (!await _sharedService.CanRemoveTrackAsync(playlist, currentUserId, trackId))
|
||||
return StatusCode(403, ApiResponse<object>.Fail(new ErrorResponse { StatusCode = 403, Message = $"Недостаточно прав для удаления трека {trackId}" }));
|
||||
}
|
||||
|
||||
var creator = await _userManager.FindByIdAsync(playlist.CreatorUserId.ToString());
|
||||
if (creator == null)
|
||||
return StatusCode(500, ApiResponse<object>.Fail(new ErrorResponse { StatusCode = 500, Message = "Владелец плейлиста не найден" }));
|
||||
|
||||
var updatedPlaylist = await _yandexService.RemoveTracksAsync(creator, playlist.YandexPlaylistOwnerUid, playlist.YandexPlaylistKind, request.TrackIds);
|
||||
if (updatedPlaylist == null)
|
||||
return StatusCode(500, ApiResponse<object>.Fail(new ErrorResponse { StatusCode = 500, Message = "Ошибка при удалении треков" }));
|
||||
|
||||
foreach (var trackId in request.TrackIds)
|
||||
await _trackLogService.RemoveLogsForTrackAsync(playlist.Id, trackId);
|
||||
|
||||
return Ok(ApiResponse<object>.Ok(new { message = "Треки удалены" }));
|
||||
}
|
||||
|
||||
// POST /api/sharedplaylist/{token}/add-track-by-link
|
||||
[HttpPost("{token}/add-track-by-link")]
|
||||
public async Task<ActionResult<ApiResponse<object>>> AddTrackByLink(string token, [FromBody] AddTrackByLinkRequest request)
|
||||
{
|
||||
var trackId = ExtractTrackIdFromLink(request.Link);
|
||||
if (string.IsNullOrEmpty(trackId))
|
||||
return BadRequest(ApiResponse<object>.Fail(new ErrorResponse { StatusCode = 400, Message = "Неверный формат ссылки" }));
|
||||
|
||||
return await AddTracks(token, new AddTracksRequest { TrackIds = new List<string> { trackId } });
|
||||
}
|
||||
|
||||
private string? ExtractTrackIdFromLink(string link)
|
||||
{
|
||||
var match = System.Text.RegularExpressions.Regex.Match(link, @"/track/(\d+)");
|
||||
return match.Success ? match.Groups[1].Value : null;
|
||||
}
|
||||
|
||||
private YandexPlaylistData MapToYandexPlaylistData(YPlaylist playlist)
|
||||
{
|
||||
return new YandexPlaylistData
|
||||
{
|
||||
Title = playlist.Title ?? "",
|
||||
Description = playlist.Description ?? "",
|
||||
Tracks = playlist.Tracks?.Select(t => new YandexTrack
|
||||
{
|
||||
Id = t.Track?.Id ?? "",
|
||||
Title = t.Track?.Title ?? "",
|
||||
Artists = t.Track?.Artists?.Select(a => a.Name).ToList() ?? new List<string>(),
|
||||
DurationMs = (int)(t.Track?.DurationMs ?? 0),
|
||||
CoverUri = t.Track?.CoverUri ?? ""
|
||||
}).ToList() ?? new List<YandexTrack>()
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user