-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add basket aggregate in basket domain project. Add base domain logic in basket domain project.
- Loading branch information
1 parent
2bc39fd
commit e4a5e3a
Showing
24 changed files
with
299 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,4 +10,4 @@ public interface IDomainEvent : INotification | |
/// Gets the id of the event. | ||
/// </summary> | ||
Guid Id { get; } | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<TargetFramework>net8.0</TargetFramework> | ||
<ImplicitUsings>enable</ImplicitUsings> | ||
<Nullable>enable</Nullable> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<ProjectReference Include="..\..\..\CommonComponents\Common\Common.csproj" /> | ||
</ItemGroup> | ||
|
||
</Project> |
106 changes: 106 additions & 0 deletions
106
crs/Services/Basket/Basket.Domain/BasketAggregate/Basket.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
namespace Basket.Domain.BasketAggregate; | ||
|
||
public sealed class Basket : AggregateRoot<BasketId> | ||
{ | ||
private readonly UserId UserId; | ||
private readonly List<BasketItem> _basketItems = []; | ||
public IReadOnlyCollection<BasketItem> BasketItems => _basketItems.AsReadOnly(); | ||
|
||
private Basket(BasketId id, UserId userId) | ||
{ | ||
Id = id; | ||
UserId = userId; | ||
_basketItems = []; | ||
} | ||
|
||
public static Result<Basket> Create(BasketId id, UserId userId, bool isUserBasketExist) | ||
{ | ||
if (isUserBasketExist) | ||
{ | ||
return Result.Failure<Basket>( | ||
BasketErrors.UserBasketExist); | ||
} | ||
|
||
Basket basket = new(id, userId); | ||
basket.AddDomainEvent( | ||
new BasketCreatedDomainEvent(Guid.NewGuid(), id)); | ||
|
||
return basket; | ||
} | ||
|
||
public void AddItem(BasketItem basketItem, int quantity) | ||
{ | ||
var existingItem = _basketItems | ||
.SingleOrDefault(basketItem => basketItem.Id == basketItem.Id); | ||
|
||
if (existingItem != null) | ||
{ | ||
existingItem.AddQuantity(quantity); | ||
return; | ||
} | ||
|
||
_basketItems.Add(basketItem); | ||
} | ||
|
||
public void RemoveEmptyItems() => | ||
_basketItems.RemoveAll(x => x.Quantity == 0); | ||
|
||
public Result SetQuantity(BasketItemId basketItemId, int quantity) | ||
{ | ||
var basketItemResult = GetBasketItemById(basketItemId); | ||
|
||
if (basketItemResult.IsFailure) | ||
{ | ||
return Result.Failure( | ||
basketItemResult.Error); | ||
} | ||
|
||
basketItemResult.Value.SetQuantity(quantity); | ||
return Result.Success(); | ||
} | ||
|
||
public Result AddQuantity(BasketItemId basketItemId, int quantity) | ||
{ | ||
var basketItemResult = GetBasketItemById(basketItemId); | ||
|
||
if (basketItemResult.IsFailure) | ||
{ | ||
return Result.Failure( | ||
basketItemResult.Error); | ||
} | ||
|
||
basketItemResult.Value.AddQuantity(quantity); | ||
|
||
return Result.Success(); | ||
} | ||
|
||
public Result RemoveItem(BasketItemId basketItemId) | ||
{ | ||
var basketItemResult = GetBasketItemById(basketItemId); | ||
|
||
if (basketItemResult.IsFailure) | ||
{ | ||
return Result.Failure( | ||
basketItemResult.Error); | ||
} | ||
|
||
_basketItems.Remove(basketItemResult.Value); | ||
|
||
return Result.Success(); | ||
} | ||
|
||
public Result<BasketItem> GetBasketItemById(BasketItemId basketItemId) | ||
{ | ||
var existingItem = _basketItems.SingleOrDefault(basketItem => basketItem.Id == basketItemId); | ||
|
||
if (existingItem == null) | ||
{ | ||
return Result.Failure<BasketItem>( | ||
BasketErrors.BasketItemDoesNotExist); | ||
} | ||
|
||
return existingItem; | ||
} | ||
|
||
public void ClearItems() => _basketItems.Clear(); | ||
} |
3 changes: 3 additions & 0 deletions
3
crs/Services/Basket/Basket.Domain/BasketAggregate/DomainEvents/BasketCreatedDomainEvent.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
namespace Basket.Domain.BasketAggregate.DomainEvents; | ||
|
||
public sealed record BasketCreatedDomainEvent(Guid Id, BasketId BasketId) : IDomainEvent; |
41 changes: 41 additions & 0 deletions
41
crs/Services/Basket/Basket.Domain/BasketAggregate/Entities/BasketItem.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
namespace Basket.Domain.BasketAggregate.Entities; | ||
|
||
public class BasketItem : Entity<BasketItemId> | ||
{ | ||
public CatalogProduct Product { get; private set; } | ||
public int Quantity { get; private set; } | ||
|
||
private BasketItem(BasketItemId id, CatalogProduct product, int quantity) => | ||
(Id, Product, Quantity) = (id, product, quantity); | ||
|
||
public static Result<BasketItem> Create(BasketItemId id, CatalogProduct product, int quantity) | ||
{ | ||
if (quantity <= 0) | ||
{ | ||
return Result.Failure<BasketItem>( | ||
BasketItemErrors.QuantityMustBeGreaterThanZero); | ||
} | ||
|
||
return new BasketItem(id, product, quantity); | ||
} | ||
|
||
public Result AddQuantity(int quantity) => SetQuantity(Quantity + quantity); | ||
|
||
public Result SetQuantity(int quantity) | ||
{ | ||
if (quantity < 0) | ||
{ | ||
return Result.Failure( | ||
BasketItemErrors.QuantityMustBeGreaterThanZero); | ||
} | ||
|
||
if (quantity > Product.Quantity) | ||
{ | ||
return Result.Failure( | ||
BasketItemErrors.QuantityExceedsProductCount); | ||
} | ||
|
||
Quantity = quantity; | ||
return Result.Success(); | ||
} | ||
} |
10 changes: 10 additions & 0 deletions
10
crs/Services/Basket/Basket.Domain/BasketAggregate/Errors/BasketErrors.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
namespace Basket.Domain.BasketAggregate.Errors; | ||
|
||
public static class BasketErrors | ||
{ | ||
public static Error BasketItemDoesNotExist => | ||
new("Basket.BasketItemDoesNotExist", "Basket item does not exist."); | ||
|
||
public static Error UserBasketExist => | ||
new("Basket.UserBasketExist", "User basket already exists."); | ||
} |
11 changes: 11 additions & 0 deletions
11
crs/Services/Basket/Basket.Domain/BasketAggregate/Errors/BasketItemErrors.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
namespace Basket.Domain.BasketAggregate.Errors; | ||
|
||
public static class BasketItemErrors | ||
{ | ||
public static Error QuantityMustBeGreaterThanZero => | ||
new("BasketItem.QuantityMustBeGreaterThanZero", "Quantity must be greater than zero"); | ||
|
||
public static Error QuantityExceedsProductCount => | ||
new("BasketItem.QuantityExceedsProductCount", "Quantity exceeds product count"); | ||
|
||
} |
3 changes: 3 additions & 0 deletions
3
crs/Services/Basket/Basket.Domain/BasketAggregate/Ids/BasketId.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
namespace Basket.Domain.BasketAggregate.Ids; | ||
|
||
public record BasketId(Guid Value) : IStrongestId; |
3 changes: 3 additions & 0 deletions
3
crs/Services/Basket/Basket.Domain/BasketAggregate/Ids/BasketItemId.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
namespace Basket.Domain.BasketAggregate.Ids; | ||
|
||
public record BasketItemId(Guid Value) : IStrongestId; |
3 changes: 3 additions & 0 deletions
3
crs/Services/Basket/Basket.Domain/BasketAggregate/Ids/ProductId.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
namespace Basket.Domain.BasketAggregate.Ids; | ||
|
||
public record ProductId(Guid Value) : IStrongestId; |
3 changes: 3 additions & 0 deletions
3
crs/Services/Basket/Basket.Domain/BasketAggregate/Ids/UserId.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
namespace Basket.Domain.BasketAggregate.Ids; | ||
|
||
public sealed record UserId(Guid Value) : IStrongestId; |
5 changes: 5 additions & 0 deletions
5
crs/Services/Basket/Basket.Domain/BasketAggregate/Repositories/IBasketRepository.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
namespace Basket.Domain.BasketAggregate.Repositories; | ||
|
||
public interface IBasketRepository : IRepository<Basket, BasketId> | ||
{ | ||
} |
18 changes: 18 additions & 0 deletions
18
crs/Services/Basket/Basket.Domain/BasketAggregate/ValueObjects/CatalogProduct.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
namespace Basket.Domain.BasketAggregate.ValueObjects; | ||
|
||
public class CatalogProduct : ValueObject | ||
{ | ||
public ProductId ProductId { get; private set; } | ||
public string Name { get; private set; } | ||
public decimal Price { get; private set; } | ||
public string Brand { get; private set; } | ||
public string Category { get; private set; } | ||
public string ImageUrl { get; private set; } | ||
public int Quantity { get; private set; } | ||
public string Sku { get; private set; } | ||
|
||
public override IEnumerable<object> GetEqualityComponents() | ||
{ | ||
throw new NotImplementedException(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
global using Common.Domain.Primitives; | ||
global using Basket.Domain.BasketAggregate.Ids; | ||
global using Common.Domain.Primitives.Results; | ||
global using Basket.Domain.BasketAggregate.Errors; | ||
global using Basket.Domain.BasketAggregate.Entities; | ||
global using Common.Extensions; | ||
global using Basket.Domain.BasketAggregate.ValueObjects; | ||
global using Common.Domain.Primitives.Events; | ||
global using Basket.Domain.BasketAggregate.DomainEvents; | ||
|
5 changes: 1 addition & 4 deletions
5
...alog.Application/Products/Queries/GetProductsByFilter/GetProductsByFilterQuerieHandler.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
crs/Services/Catalog/Catalog.Domain/ProductAggregate/Errors/QuantityErrors.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
namespace Catalog.Domain.ProductAggregate.Errors; | ||
|
||
public static class QuantityErrors | ||
{ | ||
public static Error QuantityMustBeGreaterThanZero => | ||
new("Product.QuantityMustBeGreaterThanZero", "Quantity must be greater than zero"); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
27 changes: 27 additions & 0 deletions
27
crs/Services/Catalog/Catalog.Domain/ProductAggregate/ValueObjects/Quantity.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
| ||
namespace Catalog.Domain.ProductAggregate.ValueObjects; | ||
|
||
public sealed class Quantity : ValueObject | ||
{ | ||
public int Value { get; private set; } | ||
|
||
private Quantity(int value) => Value = value; | ||
|
||
public static Result<Quantity> Create(int value) | ||
{ | ||
if (value < 0) | ||
{ | ||
return Result.Failure<Quantity>( | ||
QuantityErrors.QuantityMustBeGreaterThanZero); | ||
} | ||
|
||
return new Quantity(value); | ||
} | ||
|
||
public static Quantity Empty => new(0); | ||
|
||
public override IEnumerable<object> GetEqualityComponents() | ||
{ | ||
yield return Value; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.