50 lines
1.7 KiB
C#
50 lines
1.7 KiB
C#
using System.Security.Claims;
|
|
using FastEndpoints;
|
|
using Knots.DTO.Discussion;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace Knots.Endpoints.Discussion;
|
|
|
|
public class GetMyDiscussionEndpoint(KnotsDbContext db) : EndpointWithoutRequest<List<GetDiscussionDto>>
|
|
{
|
|
public override void Configure()
|
|
{
|
|
Get("/discussions/my");
|
|
}
|
|
|
|
public override async Task HandleAsync(CancellationToken ct)
|
|
{
|
|
int userId = int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!);
|
|
|
|
// Discussions privées : l'utilisateur est l'un des participants
|
|
IQueryable<GetDiscussionDto> privees = db.Discussions
|
|
.Where(d => d.GroupId == null && d.UserDiscussions.Any(ud => ud.UserId == userId))
|
|
.Select(d => new GetDiscussionDto
|
|
{
|
|
Id = d.Id,
|
|
IsGroup = false,
|
|
Name = d.UserDiscussions
|
|
.Where(ud => ud.UserId != userId)
|
|
.Select(ud => ud.User.Username)
|
|
.FirstOrDefault() ?? "",
|
|
MembersCount = null,
|
|
GroupId = null
|
|
});
|
|
|
|
// Discussions de groupe : l'utilisateur est membre du groupe
|
|
IQueryable<GetDiscussionDto> groupes = db.Discussions
|
|
.Where(d => d.Group != null && d.Group.GroupUsers.Any(gu => gu.UserId == userId))
|
|
.Select(d => new GetDiscussionDto
|
|
{
|
|
Id = d.Id,
|
|
IsGroup = true,
|
|
Name = d.Group!.Name!,
|
|
MembersCount = d.Group.MembersAmount,
|
|
GroupId = d.Group.Id
|
|
});
|
|
|
|
List<GetDiscussionDto> discussions = await privees.Concat(groupes).ToListAsync(ct);
|
|
|
|
await SendOkAsync(discussions, ct);
|
|
}
|
|
} |