Добавлено управление сессиями

This commit is contained in:
FrigaT
2026-04-14 01:39:25 +03:00
parent 40ea9166d2
commit fbfc6990e6
22 changed files with 1509 additions and 51 deletions

View File

@@ -23,7 +23,7 @@ public class SharedPlaylistService
public async Task<SharedPlaylistDto> CreateAsync(Guid creatorUserId, SharePlaylistDto dto)
{
var entity = new SharedPlaylistEntity
var entity = new SharedPlaylist
{
Id = Guid.NewGuid(),
CreatorUserId = creatorUserId,
@@ -51,7 +51,7 @@ public class SharedPlaylistService
return entity == null ? null : _mapper.Map<SharedPlaylistDto>(entity);
}
public async Task<SharedPlaylistEntity?> GetEntityByTokenAsync(string token)
public async Task<SharedPlaylist?> GetEntityByTokenAsync(string token)
{
return await _db.SharedPlaylists
.Include(sp => sp.Creator)
@@ -80,21 +80,21 @@ public class SharedPlaylistService
return true;
}
public async Task<bool> CanViewAsync(SharedPlaylistEntity playlist, Guid? currentUserId)
public async Task<bool> CanViewAsync(SharedPlaylist playlist, Guid? currentUserId)
{
if (currentUserId == playlist.CreatorUserId) return true;
return playlist.ViewPermission == ViewPermission.Everyone ||
(playlist.ViewPermission == ViewPermission.AuthorizedOnly && currentUserId.HasValue);
}
public async Task<bool> CanAddTrackAsync(SharedPlaylistEntity playlist, Guid? currentUserId)
public async Task<bool> CanAddTrackAsync(SharedPlaylist playlist, Guid? currentUserId)
{
if (currentUserId == playlist.CreatorUserId) return true;
return playlist.AddPermission == EditPermission.Everyone ||
(playlist.AddPermission == EditPermission.AuthorizedOnly && currentUserId.HasValue);
}
public async Task<bool> CanRemoveTrackAsync(SharedPlaylistEntity playlist, Guid? currentUserId, string trackId)
public async Task<bool> CanRemoveTrackAsync(SharedPlaylist playlist, Guid? currentUserId, string trackId, string sessionId)
{
if (currentUserId == playlist.CreatorUserId) return true;
return playlist.RemovePermission switch
@@ -102,7 +102,9 @@ public class SharedPlaylistService
EditPermission.Everyone => true,
EditPermission.AuthorizedOnly => currentUserId.HasValue,
EditPermission.AddedByUserOnly when currentUserId.HasValue =>
await _trackLogService.IsTrackAddedByUserAsync(playlist.Id, trackId, currentUserId.Value),
await _trackLogService.IsTrackAddedByCurrentUserOrSessionAsync(playlist.Id, trackId, currentUserId, sessionId),
EditPermission.AddedByUserOnly when !currentUserId.HasValue =>
await _trackLogService.IsTrackAddedByCurrentUserOrSessionAsync(playlist.Id, trackId, null, sessionId),
_ => false
};
}
@@ -121,7 +123,7 @@ public class SharedPlaylistService
.TrimEnd('=');
}
public async Task<List<SharedPlaylistEntity>> GetAllByUserAsync(Guid userId)
public async Task<List<SharedPlaylist>> GetAllByUserAsync(Guid userId)
{
return await _db.SharedPlaylists
.Where(sp => sp.CreatorUserId == userId && !sp.IsDeleted)

View File

@@ -13,24 +13,26 @@ public class TrackAdditionLogService
_db = db;
}
public async Task LogAdditionAsync(Guid sharedPlaylistId, string trackId, Guid addedByUserId)
public async Task LogAdditionAsync(Guid sharedPlaylistId, string trackId, Guid? addedByUserId, string sessionId)
{
var log = new TrackAdditionLogEntity
var log = new TrackAdditionLog
{
Id = Guid.NewGuid(),
SharedPlaylistId = sharedPlaylistId,
TrackId = trackId,
AddedByUserId = addedByUserId,
AddedAtUtc = DateTime.UtcNow
AddedAtUtc = DateTime.UtcNow,
SessionId = sessionId
};
_db.TrackAdditionLogs.Add(log);
await _db.SaveChangesAsync();
}
public async Task<bool> IsTrackAddedByUserAsync(Guid sharedPlaylistId, string trackId, Guid userId)
public async Task<bool> IsTrackAddedByCurrentUserOrSessionAsync(Guid sharedPlaylistId, string trackId, Guid? userId, string sessionId)
{
return await _db.TrackAdditionLogs
.AnyAsync(l => l.SharedPlaylistId == sharedPlaylistId && l.TrackId == trackId && l.AddedByUserId == userId);
.AnyAsync(l => l.SharedPlaylistId == sharedPlaylistId && l.TrackId == trackId &&
(userId != null ? l.AddedByUserId == userId : l.SessionId == sessionId));
}
public async Task RemoveLogsForTrackAsync(Guid sharedPlaylistId, string trackId)

View File

@@ -0,0 +1,22 @@
using PlaylistShared.Api.Data;
public class TrackRemovalLogService
{
private readonly ApplicationDbContext _db;
public TrackRemovalLogService(ApplicationDbContext db) => _db = db;
public async Task LogRemovalAsync(Guid sharedPlaylistId, string trackId, Guid? removedByUserId, string sessionId)
{
var log = new TrackRemovalLog
{
Id = Guid.NewGuid(),
SharedPlaylistId = sharedPlaylistId,
TrackId = trackId,
RemovedByUserId = removedByUserId,
RemovedAtUtc = DateTime.UtcNow,
SessionId = sessionId
};
_db.TrackRemovalLogs.Add(log);
await _db.SaveChangesAsync();
}
}

View File

@@ -0,0 +1,47 @@
using PlaylistShared.Api.Data;
using PlaylistShared.Api.Entities;
public class UserSessionService
{
private readonly ApplicationDbContext _db;
private readonly IHttpContextAccessor _httpContextAccessor;
public UserSessionService(ApplicationDbContext db, IHttpContextAccessor httpContextAccessor)
{
_db = db;
_httpContextAccessor = httpContextAccessor;
}
public async Task<UserSession> GetOrCreateCurrentSessionAsync(Guid? associatedUserId = null)
{
var httpContext = _httpContextAccessor.HttpContext
?? throw new InvalidOperationException("No HttpContext available");
var sessionId = httpContext.Session.Id;
var now = DateTime.UtcNow;
var session = await _db.UserSessions.FindAsync(sessionId);
if (session == null)
{
session = new UserSession
{
SessionId = sessionId,
ClientIpAddress = httpContext.Connection.RemoteIpAddress?.ToString(),
UserAgent = httpContext.Request.Headers["User-Agent"].ToString(),
FirstSeenUtc = now,
LastSeenUtc = now,
AssociatedUserId = associatedUserId
};
_db.UserSessions.Add(session);
}
else
{
session.LastSeenUtc = now;
if (session.AssociatedUserId == null && associatedUserId != null)
session.AssociatedUserId = associatedUserId;
_db.UserSessions.Update(session);
}
await _db.SaveChangesAsync();
return session;
}
}