This commit is contained in:
2026-03-08 00:01:31 +01:00
parent 643de642a1
commit c4ee5b0394
16 changed files with 221 additions and 73 deletions

View File

@@ -34,6 +34,7 @@ public class GetWhiteboardInfoRTQueryHandler
return _context.Whiteboards
.Where(w => w.Id == whiteboardId)
.Include(w => w.Memberships)
.ThenInclude(m => m.User)
.Include(w => w.Owner)
.Include(w => w.Shapes);
}

View File

@@ -4,6 +4,7 @@ using AipsCore.Application.Models.Whiteboard.Command.AcceptUserRequestToJoin;
using AipsCore.Application.Models.Whiteboard.Command.RejectUserRequestToJoin;
using AipsCore.Application.Models.Whiteboard.Query.GetMembershipStatus;
using AipsCore.Domain.Models.WhiteboardMembership.Enums;
using AipsRT.Model.Memberships;
using AipsRT.Model.Whiteboard;
using AipsRT.Model.Whiteboard.Shapes;
using AipsRT.Model.Whiteboard.Structs;
@@ -18,13 +19,13 @@ public class WhiteboardHub : Hub
{
private readonly WhiteboardManager _whiteboardManager;
private readonly IMessagingService _messagingService;
private readonly IDispatcher _dispatcher;
private readonly MembershipService _membershipService;
public WhiteboardHub(WhiteboardManager whiteboardManager, IMessagingService messagingService, IDispatcher dispatcher)
public WhiteboardHub(WhiteboardManager whiteboardManager, IMessagingService messagingService, MembershipService membershipService)
{
_whiteboardManager = whiteboardManager;
_messagingService = messagingService;
_dispatcher = dispatcher;
_membershipService = membershipService;
}
public async Task JoinWhiteboard(Guid whiteboardId)
@@ -49,7 +50,7 @@ public class WhiteboardHub : Hub
}
else
{
status = await _dispatcher.Execute(new GetMembershipStatusQuery(whiteboardId.ToString(), userId.ToString()));
status = await _membershipService.GetMembershipStatus(whiteboardId, userId);
}
if (status == WhiteboardMembershipStatus.Accepted)
@@ -67,8 +68,10 @@ public class WhiteboardHub : Hub
_whiteboardManager.AddPendingUser(userId, whiteboardId);
await Clients.Caller.SendAsync("WaitingForApproval", userId.ToString());
var user = whiteboard.Users.First(u => u.UserId == userId);
await Clients.User(ownerId.ToString()).SendAsync("UserWaitingForApproval", userId.ToString());
await Clients.User(ownerId.ToString()).SendAsync("UserWaitingForApproval", user);
}
}

View File

@@ -0,0 +1,19 @@
using AipsCore.Domain.Models.WhiteboardMembership.Enums;
namespace AipsRT.Model.Memberships;
public class MembershipManager
{
private readonly IServiceScopeFactory _scopeFactory;
public MembershipManager(IServiceScopeFactory scopeFactory)
{
_scopeFactory = scopeFactory;
}
public async Task<WhiteboardMembershipStatus> GetMembershipStatus(Guid whiteboardId, Guid userId)
{
var membershipService = _scopeFactory.CreateScope().ServiceProvider.GetRequiredService<MembershipService>();
return await membershipService.GetMembershipStatus(whiteboardId, userId);
}
}

View File

@@ -0,0 +1,21 @@
using AipsCore.Application.Abstract;
using AipsCore.Application.Models.Whiteboard.Query.GetMembershipStatus;
using AipsCore.Domain.Models.WhiteboardMembership.Enums;
namespace AipsRT.Model.Memberships;
public class MembershipService
{
private readonly IDispatcher _dispatcher;
public MembershipService(IDispatcher dispatcher)
{
_dispatcher = dispatcher;
}
public async Task<WhiteboardMembershipStatus> GetMembershipStatus(Guid whiteboardId, Guid userId)
{
var query = new GetMembershipStatusQuery(whiteboardId.ToString(), userId.ToString());
return await _dispatcher.Execute(query);
}
}

View File

