From 3e95033fe747d254ef6c62dac6c5d86d3cbe1112 Mon Sep 17 00:00:00 2001 From: Veljko Tosic Date: Wed, 11 Feb 2026 21:58:08 +0100 Subject: [PATCH] Domain rules for kicking and banning users from whiteboards --- .../Whiteboard/Validation/WhiteboardErrors.cs | 23 +++++++++++++++++++ .../Models/Whiteboard/Whiteboard.BanUser.cs | 18 +++++++++++++++ .../Models/Whiteboard/Whiteboard.KickUser.cs | 18 +++++++++++++++ .../Models/Whiteboard/Whiteboard.UnbanUser.cs | 18 +++++++++++++++ .../WhiteboardMembership.Ban.cs | 11 +++++++++ .../WhiteboardMembership.Kick.cs | 11 +++++++++ .../WhiteboardMembership.Unban.cs | 11 +++++++++ .../WhiteboardMembership.cs | 2 +- 8 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.BanUser.cs create mode 100644 dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.KickUser.cs create mode 100644 dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.UnbanUser.cs create mode 100644 dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Ban.cs create mode 100644 dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Kick.cs create mode 100644 dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Unban.cs diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardErrors.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardErrors.cs index b06bafc..262e72b 100644 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardErrors.cs +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardErrors.cs @@ -14,5 +14,28 @@ public class WhiteboardErrors : AbstractErrors return CreateValidationError(code, message); } + + public static ValidationError OnlyOwnerCanBanOtherUsers(UserId currentUserId) + { + string code = "only_owner_can_ban_other_users"; + string message = $"Only owner of whiteboard can ban other users. Current user id: '{currentUserId}' is not the owner."; + return CreateValidationError(code, message); + } + + public static ValidationError OnlyOwnerCanUnbanOtherUsers(UserId currentUserId) + { + string code = "only_owner_can_unban_other_users"; + string message = $"Only owner of whiteboard can unban other users. Current user id: '{currentUserId}' is not the owner."; + + return CreateValidationError(code, message); + } + + public static ValidationError OnlyOwnerCanKickOtherUsers(UserId currentUserId) + { + string code = "only_owner_can_unban_other_users"; + string message = $"Only owner of whiteboard can kick other users. Current user id: '{currentUserId}' is not the owner."; + + return CreateValidationError(code, message); + } } \ 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 new file mode 100644 index 0000000..57d5dfb --- /dev/null +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.BanUser.cs @@ -0,0 +1,18 @@ +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.KickUser.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.KickUser.cs new file mode 100644 index 0000000..e9d4579 --- /dev/null +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.KickUser.cs @@ -0,0 +1,18 @@ +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.UnbanUser.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.UnbanUser.cs new file mode 100644 index 0000000..dabc832 --- /dev/null +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.UnbanUser.cs @@ -0,0 +1,18 @@ +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/WhiteboardMembership.Ban.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Ban.cs new file mode 100644 index 0000000..6befd88 --- /dev/null +++ b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Ban.cs @@ -0,0 +1,11 @@ +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 new file mode 100644 index 0000000..92acf4a --- /dev/null +++ b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Kick.cs @@ -0,0 +1,11 @@ +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.Unban.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Unban.cs new file mode 100644 index 0000000..9072889 --- /dev/null +++ b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.Unban.cs @@ -0,0 +1,11 @@ +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 9cc612b..bfad6da 100644 --- a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs +++ b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs @@ -5,7 +5,7 @@ using AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; namespace AipsCore.Domain.Models.WhiteboardMembership; -public class WhiteboardMembership : DomainModel +public partial class WhiteboardMembership : DomainModel { public WhiteboardId WhiteboardId { get; private set; } public UserId UserId { get; private set; }