From af1b14b0d2a889e3bdfbe2f08dac0cf0ef4922f5 Mon Sep 17 00:00:00 2001 From: gokhoal Date: Wed, 10 Jun 2026 22:46:40 +0200 Subject: [PATCH] endpoint de creation de discussion --- .../CreatePrivateDiscussionEndpoint.cs | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 Knots/Endpoints/Discussion/CreatePrivateDiscussionEndpoint.cs diff --git a/Knots/Endpoints/Discussion/CreatePrivateDiscussionEndpoint.cs b/Knots/Endpoints/Discussion/CreatePrivateDiscussionEndpoint.cs new file mode 100644 index 0000000..3c43958 --- /dev/null +++ b/Knots/Endpoints/Discussion/CreatePrivateDiscussionEndpoint.cs @@ -0,0 +1,83 @@ +using FastEndpoints; +using Knots.DTO.Discussion; +using Knots.Models; +using Microsoft.EntityFrameworkCore; +using System.Security.Claims; + +namespace Knots.Endpoints.Discussion; + +public class CreatePrivateDiscussionEndpoint(KnotsDbContext db) + : Endpoint +{ + public override void Configure() + { + Post("/discussions/private"); + } + + public override async Task HandleAsync(CreatePrivateDiscussionRequest req, CancellationToken ct) + { + int currentUserId = int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!); + + // 1. retrouver l'utilisateur cible par son nom + Models.User? target = await db.Users + .SingleOrDefaultAsync(u => u.Username == req.Username, ct); + + if (target is null) + { + await SendNotFoundAsync(ct); // utilisateur introuvable + return; + } + + if (target.Id == currentUserId) + { + await SendErrorsAsync(400, ct); // pas de discussion avec soi-même + return; + } + + // 2. vérifier qu'une discussion privée entre les deux n'existe pas déjà + Models.Discussion? existing = await db.Discussions + .Where(d => d.GroupId == null + && d.UserDiscussions.Any(ud => ud.UserId == currentUserId) + && d.UserDiscussions.Any(ud => ud.UserId == target.Id)) + .FirstOrDefaultAsync(ct); + + if (existing is not null) + { + await SendOkAsync(new GetDiscussionDto + { + Id = existing.Id, + IsGroup = false, + Name = target.Username!, + MembersCount = null + }, ct); + return; + } + + // 3. créer la discussion + les deux participants + Models.Discussion discussion = new() + { + IsGroup = false, + UserDiscussions = + [ + new UserDiscussion { UserId = currentUserId }, + new UserDiscussion { UserId = target.Id } + ] + }; + + db.Discussions.Add(discussion); + await db.SaveChangesAsync(ct); + + await SendOkAsync(new GetDiscussionDto + { + Id = discussion.Id, + IsGroup = false, + Name = target.Username!, + MembersCount = null + }, ct); + } +} + +public class CreatePrivateDiscussionRequest +{ + public string Username { get; set; } = ""; +} \ No newline at end of file