53 lines
1.7 KiB
C#
53 lines
1.7 KiB
C#
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<GetChannelsRequest, IReadOnlyCollection<ChannelDto>>
|
|
{
|
|
public override void Configure()
|
|
{
|
|
Get("/api/channels");
|
|
Options(o => o.WithTags("Channels"));
|
|
}
|
|
|
|
public override async Task HandleAsync(GetChannelsRequest request, CancellationToken ct)
|
|
{
|
|
IQueryable<Channel> query = dbContext.Channels.AsQueryable();
|
|
|
|
if (!accessScopeService.IsManager(User))
|
|
{
|
|
IReadOnlyCollection<Guid> 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<ChannelDto> 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);
|
|
}
|
|
}
|