using AutoMapper; using Microsoft.EntityFrameworkCore; using PlaylistShared.Api.Data; using PlaylistShared.Api.Entities; using PlaylistShared.Shared.DTO; using PlaylistShared.Shared.Enums; using PlaylistShared.Shared.Models; namespace PlaylistShared.Api.Services; public class SharedPlaylistService { private readonly ApplicationDbContext _db; private readonly IMapper _mapper; private readonly TrackAdditionLogService _trackLogService; public SharedPlaylistService(ApplicationDbContext db, IMapper mapper, TrackAdditionLogService trackLogService) { _db = db; _mapper = mapper; _trackLogService = trackLogService; } public async Task CreateAsync(Guid creatorUserId, SharePlaylistDto dto) { var entity = new SharedPlaylistEntity { Id = Guid.NewGuid(), CreatorUserId = creatorUserId, YandexPlaylistKind = dto.YandexPlaylistKind, YandexPlaylistOwnerUid = dto.YandexPlaylistOwnerUid, Title = dto.Title, Description = dto.Description, CreatedAt = DateTime.UtcNow, UpdatedAt = DateTime.UtcNow, ShareToken = GenerateToken(), ViewPermission = dto.ViewPermission, AddPermission = dto.AddPermission, RemovePermission = dto.RemovePermission }; _db.SharedPlaylists.Add(entity); await _db.SaveChangesAsync(); return _mapper.Map(entity); } public async Task GetByTokenAsync(string token) { var entity = await _db.SharedPlaylists .Include(sp => sp.Creator) .FirstOrDefaultAsync(sp => sp.ShareToken == token && !sp.IsDeleted); return entity == null ? null : _mapper.Map(entity); } public async Task GetEntityByTokenAsync(string token) { return await _db.SharedPlaylists .Include(sp => sp.Creator) .FirstOrDefaultAsync(sp => sp.ShareToken == token && !sp.IsDeleted); } public async Task UpdatePermissionsAsync(Guid playlistId, UpdatePermissionsDto dto) { var entity = await _db.SharedPlaylists.FindAsync(playlistId); if (entity == null) return null; entity.ViewPermission = dto.ViewPermission; entity.AddPermission = dto.AddPermission; entity.RemovePermission = dto.RemovePermission; entity.UpdatedAt = DateTime.UtcNow; await _db.SaveChangesAsync(); return _mapper.Map(entity); } public async Task DeleteAsync(Guid playlistId) { var entity = await _db.SharedPlaylists.FindAsync(playlistId); if (entity == null) return false; entity.IsDeleted = true; entity.UpdatedAt = DateTime.UtcNow; await _db.SaveChangesAsync(); return true; } public async Task CanViewAsync(SharedPlaylistEntity playlist, Guid? currentUserId) { if (currentUserId == playlist.CreatorUserId) return true; return playlist.ViewPermission == ViewPermission.Everyone || (playlist.ViewPermission == ViewPermission.AuthorizedOnly && currentUserId.HasValue); } public async Task CanAddTrackAsync(SharedPlaylistEntity playlist, Guid? currentUserId) { if (currentUserId == playlist.CreatorUserId) return true; return playlist.AddPermission == EditPermission.Everyone || (playlist.AddPermission == EditPermission.AuthorizedOnly && currentUserId.HasValue); } public async Task CanRemoveTrackAsync(SharedPlaylistEntity playlist, Guid? currentUserId, string trackId) { if (currentUserId == playlist.CreatorUserId) return true; return playlist.RemovePermission switch { EditPermission.Everyone => true, EditPermission.AuthorizedOnly => currentUserId.HasValue, EditPermission.AddedByUserOnly when currentUserId.HasValue => await _trackLogService.IsTrackAddedByUserAsync(playlist.Id, trackId, currentUserId.Value), _ => false }; } public async Task IsCreatorAsync(Guid playlistId, Guid userId) { var playlist = await _db.SharedPlaylists.FindAsync(playlistId); return playlist != null && playlist.CreatorUserId == userId; } private string GenerateToken() { return Convert.ToBase64String(Guid.NewGuid().ToByteArray()) .Replace("/", "_") .Replace("+", "-") .TrimEnd('='); } public async Task> GetAllByUserAsync(Guid userId) { return await _db.SharedPlaylists .Where(sp => sp.CreatorUserId == userId && !sp.IsDeleted) .ToListAsync(); } }