using Socialize.Infrastructure.Security; using Socialize.Modules.Clients.Data; namespace Socialize.Modules.Clients.Handlers; public record GetClientsRequest(Guid? WorkspaceId); public record ClientDto( Guid Id, Guid WorkspaceId, string Name, string Status, string? PortraitUrl, string? PrimaryContactName, string? PrimaryContactEmail, string? PrimaryContactPortraitUrl); public class GetClientsHandler( AppDbContext dbContext, AccessScopeService accessScopeService) : Endpoint> { public override void Configure() { Get("/api/clients"); Options(o => o.WithTags("Clients")); } public override async Task HandleAsync(GetClientsRequest request, CancellationToken ct) { IQueryable query = dbContext.Clients.AsQueryable(); if (accessScopeService.IsManager(User)) { if (request.WorkspaceId.HasValue) { query = query.Where(client => client.WorkspaceId == request.WorkspaceId.Value); } } else { IReadOnlyCollection workspaceScopeIds = User.GetWorkspaceScopeIds(); IReadOnlyCollection clientScopeIds = User.GetClientScopeIds(); query = query.Where(client => workspaceScopeIds.Contains(client.WorkspaceId)); if (clientScopeIds.Count > 0) { query = query.Where(client => clientScopeIds.Contains(client.Id)); } if (request.WorkspaceId.HasValue) { query = query.Where(client => client.WorkspaceId == request.WorkspaceId.Value); } } List clients = await query .OrderBy(client => client.Name) .Select(client => new ClientDto( client.Id, client.WorkspaceId, client.Name, client.Status, client.PortraitUrl, client.PrimaryContactName, client.PrimaryContactEmail, client.PrimaryContactPortraitUrl)) .ToListAsync(ct); await SendOkAsync(clients, ct); } }