Добавлен playlist shared

This commit is contained in:
FrigaT
2026-04-11 15:41:24 +03:00
parent 8444fc5f8e
commit ba9d97239e
84 changed files with 61796 additions and 0 deletions

View File

@@ -0,0 +1,93 @@
// Controllers/TrackController.cs
using Microsoft.AspNetCore.Mvc;
namespace PlaylistShared.Controllers;
[ApiController]
[Microsoft.AspNetCore.Mvc.Route("api/tracks")]
[Authorize]
public class TrackController : ControllerBase
{
private readonly AppDbContext _db;
private readonly IYandexMusicService _yandex;
public TrackController(AppDbContext db, IYandexMusicService yandex)
{
_db = db;
_yandex = yandex;
}
[HttpPost("add")]
public async Task<IActionResult> AddTrack(Guid playlistId, string trackId, string? trackTitle, string? artist)
{
var playlist = await _db.SharedPlaylists
.Include(p => p.Owner)
.FirstOrDefaultAsync(p => p.Id == playlistId);
if (playlist == null) return NotFound();
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
if (!CanAdd(playlist, userId)) return Forbid();
// Добавляем в Яндекс
await _yandex.AddTrackToPlaylistAsync(playlist.OwnerUserId, playlist.YandexPlaylistId, trackId);
// Сохраняем информацию о треке в кеш
var track = new PlaylistTrack
{
Id = Guid.NewGuid(),
PlaylistId = playlist.Id,
YandexTrackId = trackId,
Title = trackTitle ?? "Unknown",
Artist = artist,
AddedByUserId = userId,
AddedAt = DateTime.UtcNow
};
_db.PlaylistTracks.Add(track);
await _db.SaveChangesAsync();
return Ok();
}
[HttpDelete("remove")]
public async Task<IActionResult> RemoveTrack(Guid playlistId, string trackId)
{
var playlist = await _db.SharedPlaylists
.Include(p => p.Owner)
.FirstOrDefaultAsync(p => p.Id == playlistId);
if (playlist == null) return NotFound();
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
var trackEntry = await _db.PlaylistTracks
.FirstOrDefaultAsync(t => t.PlaylistId == playlistId && t.YandexTrackId == trackId);
if (!CanDelete(playlist, userId, trackEntry?.AddedByUserId))
return Forbid();
await _yandex.RemoveTrackFromPlaylistAsync(playlist.OwnerUserId, playlist.YandexPlaylistId, trackId);
if (trackEntry != null) _db.PlaylistTracks.Remove(trackEntry);
await _db.SaveChangesAsync();
return Ok();
}
private bool CanAdd(SharedPlaylist playlist, string? userId)
{
return playlist.Permissions.Add switch
{
AccessLevel.All => true,
AccessLevel.Authorized => userId != null,
AccessLevel.None => false,
_ => false
};
}
private bool CanDelete(SharedPlaylist playlist, string? userId, string? adderUserId)
{
if (userId == playlist.OwnerUserId) return true; // владелец всегда может удалить
return playlist.Permissions.Delete switch
{
DeleteAccessLevel.All => true,
DeleteAccessLevel.Authorized => userId != null,
DeleteAccessLevel.AdderOnly => userId != null && userId == adderUserId,
DeleteAccessLevel.OwnerOnly => false,
_ => false
};
}
}