Добавлены избранные плейлисты
This commit is contained in:
100
PlaylistShared.Api/Services/FavoritesService.cs
Normal file
100
PlaylistShared.Api/Services/FavoritesService.cs
Normal file
@@ -0,0 +1,100 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using PlaylistShared.Api.Data;
|
||||
using PlaylistShared.Api.Entities;
|
||||
using PlaylistShared.Shared.Shared;
|
||||
|
||||
namespace PlaylistShared.Api.Services;
|
||||
|
||||
public class FavoritesService
|
||||
{
|
||||
private readonly ApplicationDbContext _db;
|
||||
private readonly SharedPlaylistService _sharedPlaylistService;
|
||||
|
||||
public FavoritesService(ApplicationDbContext db, SharedPlaylistService sharedPlaylistService)
|
||||
{
|
||||
_db = db;
|
||||
_sharedPlaylistService = sharedPlaylistService;
|
||||
}
|
||||
|
||||
public async Task<bool> IsFavoriteAsync(Guid userId, string shareToken)
|
||||
{
|
||||
var playlist = await _sharedPlaylistService.GetEntityByTokenAsync(shareToken);
|
||||
if (playlist == null) return false;
|
||||
return await _db.FavoritePlaylists
|
||||
.AnyAsync(f => f.UserId == userId && f.SharedPlaylistId == playlist.Id);
|
||||
}
|
||||
|
||||
public async Task AddFavoriteAsync(Guid userId, string shareToken)
|
||||
{
|
||||
var playlist = await _sharedPlaylistService.GetEntityByTokenAsync(shareToken);
|
||||
if (playlist == null)
|
||||
throw new ArgumentException("Playlist not found");
|
||||
|
||||
var exists = await _db.FavoritePlaylists
|
||||
.AnyAsync(f => f.UserId == userId && f.SharedPlaylistId == playlist.Id);
|
||||
if (exists) return;
|
||||
|
||||
var favorite = new FavoritePlaylist
|
||||
{
|
||||
UserId = userId,
|
||||
SharedPlaylistId = playlist.Id,
|
||||
AddedAtUtc = DateTime.UtcNow
|
||||
};
|
||||
_db.FavoritePlaylists.Add(favorite);
|
||||
await _db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
public async Task RemoveFavoriteAsync(Guid userId, string shareToken)
|
||||
{
|
||||
var playlist = await _sharedPlaylistService.GetEntityByTokenAsync(shareToken);
|
||||
if (playlist == null) return;
|
||||
|
||||
var favorite = await _db.FavoritePlaylists
|
||||
.FirstOrDefaultAsync(f => f.UserId == userId && f.SharedPlaylistId == playlist.Id);
|
||||
if (favorite != null)
|
||||
{
|
||||
_db.FavoritePlaylists.Remove(favorite);
|
||||
await _db.SaveChangesAsync();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<List<SharedPlaylistDto>> GetUserFavoritesAsync(Guid userId)
|
||||
{
|
||||
var favoritePlaylists = await _db.FavoritePlaylists
|
||||
.Include(f => f.SharedPlaylist)
|
||||
.ThenInclude(sp => sp.Creator)
|
||||
.Where(f => f.UserId == userId)
|
||||
.OrderByDescending(f => f.AddedAtUtc)
|
||||
.Select(f => f.SharedPlaylist)
|
||||
.ToListAsync();
|
||||
|
||||
// Маппинг в DTO (можно использовать AutoMapper, но для простоты сделаем вручную)
|
||||
return favoritePlaylists.Select(sp => new SharedPlaylistDto
|
||||
{
|
||||
Id = sp.Id,
|
||||
CreatorUserId = sp.CreatorUserId,
|
||||
YandexPlaylistUuid = sp.YandexPlaylistUuid,
|
||||
YandexPlaylistKind = sp.YandexPlaylistKind,
|
||||
YandexPlaylistOwnerUid = sp.YandexPlaylistOwnerUid,
|
||||
Title = sp.Title,
|
||||
Description = sp.Description,
|
||||
CoverUrl = sp.CoverUrl,
|
||||
CreatedAt = sp.CreatedAt,
|
||||
UpdatedAt = sp.UpdatedAt,
|
||||
IsDeleted = sp.IsDeleted,
|
||||
ShareToken = sp.ShareToken,
|
||||
ViewPermission = sp.ViewPermission,
|
||||
PlayPermission = sp.PlayPermission,
|
||||
AddPermission = sp.AddPermission,
|
||||
RemovePermission = sp.RemovePermission,
|
||||
Creator = sp.Creator != null ? new Shared.Auth.ApplicationUserDto
|
||||
{
|
||||
Id = sp.Creator.Id,
|
||||
UserName = sp.Creator.UserName,
|
||||
Email = sp.Creator.Email,
|
||||
YandexId = sp.Creator.YandexId,
|
||||
DisplayName = sp.Creator.UserName
|
||||
} : null
|
||||
}).ToList();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user