100 lines
3.7 KiB
C#
100 lines
3.7 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using PlaylistShared.Api.Data;
|
|
using PlaylistShared.Api.Entities;
|
|
using PlaylistShared.Shared.SharedPlaylist;
|
|
|
|
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();
|
|
}
|
|
} |