using System.Data; using Dapper; using PlotLine.Data; namespace PlotLine.Services; public interface IProjectAccessRepository { Task UserCanAccessProjectAsync(int projectId, int userId); Task UserCanOwnProjectAsync(int projectId, int userId); Task UserCanAccessEntityAsync(string entityType, int entityId, int userId); } public interface IProjectAccessService { Task CanAccessProjectAsync(int projectId); Task CanOwnProjectAsync(int projectId); Task CanAccessEntityAsync(string entityType, int entityId); } public sealed class ProjectAccessRepository(ISqlConnectionFactory connectionFactory) : IProjectAccessRepository { public async Task UserCanAccessProjectAsync(int projectId, int userId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.ProjectAccess_UserCanAccess", new { ProjectID = projectId, UserID = userId }, commandType: CommandType.StoredProcedure); } public async Task UserCanOwnProjectAsync(int projectId, int userId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.ProjectAccess_UserCanOwn", new { ProjectID = projectId, UserID = userId }, commandType: CommandType.StoredProcedure); } public async Task UserCanAccessEntityAsync(string entityType, int entityId, int userId) { using var connection = connectionFactory.CreateConnection(); return await connection.QuerySingleAsync( "dbo.ProjectAccess_UserCanAccessEntity", new { EntityType = entityType, EntityID = entityId, UserID = userId }, commandType: CommandType.StoredProcedure); } } public sealed class ProjectAccessService(IProjectAccessRepository access, ICurrentUserService currentUser) : IProjectAccessService { public Task CanAccessProjectAsync(int projectId) { var userId = currentUser.UserId; return userId.HasValue && projectId > 0 ? access.UserCanAccessProjectAsync(projectId, userId.Value) : Task.FromResult(false); } public Task CanOwnProjectAsync(int projectId) { var userId = currentUser.UserId; return userId.HasValue && projectId > 0 ? access.UserCanOwnProjectAsync(projectId, userId.Value) : Task.FromResult(false); } public Task CanAccessEntityAsync(string entityType, int entityId) { var userId = currentUser.UserId; return userId.HasValue && entityId > 0 && !string.IsNullOrWhiteSpace(entityType) ? access.UserCanAccessEntityAsync(entityType, entityId, userId.Value) : Task.FromResult(false); } }