From 6fba038bfb1d18f685adbcf4a74b090b7897c50d Mon Sep 17 00:00:00 2001 From: Kylnic28 Date: Tue, 8 Oct 2024 20:54:40 +0200 Subject: [PATCH] feat: base domain --- src/Bahla.Domain/Builders/RoleBuilder.cs | 17 +++++----- .../Specifications/AndNotSpecification.cs | 6 ++-- .../Specifications/AndSpecification.cs | 9 +++--- .../Base/CompositeSpecification.cs | 31 ++++++++++++------- .../Base/IEntitySpecification.cs | 15 +++++++++ .../Specifications/Base/ISpecification.cs | 13 -------- .../Specifications/NotSpecification.cs | 4 +-- .../Specifications/OrNotSpecification.cs | 6 ++-- .../Specifications/OrSpecification.cs | 9 +++--- 9 files changed, 60 insertions(+), 50 deletions(-) create mode 100644 src/Bahla.Domain/Specifications/Base/IEntitySpecification.cs delete mode 100644 src/Bahla.Domain/Specifications/Base/ISpecification.cs diff --git a/src/Bahla.Domain/Builders/RoleBuilder.cs b/src/Bahla.Domain/Builders/RoleBuilder.cs index 0385d3f..bd06ec8 100644 --- a/src/Bahla.Domain/Builders/RoleBuilder.cs +++ b/src/Bahla.Domain/Builders/RoleBuilder.cs @@ -12,9 +12,14 @@ namespace Bahla.Domain.Builders => !string.IsNullOrEmpty(entity._roleName) && !string.IsNullOrWhiteSpace(entity._roleName); } + internal sealed class RoleValueMaskIsNotZeroSpecification : CompositeSpecification + { + public override bool IsSatisfiedBy(RoleBuilder entity) + => entity._valueMask != 0; + } public sealed class RoleBuilder : IRoleBuilder - { + { internal Identifier _identifier = Identifier.Generate; internal string _roleName = string.Empty; @@ -22,14 +27,8 @@ namespace Bahla.Domain.Builders internal uint _valueMask; public Role Build() - { - if (new RoleNameIsNotEmptySpecification() - .IsSatisfiedBy(this)) { - return new Role(this); - } - - throw new EntityBuilderException("Role name cannot be null or empty"); - } + => new RoleNameIsNotEmptySpecification() + .IsSatisfiedBy(this) ? new Role(this) : throw new EntityBuilderException("Role name cannot be null or empty"); public IRoleBuilder WithIdentifier(Identifier identifier) { diff --git a/src/Bahla.Domain/Specifications/AndNotSpecification.cs b/src/Bahla.Domain/Specifications/AndNotSpecification.cs index 259a826..35f3f5b 100644 --- a/src/Bahla.Domain/Specifications/AndNotSpecification.cs +++ b/src/Bahla.Domain/Specifications/AndNotSpecification.cs @@ -3,10 +3,10 @@ using Bahla.Domain.Specifications.Base; namespace Bahla.Domain.Specifications { - public sealed class AndNotSpecification(ISpecification left, ISpecification right) : CompositeSpecification where T : class + public sealed class AndNotSpecification(IEntitySpecification left, IEntitySpecification right) : CompositeSpecification where T : IEntity { - private readonly ISpecification _left = left; - private readonly ISpecification _right = right; + private readonly IEntitySpecification _left = left; + private readonly IEntitySpecification _right = right; public override bool IsSatisfiedBy(T entity) => _left.IsSatisfiedBy(entity) && !_right.IsSatisfiedBy(entity); diff --git a/src/Bahla.Domain/Specifications/AndSpecification.cs b/src/Bahla.Domain/Specifications/AndSpecification.cs index 1840fb0..876b408 100644 --- a/src/Bahla.Domain/Specifications/AndSpecification.cs +++ b/src/Bahla.Domain/Specifications/AndSpecification.cs @@ -1,11 +1,12 @@ -using Bahla.Domain.Specifications.Base; +using Bahla.Domain.Entities.Base; +using Bahla.Domain.Specifications.Base; namespace Bahla.Domain.Specifications { - public sealed class AndSpecification(ISpecification left, ISpecification right) : CompositeSpecification where T : class + public sealed class AndSpecification(IEntitySpecification left, IEntitySpecification right) : CompositeSpecification where T : IEntity { - private readonly ISpecification _left = left; - private readonly ISpecification _right = right; + private readonly IEntitySpecification _left = left; + private readonly IEntitySpecification _right = right; public override bool IsSatisfiedBy(T entity) => _left.IsSatisfiedBy(entity) && _right.IsSatisfiedBy(entity); } diff --git a/src/Bahla.Domain/Specifications/Base/CompositeSpecification.cs b/src/Bahla.Domain/Specifications/Base/CompositeSpecification.cs index e229eda..2f0f852 100644 --- a/src/Bahla.Domain/Specifications/Base/CompositeSpecification.cs +++ b/src/Bahla.Domain/Specifications/Base/CompositeSpecification.cs @@ -1,17 +1,24 @@ -namespace Bahla.Domain.Specifications.Base +using Bahla.Domain.Entities.Base; +using Bahla.Domain.Specifications.Base; + +namespace Bahla.Domain.Specifications { - public abstract class CompositeSpecification : ISpecification where T : class + public abstract class CompositeSpecification : IEntitySpecification where T : IEntity { public abstract bool IsSatisfiedBy(T entity); - public ISpecification And(ISpecification other) - => new AndSpecification(this, other); - public ISpecification AndNot(ISpecification other) - => new AndNotSpecification(this, other); - public ISpecification Not() - => new NotSpecification(this); - public ISpecification Or(ISpecification other) - => new OrSpecification(this, other); - public ISpecification OrNot(ISpecification other) - => new OrNotSpecification(this, other); + + public IEntitySpecification And(IEntitySpecification specification) + => new AndSpecification(this, specification); + + public IEntitySpecification AndNot(IEntitySpecification specification) + => new AndNotSpecification(this, specification); + public IEntitySpecification Not() + => new NotSpecification(this); + + public IEntitySpecification Or(IEntitySpecification specification) + => new OrSpecification(this, specification); + + IEntitySpecification OrNot(IEntitySpecification specification) + => new OrNotSpecification(this, specification); } } diff --git a/src/Bahla.Domain/Specifications/Base/IEntitySpecification.cs b/src/Bahla.Domain/Specifications/Base/IEntitySpecification.cs new file mode 100644 index 0000000..54e3a2f --- /dev/null +++ b/src/Bahla.Domain/Specifications/Base/IEntitySpecification.cs @@ -0,0 +1,15 @@ +using Bahla.Domain.Entities.Base; + +namespace Bahla.Domain.Specifications.Base +{ + public interface IEntitySpecification where T : IEntity + { + bool IsSatisfiedBy(T entity); + IEntitySpecification And(IEntitySpecification other); + IEntitySpecification AndNot(IEntitySpecification other); + IEntitySpecification Or(IEntitySpecification other); + IEntitySpecification OrNot(IEntitySpecification other); + IEntitySpecification Not(); + + } +} diff --git a/src/Bahla.Domain/Specifications/Base/ISpecification.cs b/src/Bahla.Domain/Specifications/Base/ISpecification.cs deleted file mode 100644 index bbd42b6..0000000 --- a/src/Bahla.Domain/Specifications/Base/ISpecification.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Bahla.Domain.Specifications.Base -{ - public interface ISpecification where T : class - { - bool IsSatisfiedBy(T entity); - ISpecification And(ISpecification other); - ISpecification AndNot(ISpecification other); - ISpecification Or(ISpecification other); - ISpecification OrNot(ISpecification other); - ISpecification Not(); - - } -} diff --git a/src/Bahla.Domain/Specifications/NotSpecification.cs b/src/Bahla.Domain/Specifications/NotSpecification.cs index 3324370..5e9473a 100644 --- a/src/Bahla.Domain/Specifications/NotSpecification.cs +++ b/src/Bahla.Domain/Specifications/NotSpecification.cs @@ -3,9 +3,9 @@ using Bahla.Domain.Specifications.Base; namespace Bahla.Domain.Specifications { - public sealed class NotSpecification(ISpecification other) : CompositeSpecification where T : class + public sealed class NotSpecification(IEntitySpecification other) : CompositeSpecification where T : IEntity { - private readonly ISpecification _other = other; + private readonly IEntitySpecification _other = other; public override bool IsSatisfiedBy(T entity) => !_other.IsSatisfiedBy(entity); } diff --git a/src/Bahla.Domain/Specifications/OrNotSpecification.cs b/src/Bahla.Domain/Specifications/OrNotSpecification.cs index 23d7a6a..1977a80 100644 --- a/src/Bahla.Domain/Specifications/OrNotSpecification.cs +++ b/src/Bahla.Domain/Specifications/OrNotSpecification.cs @@ -3,10 +3,10 @@ using Bahla.Domain.Specifications.Base; namespace Bahla.Domain.Specifications { - public sealed class OrNotSpecification(ISpecification left, ISpecification right) : CompositeSpecification where T : class + public sealed class OrNotSpecification(IEntitySpecification left, IEntitySpecification right) : CompositeSpecification where T : IEntity { - private readonly ISpecification _left = left; - private readonly ISpecification _right = right; + private readonly IEntitySpecification _left = left; + private readonly IEntitySpecification _right = right; public override bool IsSatisfiedBy(T entity) => _left.IsSatisfiedBy(entity) || !_right.IsSatisfiedBy(entity); diff --git a/src/Bahla.Domain/Specifications/OrSpecification.cs b/src/Bahla.Domain/Specifications/OrSpecification.cs index 3de8938..1f06fee 100644 --- a/src/Bahla.Domain/Specifications/OrSpecification.cs +++ b/src/Bahla.Domain/Specifications/OrSpecification.cs @@ -1,11 +1,12 @@ -using Bahla.Domain.Specifications.Base; +using Bahla.Domain.Entities.Base; +using Bahla.Domain.Specifications.Base; namespace Bahla.Domain.Specifications { - public sealed class OrSpecification(ISpecification left, ISpecification right) : CompositeSpecification where T : class + public sealed class OrSpecification(IEntitySpecification left, IEntitySpecification right) : CompositeSpecification where T : IEntity { - private readonly ISpecification _left = left; - private readonly ISpecification _right = right; + private readonly IEntitySpecification _left = left; + private readonly IEntitySpecification _right = right; public override bool IsSatisfiedBy(T entity) => _left.IsSatisfiedBy(entity) || _right.IsSatisfiedBy(entity);