using Backet.Api.Domain.Event; using Backet.Api.Grains.Abstraction; using Orleans.Providers; using Pole.Core.Grains; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Backet.Api.Grains { [StorageProvider(ProviderName = "ef")] public class BacketGrain : PoleGrain, IBacketGrain { public async Task AddBacket(BacketDto backetDto) { if (State != null) return false; Backet.Api.Domain.AggregatesModel.BacketAggregate.Backet backet = new Backet.Api.Domain.AggregatesModel.BacketAggregate.Backet { Id = backetDto.Id, UserId = backetDto.UserId }; if (backetDto.BacketItems == null || backetDto.BacketItems.Count == 0) return false; backetDto.BacketItems.ForEach(item => { backet.AddBacketItem(item.ProductId, item.ProductName, item.Price); }); Add(backet); backet.AddDomainEvent(new BacketCreatedEvent() { BacketId = backet.Id }); await WriteStateAsync(); return true; } public async Task AddBacketItem(string productId, string productName, long price) { if (State == null) return false; State.AddBacketItem(productId, productName, price); Update(State); await WriteStateAsync(); return true; } public async Task RemoveFirstItem() { State.RemoveFirstItem(); Update(State); await WriteStateAsync(); return true; } public async Task UpdateBacket(string userId) { if (State == null) return false; State.UserId = userId; State.TotalPrice++; State.ModifyItemProductId(userId); Update(State); await WriteStateAsync(); return true; } } }