public virtual async Task HandleEventAsync(CreatePaymentEto eventData) { using var changeTenant = _currentTenant.Change(eventData.TenantId); var providerType = _paymentServiceResolver.GetProviderTypeOrDefault(eventData.PaymentMethod) ?? throw new UnknownPaymentMethodException(eventData.PaymentMethod); var provider = _serviceProvider.GetService(providerType) as IPaymentServiceProvider ?? throw new UnknownPaymentMethodException(eventData.PaymentMethod); var paymentItems = eventData.PaymentItems.Select(itemEto => { var item = new PaymentItem(_guidGenerator.Create(), itemEto.ItemType, itemEto.ItemKey, itemEto.OriginalPaymentAmount); itemEto.MapExtraPropertiesTo(item, MappingPropertyDefinitionChecks.None); return(item); } ).ToList(); if (await HasDuplicatePaymentItemInProgressAsync(paymentItems)) { throw new DuplicatePaymentRequestException(); } var payment = new Payment(_guidGenerator.Create(), eventData.TenantId, eventData.UserId, eventData.PaymentMethod, eventData.Currency, paymentItems.Select(item => item.OriginalPaymentAmount).Sum(), paymentItems); eventData.MapExtraPropertiesTo(payment, MappingPropertyDefinitionChecks.None); await _paymentRepository.InsertAsync(payment, autoSave : true); }
public virtual async Task HandleEventAsync(CreatePaymentEto eventData) { var providerType = _paymentServiceResolver.GetProviderTypeOrDefault(eventData.PaymentMethod) ?? throw new UnknownPaymentMethodException(eventData.PaymentMethod); var provider = _serviceProvider.GetService(providerType) as IPaymentServiceProvider ?? throw new UnknownPaymentMethodException(eventData.PaymentMethod); var paymentItems = eventData.PaymentItems.Select(inputPaymentItem => new PaymentItem(_guidGenerator.Create(), inputPaymentItem.ItemType, inputPaymentItem.ItemKey, inputPaymentItem.Currency, inputPaymentItem.OriginalPaymentAmount)).ToList(); if (paymentItems.Select(item => item.Currency).Any(c => c != eventData.Currency)) { throw new MultiCurrencyNotSupportedException(); } if (await HasDuplicatePaymentItemInProgressAsync(paymentItems)) { throw new DuplicatePaymentRequestException(); } var payment = new Payment(_guidGenerator.Create(), eventData.TenantId, eventData.UserId, eventData.PaymentMethod, eventData.Currency, paymentItems.Select(item => item.OriginalPaymentAmount).Sum(), paymentItems); foreach (var property in eventData.ExtraProperties) { payment.SetProperty(property.Key, property.Value); } await _paymentRepository.InsertAsync(payment, autoSave : true); }