using FastEndpoints; using Microsoft.EntityFrameworkCore; using Socialize.Api.Data; using Socialize.Api.Infrastructure.Security; using Socialize.Api.Modules.Channels.Data; namespace Socialize.Api.Modules.Channels.Handlers; public record GetChannelsRequest(Guid? WorkspaceId); public class GetChannelsHandler( AppDbContext dbContext, AccessScopeService accessScopeService) : Endpoint> { public override void Configure() { Get("/api/channels"); Options(o => o.WithTags("Channels")); } public override async Task HandleAsync(GetChannelsRequest request, CancellationToken ct) { IQueryable query = dbContext.Channels.AsQueryable(); if (!accessScopeService.IsManager(User)) { IReadOnlyCollection workspaceScopeIds = await accessScopeService.GetAccessibleWorkspaceIdsAsync(User, ct); query = query.Where(channel => workspaceScopeIds.Contains(channel.WorkspaceId)); } if (request.WorkspaceId.HasValue) { query = query.Where(channel => channel.WorkspaceId == request.WorkspaceId.Value); } List channels = await query .OrderBy(channel => channel.Network) .ThenBy(channel => channel.Name) .Select(channel => new ChannelDto( channel.Id, channel.WorkspaceId, channel.Name, channel.Network, channel.Handle, channel.ExternalUrl, channel.CreatedAt)) .ToListAsync(ct); await SendOkAsync(channels, ct); } }