using Socialize.Infrastructure.Security; using Socialize.Modules.Projects.Data; namespace Socialize.Modules.Projects.Handlers; public record GetProjectsRequest(Guid? WorkspaceId, Guid? ClientId); public record ProjectDto( Guid Id, Guid WorkspaceId, Guid ClientId, string Name, string? Description, string? Notes, string Status, DateTimeOffset StartDate, DateTimeOffset EndDate); public class GetProjectsHandler( AppDbContext dbContext, AccessScopeService accessScopeService) : Endpoint> { public override void Configure() { Get("/api/projects"); Options(o => o.WithTags("Projects")); } public override async Task HandleAsync(GetProjectsRequest request, CancellationToken ct) { IQueryable query = dbContext.Projects.AsQueryable(); if (accessScopeService.IsManager(User)) { if (request.WorkspaceId.HasValue) { query = query.Where(project => project.WorkspaceId == request.WorkspaceId.Value); } } else { IReadOnlyCollection workspaceScopeIds = User.GetWorkspaceScopeIds(); IReadOnlyCollection clientScopeIds = User.GetClientScopeIds(); IReadOnlyCollection projectScopeIds = User.GetProjectScopeIds(); query = query.Where(project => workspaceScopeIds.Contains(project.WorkspaceId)); if (clientScopeIds.Count > 0) { query = query.Where(project => clientScopeIds.Contains(project.ClientId)); } if (projectScopeIds.Count > 0) { query = query.Where(project => projectScopeIds.Contains(project.Id)); } } if (request.ClientId.HasValue) { query = query.Where(project => project.ClientId == request.ClientId.Value); } if (request.WorkspaceId.HasValue) { query = query.Where(project => project.WorkspaceId == request.WorkspaceId.Value); } List projects = await query .OrderBy(project => project.Name) .Select(project => new ProjectDto( project.Id, project.WorkspaceId, project.ClientId, project.Name, project.Description, project.Notes, project.Status, project.StartDate, project.EndDate)) .ToListAsync(ct); await SendOkAsync(projects, ct); } }