-
Notifications
You must be signed in to change notification settings - Fork 30
/
Copy pathOrderSqlRepository.Document.cs
executable file
·45 lines (40 loc) · 1.69 KB
/
OrderSqlRepository.Document.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using Marten;
using MyCompany.ECommerce.Sales.Commons;
using MyCompany.ECommerce.Sales.Database.Sql.Documents;
using MyCompany.ECommerce.Sales.Integrations.RiskManagement;
using MyCompany.ECommerce.TechnicalStuff;
namespace MyCompany.ECommerce.Sales.Orders;
public static partial class OrderSqlRepository
{
public class Document(RiskManagement riskManagement, IDocumentSession session)
: Order.Factory(riskManagement), Order.Repository
{
private readonly Dictionary<OrderId, (DbOrder OrderData, Guid Version)> _orders = new();
protected override Order.Data CreateData(OrderId id, Money maxTotalCost)
{
var dbOrder = new DbOrder { Id = id.Value, Items = new List<Order.Item>() };
_orders.Add(id, (dbOrder, Guid.Empty));
return dbOrder;
}
public async Task<Order> GetBy(OrderId id)
{
if (_orders.ContainsKey(id))
throw new DesignError(SameAggregateRestoredMoreThanOnce);
var orderDoc = await session.LoadAsync<DbOrder>(id.Value);
if (orderDoc is null)
throw new DomainError();
var order = Order.RestoreFrom(orderDoc);
var metadata = await session.MetadataForAsync(orderDoc);
_orders.Add(id, (orderDoc, metadata.CurrentVersion));
return order;
}
public Task Save(Order order)
{
// TODO: document versioning
if (!_orders.TryGetValue(order.Id, out var tuple))
throw new DesignError(SaveOfUnknownAggregate);
session.UpdateExpectedVersion(tuple.OrderData, tuple.Version);
return session.SaveChangesAsync();
}
}
}