From f93144f732f525ed03cbaf4240179f73b70b2c6b Mon Sep 17 00:00:00 2001 From: Veljko Tosic Date: Mon, 9 Feb 2026 00:13:23 +0100 Subject: [PATCH] Whiteboard Domain --- .../External/IWhiteboardRepository.cs | 11 +++++++ ...etRule.cs => WhiteboardCodeCharsetRule.cs} | 4 +-- .../Validation/WhiteboardTitleCharsetRule.cs | 24 ++++++++++++++ .../Whiteboard/ValueObjects/WhiteboardCode.cs | 7 ++-- .../Whiteboard/ValueObjects/WhiteboardId.cs | 5 ++- .../ValueObjects/WhiteboardTitle.cs | 29 +++++++++++++++++ .../Domain/Models/Whiteboard/Whiteboard.cs | 32 ++++++++++++++++++- 7 files changed, 103 insertions(+), 9 deletions(-) create mode 100644 dotnet/AipsCore/Domain/Models/Whiteboard/External/IWhiteboardRepository.cs rename dotnet/AipsCore/Domain/Models/Whiteboard/Validation/{WhitebordCodeCharsetRule.cs => WhiteboardCodeCharsetRule.cs} (81%) create mode 100644 dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardTitleCharsetRule.cs create mode 100644 dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardTitle.cs diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/External/IWhiteboardRepository.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/External/IWhiteboardRepository.cs new file mode 100644 index 0000000..9de5e1f --- /dev/null +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/External/IWhiteboardRepository.cs @@ -0,0 +1,11 @@ +using AipsCore.Domain.Models.Whiteboard.ValueObjects; + +namespace AipsCore.Domain.Models.Whiteboard.External; + +public interface IWhiteboardRepository +{ + Task Get(WhiteboardId whiteboardId, CancellationToken cancellationToken = default); + Task Save(Whiteboard whiteboard, CancellationToken cancellationToken = default); + Task WhiteboardCodeExists(WhiteboardCode whiteboardCode); + +} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhitebordCodeCharsetRule.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardCodeCharsetRule.cs similarity index 81% rename from dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhitebordCodeCharsetRule.cs rename to dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardCodeCharsetRule.cs index 2234acc..0627d49 100644 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhitebordCodeCharsetRule.cs +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardCodeCharsetRule.cs @@ -3,9 +3,9 @@ using AipsCore.Utility.Text; namespace AipsCore.Domain.Models.Whiteboard.Validation; -public class WhitebordCodeCharsetRule : CharsetRule +public class WhiteboardCodeCharsetRule : CharsetRule { - public WhitebordCodeCharsetRule(string stringValue) + public WhiteboardCodeCharsetRule(string stringValue) : base(stringValue, GetWhiteboardCodeCharset()) { } diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardTitleCharsetRule.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardTitleCharsetRule.cs new file mode 100644 index 0000000..1dca215 --- /dev/null +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/Validation/WhiteboardTitleCharsetRule.cs @@ -0,0 +1,24 @@ +using AipsCore.Domain.Common.Validation.Rules; +using AipsCore.Utility.Text; + +namespace AipsCore.Domain.Models.Whiteboard.Validation; + +public class WhiteboardTitleCharsetRule : CharsetRule +{ + public WhiteboardTitleCharsetRule(string stringValue) + : base(stringValue, GetWhiteboardTitleCharset()) + { + + } + + private static char[] GetWhiteboardTitleCharset() + { + var alphanumericCharset = Charset.GetAlphanumericCharset(); + return [..alphanumericCharset, '_', ' ', '/']; + } + + protected override string ErrorCode => "whiteboard_title_charset"; + + protected override string ErrorMessage => + "Whiteboard title contains invalid characters, only alphanumeric characters, '_', ' ', '/' are allowed"; +} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardCode.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardCode.cs index 3e7b30a..530f5f1 100644 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardCode.cs +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardCode.cs @@ -1,9 +1,6 @@ -using AipsCore.Domain.Abstract; -using AipsCore.Domain.Abstract.Rule; +using AipsCore.Domain.Abstract.Rule; using AipsCore.Domain.Abstract.ValueObject; -using AipsCore.Domain.Common.Validation; using AipsCore.Domain.Common.Validation.Rules; -using AipsCore.Domain.Common.ValueObjects; using AipsCore.Domain.Models.Whiteboard.Validation; namespace AipsCore.Domain.Models.Whiteboard.ValueObjects; @@ -25,7 +22,7 @@ public record WhiteboardCode : AbstractValueObject return [ new ExactLength(CodeValue, CodeLength), - new WhitebordCodeCharsetRule(CodeValue) + new WhiteboardCodeCharsetRule(CodeValue) ]; } } \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardId.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardId.cs index a9a46aa..efa8763 100644 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardId.cs +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardId.cs @@ -2,4 +2,7 @@ namespace AipsCore.Domain.Models.Whiteboard.ValueObjects; -public record WhiteboardId(string IdValue) : DomainId(IdValue); \ No newline at end of file +public record WhiteboardId(string IdValue) : DomainId(IdValue) +{ + public static WhiteboardId Any() => new(Guid.NewGuid().ToString()); +} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardTitle.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardTitle.cs new file mode 100644 index 0000000..d637e4e --- /dev/null +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/ValueObjects/WhiteboardTitle.cs @@ -0,0 +1,29 @@ +using AipsCore.Domain.Abstract.Rule; +using AipsCore.Domain.Abstract.ValueObject; +using AipsCore.Domain.Common.Validation.Rules; +using AipsCore.Domain.Models.Whiteboard.Validation; + +namespace AipsCore.Domain.Models.Whiteboard.ValueObjects; + +public record WhiteboardTitle : AbstractValueObject +{ + private const int MaxWhiteboardTitleLength = 32; + private const int MinWhiteboardTitleLength = 3; + + public string TitleValue { get; init; } + + public WhiteboardTitle(string TitleValue) + { + this.TitleValue = TitleValue; + Validate(); + } + + protected override ICollection GetValidationRules() + { + return [ + new MaxLengthRule(TitleValue, MaxWhiteboardTitleLength), + new MinLengthRule(TitleValue, MinWhiteboardTitleLength), + new WhiteboardTitleCharsetRule(TitleValue) + ]; + } +} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs index 1fbb366..3c30185 100644 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs @@ -8,11 +8,41 @@ public class Whiteboard public WhiteboardId Id { get; private set; } public UserId WhiteboardOwnerId { get; private set; } public WhiteboardCode Code { get; private set; } + public WhiteboardTitle Title { get; private set; } - public Whiteboard(WhiteboardId id, User.User whiteboardOwner, WhiteboardCode code) + public Whiteboard(WhiteboardId id, User.User whiteboardOwner, WhiteboardCode code, WhiteboardTitle title) { Id = id; WhiteboardOwnerId = whiteboardOwner.Id; Code = code; + Title = title; + } + + public Whiteboard(WhiteboardId id, UserId whiteboardOwnerId, WhiteboardCode code, WhiteboardTitle title) + { + Id = id; + WhiteboardOwnerId = whiteboardOwnerId; + Code = code; + Title = title; + } + + public static Whiteboard Create(string id, string ownerId, string code, string title) + { + var whiteboardId = new WhiteboardId(id); + var whiteboardOwnerId = new UserId(ownerId); + var whiteboardCode = new WhiteboardCode(code); + var whiteboardTitle = new WhiteboardTitle(title); + + return new Whiteboard(whiteboardId, whiteboardOwnerId, whiteboardCode, whiteboardTitle); + } + + public static Whiteboard Create(string ownerId, string code, string title) + { + var whiteboardId = WhiteboardId.Any(); + var whiteboardOwnerId = new UserId(ownerId); + var whiteboardCode = new WhiteboardCode(code); + var whiteboardTitle = new WhiteboardTitle(title); + + return new Whiteboard(whiteboardId, whiteboardOwnerId, whiteboardCode, whiteboardTitle); } } \ No newline at end of file