@@ -0,0 +1,17 @@
namespace AipsRT.Model.Users;
public class User
{
public Guid UserId { get; private set; }
public string Username { get; private set; }
public string Email { get; private set; }
public User(Guid userId, string username, string email)
{
UserId = userId;
Username = username;
Email = email;
}
}

View File

@@ -1,9 +1,8 @@
using AipsCore.Application.Abstract;
using AipsCore.Application.Models.Whiteboard.Query.GetMembershipStatus;
using AipsCore.Application.Models.Whiteboard.Query.GetWhiteboardInfoRT;
using AipsCore.Domain.Models.Shape.Enums;
using AipsCore.Domain.Models.WhiteboardMembership.Enums;
using AipsRT.Model.Whiteboard.Shapes.Map;
using AipsRT.Model.Users;
namespace AipsRT.Model.Whiteboard;
@@ -30,6 +29,11 @@ public class GetWhiteboardService
OwnerId = entity.OwnerId,
};
foreach (var membership in entity.Memberships)
{
whiteboard.AddUser(new User(membership.UserId, membership.User!.UserName!, membership.User.Email!));
}
foreach (var shape in entity.Shapes)
{
switch (shape.Type)

View File

@@ -1,4 +1,5 @@
using AipsRT.Model.Whiteboard.Shapes;
using AipsRT.Model.Users;
namespace AipsRT.Model.Whiteboard;
@@ -10,6 +11,8 @@ public class Whiteboard
public HashSet<Guid> AcceptedUsers { get; } = new();
public HashSet<Guid> PendingUsers { get; } = new();
public List<User> Users { get; } = [];
public List<Shape> Shapes { get; } = [];
@@ -42,6 +45,8 @@ public class Whiteboard
TextShapes.Add(shape);
}
public void AddUser(User user) => Users.Add(user);
public void AddPendingUser(Guid userId) => PendingUsers.Add(userId);
public void AcceptUser(Guid userId)

View File

@@ -79,10 +79,10 @@ public class WhiteboardManager
public bool IsAccepted(Guid userId)
{
if (!_userInWhiteboards.TryGetValue(userId, out var wbId))
if (!_userInWhiteboards.TryGetValue(userId, out var whiteboardId))
return false;
var whiteboard = GetWhiteboard(wbId);
var whiteboard = GetWhiteboard(whiteboardId);
return whiteboard?.IsAccepted(userId) ?? false;
}
}

View File

@@ -1,6 +1,7 @@
using AipsCore.Application.Common.Message.ErrorMessage;
using AipsCore.Infrastructure.DI;
using AipsRT.Hubs;
using AipsRT.Model.Memberships;
using AipsRT.Model.Whiteboard;
using AipsRT.Services;
using AipsRT.Services.Interfaces;
@@ -21,6 +22,9 @@ builder.Services.AddAipsMessageHandlers();
builder.Services.AddSingleton<IErrorMessageHandleStrategy, RtErrorHandleStrategy>();
builder.Services.AddHostedService<ErrorSubscriberBackgroundService>();
builder.Services.AddTransient<MembershipService>();
builder.Services.AddScoped<GetWhiteboardService>();
builder.Services.AddSingleton<WhiteboardManager>();
builder.Services.AddSingleton<IMessagingService, MessagingService>();

View File

@@ -1,9 +1,11 @@
using AipsCore.Application.Abstract.MessageBroking;
using AipsCore.Application.Common.Message.AcceptUserRequestToJoin;
using AipsCore.Application.Common.Message.AddArrow;
using AipsCore.Application.Common.Message.AddLine;
using AipsCore.Application.Common.Message.AddRectangle;
using AipsCore.Application.Common.Message.AddTextShape;
using AipsCore.Application.Common.Message.MoveShape;
using AipsCore.Application.Common.Message.RejectUserRequestToJoin;
namespace AipsWorker.Messages;
@@ -17,7 +19,9 @@ public class MessageTypesProvider : IMessageTypesProvider
typeof(AddLineMessage),
typeof(AddRectangleMessage),
typeof(AddTextShapeMessage),
typeof(MoveShapeMessage)
typeof(MoveShapeMessage),
typeof(AcceptUserRequestToJoinMessage),
typeof(RejectUserRequestToJoinMessage)
];
}
}