From ef6305919d2aa674b633fe39b6b947a0b46a5849 Mon Sep 17 00:00:00 2001 From: Veljko Tosic Date: Wed, 4 Mar 2026 23:12:08 +0100 Subject: [PATCH] Refactored --- .../AcceptUserRequestToJoinCommand.cs | 5 ++ .../AcceptUserRequestToJoinCommandHandler.cs | 40 ++++++++++++ .../AddUserToWhiteboardCommand.cs | 11 ---- .../AddUserToWhiteboardCommandErrors.cs | 12 ---- .../AddUserToWhiteboardCommandHandler.cs | 65 ------------------- .../BanUserFromWhiteboardCommandErrors.cs | 18 ----- .../BanUserFromWhiteboardCommandHandler.cs | 6 +- .../KickUserFromWhiteboardCommandErrors.cs | 18 ----- .../KickUserFromWhiteboardCommandHandler.cs | 6 +- .../RejectUserRequestToJoinCommand.cs | 5 ++ .../RejectUserRequestToJoinCommandHandler.cs | 40 ++++++++++++ .../UnbanUserFromWhiteboardCommandErrors.cs | 18 ----- .../UnbanUserFromWhiteboardCommandHandler.cs | 6 +- .../External/IWhiteboardRepository.cs | 3 +- .../Whiteboard/Validation/WhiteboardErrors.cs | 32 +++++++++ .../Whiteboard/ValueObjects/WhiteboardCode.cs | 2 +- .../Models/Whiteboard/Whiteboard.AddUser.cs | 59 +++++++++-------- .../Models/Whiteboard/Whiteboard.BanUser.cs | 18 ----- .../Whiteboard/Whiteboard.CanUserDelete.cs | 7 +- .../Models/Whiteboard/Whiteboard.KickUser.cs | 18 ----- .../Whiteboard/Whiteboard.ManageUsers.cs | 43 ++++++++++++ .../Models/Whiteboard/Whiteboard.UnbanUser.cs | 18 ----- .../Enums/WhiteboardMembershipStatus.cs | 13 ++++ .../Validation/WhiteboardMembershipErrors.cs | 18 +++++ .../WhiteboardMembershipCanJoin.cs | 20 ------ .../WhiteboardMembershipIsBanned.cs | 20 ------ .../WhiteboardMembership.Ban.cs | 11 ---- .../WhiteboardMembership.Kick.cs | 11 ---- .../WhiteboardMembership.Status.cs | 26 ++++++++ .../WhiteboardMembership.Unban.cs | 11 ---- .../WhiteboardMembership.cs | 54 ++++++--------- 31 files changed, 296 insertions(+), 338 deletions(-) create mode 100644 dotnet/AipsCore/Application/Models/Whiteboard/Command/AcceptUserRequestToJoin/AcceptUserRequestToJoinCommand.cs create mode 100644 dotnet/AipsCore/Application/Models/Whiteboard/Command/AcceptUserRequestToJoin/AcceptUserRequestToJoinCommandHandler.cs delete mode 100644 dotnet/AipsCore/Application/Models/Whiteboard/Command/AddUserToWhiteboard/AddUserToWhiteboardCommand.cs delete mode 100644 dotnet/AipsCore/Application/Models/Whiteboard/Command/AddUserToWhiteboard/AddUserToWhiteboardCommandErrors.cs delete mode 100644 dotnet/AipsCore/Application/Models/Whiteboard/Command/AddUserToWhiteboard/AddUserToWhiteboardCommandHandler.cs delete mode 100644 dotnet/AipsCore/Application/Models/Whiteboard/Command/BanUserFromWhiteboard/BanUserFromWhiteboardCommandErrors.cs delete mode 100644 dotnet/AipsCore/Application/Models/Whiteboard/Command/KickUserFromWhiteboard/KickUserFromWhiteboardCommandErrors.cs create mode 100644 dotnet/AipsCore/Application/Models/Whiteboard/Command/RejectUserRequestToJoin/RejectUserRequestToJoinCommand.cs create mode 100644 dotnet/AipsCore/Application/Models/Whiteboard/Command/RejectUserRequestToJoin/RejectUserRequestToJoinCommandHandler.cs delete mode 100644 dotnet/AipsCore/Application/Models/Whiteboard/Command/UnbanUserFromWhiteboard/UnbanUserFromWhiteboardCommandErrors.cs delete mode 100644 dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.BanUser.cs delete mode 100644 dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.KickUser.cs create mode 100644 dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.ManageUsers.cs delete mode 100644 dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.UnbanUser.cs create mode 100644 dotnet/AipsCore/Domain/Models/WhiteboardMembership/Enums/WhiteboardMembershipStatus.cs create mode 100644 dotnet/AipsCore/Domain/Models/WhiteboardMembership/Validation/WhiteboardMembershipErrors.cs delete mode 100644 dotnet/AipsCore/Domain/Models/WhiteboardMembership/ValueObjects/WhiteboardMembershipCanJoin.cs delete mode 100644 dotnet/AipsCore/Domain/Models/WhiteboardMembership/ValueObjects/WhiteboardMembershipIsBanned.cs delete mode 100644 dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Ban.cs delete mode 100644 dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Kick.cs create mode 100644 dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Status.cs delete mode 100644 dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Unban.cs diff --git a/dotnet/AipsCore/Application/Models/Whiteboard/Command/AcceptUserRequestToJoin/AcceptUserRequestToJoinCommand.cs b/dotnet/AipsCore/Application/Models/Whiteboard/Command/AcceptUserRequestToJoin/AcceptUserRequestToJoinCommand.cs new file mode 100644 index 0000000..51acdeb --- /dev/null +++ b/dotnet/AipsCore/Application/Models/Whiteboard/Command/AcceptUserRequestToJoin/AcceptUserRequestToJoinCommand.cs @@ -0,0 +1,5 @@ +using AipsCore.Application.Abstract.Command; + +namespace AipsCore.Application.Models.Whiteboard.Command.AcceptUserRequestToJoin; + +public record AcceptUserRequestToJoinCommand(string WhiteboardId, string UserId): ICommand; \ No newline at end of file diff --git a/dotnet/AipsCore/Application/Models/Whiteboard/Command/AcceptUserRequestToJoin/AcceptUserRequestToJoinCommandHandler.cs b/dotnet/AipsCore/Application/Models/Whiteboard/Command/AcceptUserRequestToJoin/AcceptUserRequestToJoinCommandHandler.cs new file mode 100644 index 0000000..3762d2f --- /dev/null +++ b/dotnet/AipsCore/Application/Models/Whiteboard/Command/AcceptUserRequestToJoin/AcceptUserRequestToJoinCommandHandler.cs @@ -0,0 +1,40 @@ +using AipsCore.Application.Abstract.Command; +using AipsCore.Domain.Abstract; +using AipsCore.Domain.Common.Validation; +using AipsCore.Domain.Models.User.ValueObjects; +using AipsCore.Domain.Models.Whiteboard.ValueObjects; +using AipsCore.Domain.Models.WhiteboardMembership.Enums; +using AipsCore.Domain.Models.WhiteboardMembership.External; +using AipsCore.Domain.Models.WhiteboardMembership.Validation; + +namespace AipsCore.Application.Models.Whiteboard.Command.AcceptUserRequestToJoin; + +public class AcceptUserRequestToJoinCommandHandler : ICommandHandler +{ + private readonly IWhiteboardMembershipRepository _whiteboardMembershipRepository; + private readonly IUnitOfWork _unitOfWork; + + public AcceptUserRequestToJoinCommandHandler(IWhiteboardMembershipRepository whiteboardMembershipRepository, IUnitOfWork unitOfWork) + { + _whiteboardMembershipRepository = whiteboardMembershipRepository; + _unitOfWork = unitOfWork; + } + + public async Task Handle(AcceptUserRequestToJoinCommand command, CancellationToken cancellationToken = default) + { + var whiteboardId = new WhiteboardId(command.WhiteboardId); + var userId = new UserId(command.UserId); + + var membership = await _whiteboardMembershipRepository.GetByWhiteboardAndUserAsync(whiteboardId, userId, cancellationToken); + + if (membership is null) + { + throw new ValidationException(WhiteboardMembershipErrors.NotFound(whiteboardId, userId)); + } + + membership.UpdateStatus(WhiteboardMembershipStatus.Accepted); + + await _whiteboardMembershipRepository.SaveAsync(membership, cancellationToken); + await _unitOfWork.SaveChangesAsync(cancellationToken); + } +} \ No newline at end of file diff --git a/dotnet/AipsCore/Application/Models/Whiteboard/Command/AddUserToWhiteboard/AddUserToWhiteboardCommand.cs b/dotnet/AipsCore/Application/Models/Whiteboard/Command/AddUserToWhiteboard/AddUserToWhiteboardCommand.cs deleted file mode 100644 index 04f3faf..0000000 --- a/dotnet/AipsCore/Application/Models/Whiteboard/Command/AddUserToWhiteboard/AddUserToWhiteboardCommand.cs +++ /dev/null @@ -1,11 +0,0 @@ -using AipsCore.Application.Abstract.Command; -using AipsCore.Domain.Models.User.ValueObjects; -using AipsCore.Domain.Models.Whiteboard.ValueObjects; -using AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; - -namespace AipsCore.Application.Models.Whiteboard.Command.AddUserToWhiteboard; - -public record AddUserToWhiteboardCommand( - string UserId, - string WhiteboardId) - : ICommand; \ No newline at end of file diff --git a/dotnet/AipsCore/Application/Models/Whiteboard/Command/AddUserToWhiteboard/AddUserToWhiteboardCommandErrors.cs b/dotnet/AipsCore/Application/Models/Whiteboard/Command/AddUserToWhiteboard/AddUserToWhiteboardCommandErrors.cs deleted file mode 100644 index b530c3e..0000000 --- a/dotnet/AipsCore/Application/Models/Whiteboard/Command/AddUserToWhiteboard/AddUserToWhiteboardCommandErrors.cs +++ /dev/null @@ -1,12 +0,0 @@ -using AipsCore.Domain.Common.Validation; -using AipsCore.Domain.Models.Whiteboard.ValueObjects; - -namespace AipsCore.Application.Models.Whiteboard.Command.AddUserToWhiteboard; - -public static class AddUserToWhiteboardCommandErrors -{ - public static ValidationError WhiteboardDoesNotExist(WhiteboardId whiteboardId) - => new ValidationError( - Code: "whiteboard_not_exists", - Message: $"Whiteboard with id '{whiteboardId}' does not exist."); -} \ No newline at end of file diff --git a/dotnet/AipsCore/Application/Models/Whiteboard/Command/AddUserToWhiteboard/AddUserToWhiteboardCommandHandler.cs b/dotnet/AipsCore/Application/Models/Whiteboard/Command/AddUserToWhiteboard/AddUserToWhiteboardCommandHandler.cs deleted file mode 100644 index 645abf3..0000000 --- a/dotnet/AipsCore/Application/Models/Whiteboard/Command/AddUserToWhiteboard/AddUserToWhiteboardCommandHandler.cs +++ /dev/null @@ -1,65 +0,0 @@ -using AipsCore.Application.Abstract; -using AipsCore.Application.Abstract.Command; -using AipsCore.Domain.Abstract; -using AipsCore.Domain.Common.Validation; -using AipsCore.Domain.Models.User.External; -using AipsCore.Domain.Models.User.Validation; -using AipsCore.Domain.Models.User.ValueObjects; -using AipsCore.Domain.Models.Whiteboard.External; -using AipsCore.Domain.Models.Whiteboard.Validation; -using AipsCore.Domain.Models.Whiteboard.ValueObjects; -using AipsCore.Domain.Models.WhiteboardMembership.External; - -namespace AipsCore.Application.Models.Whiteboard.Command.AddUserToWhiteboard; - -public class AddUserToWhiteboardCommandHandler - : ICommandHandler -{ - private readonly IWhiteboardRepository _whiteboardRepository; - private readonly IWhiteboardMembershipRepository _whiteboardMembershipRepository; - private readonly IUserRepository _userRepository; - private readonly IUnitOfWork _unitOfWork; - private readonly IDispatcher _dispatcher; - - public AddUserToWhiteboardCommandHandler( - IWhiteboardRepository whiteboardRepository, - IWhiteboardMembershipRepository whiteboardMembershipRepository, - IUserRepository userRepository, - IUnitOfWork unitOfWork, - IDispatcher dispatcher) - { - _whiteboardRepository = whiteboardRepository; - _whiteboardMembershipRepository = whiteboardMembershipRepository; - _userRepository = userRepository; - _unitOfWork = unitOfWork; - _dispatcher = dispatcher; - } - - private Domain.Models.Whiteboard.Whiteboard? _whiteboard; - private Domain.Models.User.User? _user; - - public async Task Handle(AddUserToWhiteboardCommand command, CancellationToken cancellationToken = default) - { - _whiteboard = await _whiteboardRepository.GetByIdAsync(new WhiteboardId(command.WhiteboardId), cancellationToken); - _user = await _userRepository.GetByIdAsync(new UserId(command.UserId), cancellationToken); - - Validate(command); - - await _whiteboard!.AddUserAsync(_user!, _whiteboardMembershipRepository, cancellationToken); - - await _unitOfWork.SaveChangesAsync(cancellationToken); - } - - private void Validate(AddUserToWhiteboardCommand command) - { - if (_whiteboard is null) - { - throw new ValidationException(WhiteboardErrors.NotFound(new WhiteboardId(command.WhiteboardId))); - } - - if (_user is null) - { - throw new ValidationException(UserErrors.NotFound(new UserId(command.UserId))); - } - } -} \ No newline at end of file diff --git a/dotnet/AipsCore/Application/Models/Whiteboard/Command/BanUserFromWhiteboard/BanUserFromWhiteboardCommandErrors.cs b/dotnet/AipsCore/Application/Models/Whiteboard/Command/BanUserFromWhiteboard/BanUserFromWhiteboardCommandErrors.cs deleted file mode 100644 index 303a529..0000000 --- a/dotnet/AipsCore/Application/Models/Whiteboard/Command/BanUserFromWhiteboard/BanUserFromWhiteboardCommandErrors.cs +++ /dev/null @@ -1,18 +0,0 @@ -using AipsCore.Domain.Common.Validation; -using AipsCore.Domain.Models.User.ValueObjects; -using AipsCore.Domain.Models.Whiteboard.ValueObjects; - -namespace AipsCore.Application.Models.Whiteboard.Command.BanUserFromWhiteboard; - -public static class BanUserFromWhiteboardCommandErrors -{ - public static ValidationError WhiteboardMembershipNotFound(WhiteboardId whiteboardId, UserId userId) - => new ValidationError( - Code: "whiteboard_membership_not_found", - Message: $"User with id '{userId.IdValue}' is not a member of whiteboard with id '{whiteboardId.IdValue}'"); - - public static ValidationError WhiteboardNotFound(WhiteboardId whiteboardId) - => new ValidationError( - Code: "whiteboard_not_found", - Message: $"Whiteboard with id '{whiteboardId.IdValue}' not found."); -} \ No newline at end of file diff --git a/dotnet/AipsCore/Application/Models/Whiteboard/Command/BanUserFromWhiteboard/BanUserFromWhiteboardCommandHandler.cs b/dotnet/AipsCore/Application/Models/Whiteboard/Command/BanUserFromWhiteboard/BanUserFromWhiteboardCommandHandler.cs index efcc9a9..312241c 100644 --- a/dotnet/AipsCore/Application/Models/Whiteboard/Command/BanUserFromWhiteboard/BanUserFromWhiteboardCommandHandler.cs +++ b/dotnet/AipsCore/Application/Models/Whiteboard/Command/BanUserFromWhiteboard/BanUserFromWhiteboardCommandHandler.cs @@ -4,8 +4,10 @@ using AipsCore.Domain.Abstract; using AipsCore.Domain.Common.Validation; using AipsCore.Domain.Models.User.ValueObjects; using AipsCore.Domain.Models.Whiteboard.External; +using AipsCore.Domain.Models.Whiteboard.Validation; using AipsCore.Domain.Models.Whiteboard.ValueObjects; using AipsCore.Domain.Models.WhiteboardMembership.External; +using AipsCore.Domain.Models.WhiteboardMembership.Validation; namespace AipsCore.Application.Models.Whiteboard.Command.BanUserFromWhiteboard; @@ -37,14 +39,14 @@ public class BanUserFromWhiteboardCommandHandler : ICommandHandler new ValidationError( - Code: "whiteboard_membership_not_found", - Message: $"User with id '{userId}' is not a member of whiteboard with id '{whiteboardId}'"); - - public static ValidationError WhiteboardNotFound(WhiteboardId whiteboardId) - => new ValidationError( - Code: "whiteboard_not_found", - Message: $"Whiteboard with id '{whiteboardId}' not found."); -} \ No newline at end of file diff --git a/dotnet/AipsCore/Application/Models/Whiteboard/Command/KickUserFromWhiteboard/KickUserFromWhiteboardCommandHandler.cs b/dotnet/AipsCore/Application/Models/Whiteboard/Command/KickUserFromWhiteboard/KickUserFromWhiteboardCommandHandler.cs index b30b825..1059152 100644 --- a/dotnet/AipsCore/Application/Models/Whiteboard/Command/KickUserFromWhiteboard/KickUserFromWhiteboardCommandHandler.cs +++ b/dotnet/AipsCore/Application/Models/Whiteboard/Command/KickUserFromWhiteboard/KickUserFromWhiteboardCommandHandler.cs @@ -4,8 +4,10 @@ using AipsCore.Domain.Abstract; using AipsCore.Domain.Common.Validation; using AipsCore.Domain.Models.User.ValueObjects; using AipsCore.Domain.Models.Whiteboard.External; +using AipsCore.Domain.Models.Whiteboard.Validation; using AipsCore.Domain.Models.Whiteboard.ValueObjects; using AipsCore.Domain.Models.WhiteboardMembership.External; +using AipsCore.Domain.Models.WhiteboardMembership.Validation; namespace AipsCore.Application.Models.Whiteboard.Command.KickUserFromWhiteboard; @@ -37,14 +39,14 @@ public class KickUserFromWhiteboardCommandHandler : ICommandHandler +{ + private readonly IWhiteboardMembershipRepository _whiteboardMembershipRepository; + private readonly IUnitOfWork _unitOfWork; + + public RejectUserRequestToJoinCommandHandler(IWhiteboardMembershipRepository whiteboardMembershipRepository, IUnitOfWork unitOfWork) + { + _whiteboardMembershipRepository = whiteboardMembershipRepository; + _unitOfWork = unitOfWork; + } + + public async Task Handle(RejectUserRequestToJoinCommand command, CancellationToken cancellationToken = default) + { + var whiteboardId = new WhiteboardId(command.WhiteboardId); + var userId = new UserId(command.UserId); + + var membership = await _whiteboardMembershipRepository.GetByWhiteboardAndUserAsync(whiteboardId, userId, cancellationToken); + + if (membership is null) + { + throw new ValidationException(WhiteboardMembershipErrors.NotFound(whiteboardId, userId)); + } + + membership.UpdateStatus(WhiteboardMembershipStatus.Rejected); + + await _whiteboardMembershipRepository.SaveAsync(membership, cancellationToken); + await _unitOfWork.SaveChangesAsync(cancellationToken); + } +} \ No newline at end of file diff --git a/dotnet/AipsCore/Application/Models/Whiteboard/Command/UnbanUserFromWhiteboard/UnbanUserFromWhiteboardCommandErrors.cs b/dotnet/AipsCore/Application/Models/Whiteboard/Command/UnbanUserFromWhiteboard/UnbanUserFromWhiteboardCommandErrors.cs deleted file mode 100644 index f04e3d9..0000000 --- a/dotnet/AipsCore/Application/Models/Whiteboard/Command/UnbanUserFromWhiteboard/UnbanUserFromWhiteboardCommandErrors.cs +++ /dev/null @@ -1,18 +0,0 @@ -using AipsCore.Domain.Common.Validation; -using AipsCore.Domain.Models.User.ValueObjects; -using AipsCore.Domain.Models.Whiteboard.ValueObjects; - -namespace AipsCore.Application.Models.Whiteboard.Command.UnbanUserFromWhiteboard; - -public static class UnbanUserFromWhiteboardCommandErrors -{ - public static ValidationError WhiteboardMembershipNotFound(WhiteboardId whiteboardId, UserId userId) - => new ValidationError( - Code: "whiteboard_membership_not_found", - Message: $"User with id '{userId}' is not a member of whiteboard with id '{whiteboardId}'"); - - public static ValidationError WhiteboardNotFound(WhiteboardId whiteboardId) - => new ValidationError( - Code: "whiteboard_not_found", - Message: $"Whiteboard with id '{whiteboardId}' not found."); -} \ No newline at end of file diff --git a/dotnet/AipsCore/Application/Models/Whiteboard/Command/UnbanUserFromWhiteboard/UnbanUserFromWhiteboardCommandHandler.cs b/dotnet/AipsCore/Application/Models/Whiteboard/Command/UnbanUserFromWhiteboard/UnbanUserFromWhiteboardCommandHandler.cs index 326a5b3..83933a6 100644 --- a/dotnet/AipsCore/Application/Models/Whiteboard/Command/UnbanUserFromWhiteboard/UnbanUserFromWhiteboardCommandHandler.cs +++ b/dotnet/AipsCore/Application/Models/Whiteboard/Command/UnbanUserFromWhiteboard/UnbanUserFromWhiteboardCommandHandler.cs @@ -4,8 +4,10 @@ using AipsCore.Domain.Abstract; using AipsCore.Domain.Common.Validation; using AipsCore.Domain.Models.User.ValueObjects; using AipsCore.Domain.Models.Whiteboard.External; +using AipsCore.Domain.Models.Whiteboard.Validation; using AipsCore.Domain.Models.Whiteboard.ValueObjects; using AipsCore.Domain.Models.WhiteboardMembership.External; +using AipsCore.Domain.Models.WhiteboardMembership.Validation; namespace AipsCore.Application.Models.Whiteboard.Command.UnbanUserFromWhiteboard; @@ -37,14 +39,14 @@ public class UnbanUserFromWhiteboardCommandHandler : ICommandHandler, ISoftDeletableRepository { - Task WhiteboardCodeExists(WhiteboardCode whiteboardCode); + Task WhiteboardCodeExistsAsync(WhiteboardCode whiteboardCode); + Task GetByCodeAsync(WhiteboardCode whiteboardCode, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardErrors.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardErrors.cs index ad1070e..4640099 100644 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardErrors.cs +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardErrors.cs @@ -7,6 +7,38 @@ namespace AipsCore.Domain.Models.Whiteboard.Validation; public class WhiteboardErrors : AbstractErrors { + public static ValidationError NotFound(WhiteboardCode whiteboardCode) + { + const string code = "not_found"; + string message = $"Whiteboard with code '{whiteboardCode.CodeValue}' was not found!"; + + return CreateValidationError(code,message); + } + + public static ValidationError CannotJoin(WhiteboardCode whiteboardCode) + { + const string code = "cannot_join_whiteboard"; + string message = $"Cannot join the whiteboard with code '{whiteboardCode.CodeValue}'"; + + return CreateValidationError(code,message); + } + + public static ValidationError UserBanned(UserId userId) + { + const string code = "user_banned_from_whiteboard"; + string message = $"User with id '{userId}' is banned from this whiteboard."; + + return CreateValidationError(code,message); + } + + public static ValidationError UserAlreadyTryingToJoin(UserId userId) + { + const string code = "user_already_trying_to_join_whiteboard"; + string message = $"User with id '{userId}' is already trying to join the whiteboard."; + + return CreateValidationError(code,message); + } + public static ValidationError UserAlreadyAdded(UserId userId) { string code = "user_already_added"; diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardCode.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardCode.cs index 895fe5e..872957c 100644 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardCode.cs +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardCode.cs @@ -36,7 +36,7 @@ public record WhiteboardCode : AbstractValueObject { whiteboardCode = Generate(); - codeExists = await whiteboardRepository.WhiteboardCodeExists(whiteboardCode); + codeExists = await whiteboardRepository.WhiteboardCodeExistsAsync(whiteboardCode); } while (codeExists); return whiteboardCode; diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.AddUser.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.AddUser.cs index cf55327..dcbb7c0 100644 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.AddUser.cs +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.AddUser.cs @@ -1,42 +1,47 @@ -using System.Runtime.InteropServices.Swift; -using AipsCore.Domain.Abstract; using AipsCore.Domain.Common.Validation; +using AipsCore.Domain.Models.User.ValueObjects; using AipsCore.Domain.Models.Whiteboard.Enums; using AipsCore.Domain.Models.Whiteboard.Validation; -using AipsCore.Domain.Models.Whiteboard.ValueObjects; -using AipsCore.Domain.Models.WhiteboardMembership.External; +using AipsCore.Domain.Models.WhiteboardMembership.Enums; namespace AipsCore.Domain.Models.Whiteboard; -public partial class Whiteboard : DomainModel +public partial class Whiteboard { - public async Task AddUserAsync( - User.User user, - IWhiteboardMembershipRepository membershipRepository, - CancellationToken cancellationToken = default) + public WhiteboardMembership.WhiteboardMembership RequestJoin(UserId userId) { - var membership - = await membershipRepository.GetByWhiteboardAndUserAsync(this.Id, user.Id, cancellationToken); + return WhiteboardMembership.WhiteboardMembership.Create( + Id.IdValue, + userId.IdValue, + false, + DetermineJoinStatus(), + DateTime.UtcNow); + } - if (membership is not null) + public void RequestReJoin(WhiteboardMembership.WhiteboardMembership membership) + { + switch (membership.Status) { - throw new ValidationException(WhiteboardErrors.UserAlreadyAdded(user.Id)); + case WhiteboardMembershipStatus.Banned: + throw new ValidationException(WhiteboardErrors.UserBanned(membership.UserId)); + case WhiteboardMembershipStatus.Pending: + throw new ValidationException(WhiteboardErrors.UserAlreadyTryingToJoin(membership.UserId)); + case WhiteboardMembershipStatus.Accepted: + break; + default: + membership.UpdateStatus(DetermineJoinStatus()); + break; } - - membership = WhiteboardMembership.WhiteboardMembership.Create( - this.Id.IdValue, - user.Id.IdValue, - false, - false, - this.GetCanJoin(), - DateTime.UtcNow - ); - - await membershipRepository.AddAsync(membership, cancellationToken); } - private bool GetCanJoin() + private WhiteboardMembershipStatus DetermineJoinStatus() { - return this.JoinPolicy == WhiteboardJoinPolicy.FreeToJoin; + return JoinPolicy switch + { + WhiteboardJoinPolicy.FreeToJoin => WhiteboardMembershipStatus.Accepted, + WhiteboardJoinPolicy.RequestToJoin => WhiteboardMembershipStatus.Pending, + WhiteboardJoinPolicy.Private => throw new ValidationException(WhiteboardErrors.CannotJoin(Code)), + _ => throw new ArgumentOutOfRangeException() + }; } -} +} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.BanUser.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.BanUser.cs deleted file mode 100644 index 57d5dfb..0000000 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.BanUser.cs +++ /dev/null @@ -1,18 +0,0 @@ -using AipsCore.Domain.Common.Validation; -using AipsCore.Domain.Models.User.ValueObjects; -using AipsCore.Domain.Models.Whiteboard.Validation; - -namespace AipsCore.Domain.Models.Whiteboard; - -public partial class Whiteboard -{ - public void BanUser(UserId currentUserId, WhiteboardMembership.WhiteboardMembership whiteboardMembership) - { - if (WhiteboardOwnerId != currentUserId) - { - throw new ValidationException(WhiteboardErrors.OnlyOwnerCanBanOtherUsers(currentUserId)); - } - - whiteboardMembership.Ban(); - } -} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.CanUserDelete.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.CanUserDelete.cs index b11e8de..bf2a429 100644 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.CanUserDelete.cs +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.CanUserDelete.cs @@ -6,6 +6,11 @@ public partial class Whiteboard { public bool CanUserDelete(UserId userId) { - return WhiteboardOwnerId.IdValue == userId.IdValue; + return IsOwner(userId); + } + + public bool ShouldRequestToJoin(UserId userId) + { + return !IsOwner(userId); } } \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.KickUser.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.KickUser.cs deleted file mode 100644 index e9d4579..0000000 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.KickUser.cs +++ /dev/null @@ -1,18 +0,0 @@ -using AipsCore.Domain.Common.Validation; -using AipsCore.Domain.Models.User.ValueObjects; -using AipsCore.Domain.Models.Whiteboard.Validation; - -namespace AipsCore.Domain.Models.Whiteboard; - -public partial class Whiteboard -{ - public void KickUser(UserId currentUserId, WhiteboardMembership.WhiteboardMembership whiteboardMembership) - { - if (WhiteboardOwnerId != currentUserId) - { - throw new ValidationException(WhiteboardErrors.OnlyOwnerCanKickOtherUsers(currentUserId)); - } - - whiteboardMembership.Kick(); - } -} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.ManageUsers.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.ManageUsers.cs new file mode 100644 index 0000000..76ae127 --- /dev/null +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.ManageUsers.cs @@ -0,0 +1,43 @@ +using AipsCore.Domain.Common.Validation; +using AipsCore.Domain.Models.User.ValueObjects; +using AipsCore.Domain.Models.Whiteboard.Validation; + +namespace AipsCore.Domain.Models.Whiteboard; + +public partial class Whiteboard +{ + public void BanUser(UserId currentUserId, WhiteboardMembership.WhiteboardMembership whiteboardMembership) + { + if (IsOwner(currentUserId)) + { + throw new ValidationException(WhiteboardErrors.OnlyOwnerCanBanOtherUsers(currentUserId)); + } + + whiteboardMembership.Ban(); + } + + public void UnbanUser(UserId currentUserId, WhiteboardMembership.WhiteboardMembership whiteboardMembership) + { + if (IsOwner(currentUserId)) + { + throw new ValidationException(WhiteboardErrors.OnlyOwnerCanUnbanOtherUsers(currentUserId)); + } + + whiteboardMembership.Unban(); + } + + public void KickUser(UserId currentUserId, WhiteboardMembership.WhiteboardMembership whiteboardMembership) + { + if (IsOwner(currentUserId)) + { + throw new ValidationException(WhiteboardErrors.OnlyOwnerCanKickOtherUsers(currentUserId)); + } + + whiteboardMembership.Kick(); + } + + private bool IsOwner(UserId userId) + { + return WhiteboardOwnerId.IdValue == userId.IdValue; + } +} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.UnbanUser.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.UnbanUser.cs deleted file mode 100644 index dabc832..0000000 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.UnbanUser.cs +++ /dev/null @@ -1,18 +0,0 @@ -using AipsCore.Domain.Common.Validation; -using AipsCore.Domain.Models.User.ValueObjects; -using AipsCore.Domain.Models.Whiteboard.Validation; - -namespace AipsCore.Domain.Models.Whiteboard; - -public partial class Whiteboard -{ - public void UnbanUser(UserId currentUserId, WhiteboardMembership.WhiteboardMembership whiteboardMembership) - { - if (WhiteboardOwnerId != currentUserId) - { - throw new ValidationException(WhiteboardErrors.OnlyOwnerCanUnbanOtherUsers(currentUserId)); - } - - whiteboardMembership.Unban(); - } -} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/Enums/WhiteboardMembershipStatus.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/Enums/WhiteboardMembershipStatus.cs new file mode 100644 index 0000000..c69f5c6 --- /dev/null +++ b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/Enums/WhiteboardMembershipStatus.cs @@ -0,0 +1,13 @@ +namespace AipsCore.Domain.Models.WhiteboardMembership.Enums; + +public enum WhiteboardMembershipStatus +{ + Pending, + Accepted, + Active, + Inactive, + Rejected, + Cancelled, + Kicked, + Banned +} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/Validation/WhiteboardMembershipErrors.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/Validation/WhiteboardMembershipErrors.cs new file mode 100644 index 0000000..5858d56 --- /dev/null +++ b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/Validation/WhiteboardMembershipErrors.cs @@ -0,0 +1,18 @@ +using AipsCore.Domain.Abstract.Validation; +using AipsCore.Domain.Common.Validation; +using AipsCore.Domain.Models.User.ValueObjects; +using AipsCore.Domain.Models.Whiteboard.ValueObjects; +using AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; + +namespace AipsCore.Domain.Models.WhiteboardMembership.Validation; + +public class WhiteboardMembershipErrors : AbstractErrors +{ + public static ValidationError NotFound(WhiteboardId whiteboardId, UserId userId) + { + const string code = "whiteboard_membership_not_found"; + string message = $"Whiteboard membership with whiteboard id {whiteboardId.IdValue} and user id {userId.IdValue} not found."; + + return CreateValidationError(code, message); + } +} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/ValueObjects/WhiteboardMembershipCanJoin.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/ValueObjects/WhiteboardMembershipCanJoin.cs deleted file mode 100644 index 48591ad..0000000 --- a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/ValueObjects/WhiteboardMembershipCanJoin.cs +++ /dev/null @@ -1,20 +0,0 @@ -using AipsCore.Domain.Abstract.Rule; -using AipsCore.Domain.Abstract.ValueObject; - -namespace AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; - -public record WhiteboardMembershipCanJoin : AbstractValueObject -{ - public bool CanJoinValue { get; init; } - - public WhiteboardMembershipCanJoin(bool CanJoinValue) - { - this.CanJoinValue = CanJoinValue; - Validate(); - } - - protected override ICollection GetValidationRules() - { - return []; - } -} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/ValueObjects/WhiteboardMembershipIsBanned.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/ValueObjects/WhiteboardMembershipIsBanned.cs deleted file mode 100644 index 363e9ab..0000000 --- a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/ValueObjects/WhiteboardMembershipIsBanned.cs +++ /dev/null @@ -1,20 +0,0 @@ -using AipsCore.Domain.Abstract.Rule; -using AipsCore.Domain.Abstract.ValueObject; - -namespace AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; - -public record WhiteboardMembershipIsBanned : AbstractValueObject -{ - public bool IsBannedValue { get; init; } - - public WhiteboardMembershipIsBanned(bool IsBannedValue) - { - this.IsBannedValue = IsBannedValue; - Validate(); - } - - protected override ICollection GetValidationRules() - { - return []; - } -} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Ban.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Ban.cs deleted file mode 100644 index 6befd88..0000000 --- a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Ban.cs +++ /dev/null @@ -1,11 +0,0 @@ -using AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; - -namespace AipsCore.Domain.Models.WhiteboardMembership; - -public partial class WhiteboardMembership -{ - public void Ban() - { - IsBanned = new WhiteboardMembershipIsBanned(true); - } -} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Kick.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Kick.cs deleted file mode 100644 index 92acf4a..0000000 --- a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Kick.cs +++ /dev/null @@ -1,11 +0,0 @@ -using AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; - -namespace AipsCore.Domain.Models.WhiteboardMembership; - -public partial class WhiteboardMembership -{ - public void Kick() - { - CanJoin = new WhiteboardMembershipCanJoin(false); - } -} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Status.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Status.cs new file mode 100644 index 0000000..5c6f50b --- /dev/null +++ b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Status.cs @@ -0,0 +1,26 @@ +using AipsCore.Domain.Models.WhiteboardMembership.Enums; + +namespace AipsCore.Domain.Models.WhiteboardMembership; + +public partial class WhiteboardMembership +{ + public void Ban() + { + Status = WhiteboardMembershipStatus.Banned; + } + + public void Unban() + { + Status = WhiteboardMembershipStatus.Cancelled; + } + + public void Kick() + { + Status = WhiteboardMembershipStatus.Kicked; + } + + public void UpdateStatus(WhiteboardMembershipStatus newStatus) + { + Status = newStatus; + } +} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Unban.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Unban.cs deleted file mode 100644 index 9072889..0000000 --- a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Unban.cs +++ /dev/null @@ -1,11 +0,0 @@ -using AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; - -namespace AipsCore.Domain.Models.WhiteboardMembership; - -public partial class WhiteboardMembership -{ - public void Unban() - { - IsBanned = new WhiteboardMembershipIsBanned(false); - } -} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs index bfad6da..7635c4d 100644 --- a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs +++ b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs @@ -1,6 +1,7 @@ using AipsCore.Domain.Abstract; using AipsCore.Domain.Models.User.ValueObjects; using AipsCore.Domain.Models.Whiteboard.ValueObjects; +using AipsCore.Domain.Models.WhiteboardMembership.Enums; using AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; namespace AipsCore.Domain.Models.WhiteboardMembership; @@ -9,97 +10,84 @@ public partial class WhiteboardMembership : DomainModel { public WhiteboardId WhiteboardId { get; private set; } public UserId UserId { get; private set; } - public WhiteboardMembershipIsBanned IsBanned { get; private set; } public WhiteboardMembershipEditingEnabled EditingEnabled { get; private set; } - public WhiteboardMembershipCanJoin CanJoin { get; private set; } + public WhiteboardMembershipStatus Status { get; private set; } public WhiteboardMembershipLastInteractedAt LastInteractedAt { get; private set; } public WhiteboardMembership( WhiteboardMembershipId id, - Whiteboard.Whiteboard owner, + Whiteboard.Whiteboard whiteboard, User.User user, - WhiteboardMembershipIsBanned isBanned, WhiteboardMembershipEditingEnabled editingEnabled, - WhiteboardMembershipCanJoin canJoin, + WhiteboardMembershipStatus status, WhiteboardMembershipLastInteractedAt lastInteractedAt) : base(id) { - WhiteboardId = owner.Id; + WhiteboardId = whiteboard.Id; UserId = user.Id; - IsBanned = isBanned; EditingEnabled = editingEnabled; - CanJoin = canJoin; + Status = status; LastInteractedAt = lastInteractedAt; } public WhiteboardMembership( WhiteboardMembershipId id, - WhiteboardId ownerId, + WhiteboardId whiteboardId, UserId userId, - WhiteboardMembershipIsBanned isBanned, WhiteboardMembershipEditingEnabled editingEnabled, - WhiteboardMembershipCanJoin canJoin, + WhiteboardMembershipStatus status, WhiteboardMembershipLastInteractedAt lastInteractedAt) : base(id) { - WhiteboardId = ownerId; + WhiteboardId = whiteboardId; UserId = userId; - IsBanned = isBanned; EditingEnabled = editingEnabled; - CanJoin = canJoin; + Status = status; LastInteractedAt = lastInteractedAt; } public static WhiteboardMembership Create( string id, - string ownerId, + string whiteboardId, string userId, - bool isBanned, bool editingEnabled, - bool canJoin, + WhiteboardMembershipStatus status, DateTime lastInteractedAt) { var whiteboardMembershipId = new WhiteboardMembershipId(id); - var whiteboardId = new WhiteboardId(ownerId); + var whiteboardIdVo = new WhiteboardId(whiteboardId); var userIdVo = new UserId(userId); - var isBannedVo = new WhiteboardMembershipIsBanned(isBanned); var editingEnabledVo = new WhiteboardMembershipEditingEnabled(editingEnabled); - var canJoinVo = new WhiteboardMembershipCanJoin(canJoin); var lastInteractedAtVo = new WhiteboardMembershipLastInteractedAt(lastInteractedAt); return new WhiteboardMembership( whiteboardMembershipId, - whiteboardId, - userIdVo, - isBannedVo, + whiteboardIdVo, + userIdVo, editingEnabledVo, - canJoinVo, + status, lastInteractedAtVo); } public static WhiteboardMembership Create( - string ownerId, + string whiteboardId, string userId, - bool isBanned, bool editingEnabled, - bool canJoin, + WhiteboardMembershipStatus status, DateTime lastInteractedAt) { var whiteboardMembershipId = WhiteboardMembershipId.Any(); - var whiteboardId = new WhiteboardId(ownerId); + var whiteboardIdVo = new WhiteboardId(whiteboardId); var userIdVo = new UserId(userId); - var isBannedVo = new WhiteboardMembershipIsBanned(isBanned); var editingEnabledVo = new WhiteboardMembershipEditingEnabled(editingEnabled); - var canJoinVo = new WhiteboardMembershipCanJoin(canJoin); var lastInteractedAtVo = new WhiteboardMembershipLastInteractedAt(lastInteractedAt); return new WhiteboardMembership( whiteboardMembershipId, - whiteboardId, + whiteboardIdVo, userIdVo, - isBannedVo, editingEnabledVo, - canJoinVo, + status, lastInteractedAtVo); } } \ No newline at end of file