public async Task InsertAsync(AssetTypeWithTemplate model, IEnumerable <ClientProfileSettings> clientProfileSettingsToAdd) { var entity = new AssetTypeEntity { Id = model.Id, RegulatoryTypeId = model.RegulatoryTypeId, UnderlyingCategoryId = model.UnderlyingCategoryId, }; var clientProfileSettingsEntities = clientProfileSettingsToAdd.Select(ClientProfileSettingsEntity.Create).ToArray(); using (var context = _contextFactory.CreateDataContext()) { context.AssetTypes.Add(entity); context.ClientProfileSettings.AddRange(clientProfileSettingsEntities); try { await context.SaveChangesAsync(); } catch (DbUpdateException e) { if (e.InnerException is SqlException sqlException && sqlException.Number == MsSqlErrorCodes.PrimaryKeyConstraintViolation) { throw new AlreadyExistsException(); } throw; } } }
public async Task InsertAsync(AssetTypeWithTemplate model, string username, string correlationId) { var brokerSettingsResponse = await _brokerSettingsApi.GetByIdAsync(_brokerId); if (brokerSettingsResponse.ErrorCode == BrokerSettingsErrorCodesContract.BrokerSettingsDoNotExist) { throw new BrokerSettingsDoNotExistException(); } await ValidateUnderlyingCategory(model.UnderlyingCategoryId); var regulationId = brokerSettingsResponse.BrokerSettings.RegulationId; await ValidateRegulatoryType(model.RegulatoryTypeId, regulationId); List <ClientProfileSettings> clientProfileSettings; //duplicate settings if we use template if (!string.IsNullOrEmpty(model.AssetTypeTemplateId)) { var regulatoryProfileTemplateExists = await _assetTypesRepository.ExistsAsync(model.AssetTypeTemplateId); if (!regulatoryProfileTemplateExists) { throw new AssetTypeDoesNotExistException(); } clientProfileSettings = await _clientProfileSettingsRepository.GetAllAsync(null, model.AssetTypeTemplateId); foreach (var clientProfileSetting in clientProfileSettings) { clientProfileSetting.AssetTypeId = model.Id; var regulatorySettings = await _regulatorySettingsApi.GetRegulatorySettingsByIdsAsync( clientProfileSetting.RegulatoryProfileId, model.RegulatoryTypeId); ValidateRegulatoryConstraint(regulatorySettings, clientProfileSetting); } } else { clientProfileSettings = new List <ClientProfileSettings>(); var allRegulatorySettings = await _regulatorySettingsApi.GetRegulatorySettingsByRegulationAsync(regulationId); var clientProfiles = await _clientProfilesRepository.GetAllAsync(); foreach (var clientProfile in clientProfiles) { var regulatorySettings = allRegulatorySettings.RegulatorySettings.Single(x => x.TypeId == model.RegulatoryTypeId && x.ProfileId == clientProfile.RegulatoryProfileId); clientProfileSettings.Add(new ClientProfileSettings { AssetTypeId = model.Id, ClientProfileId = clientProfile.Id, Margin = regulatorySettings.MarginMinPercent, IsAvailable = regulatorySettings.IsAvailable, }); } } await _assetTypesRepository.InsertAsync(model, clientProfileSettings); await _auditService.TryAudit(correlationId, username, model.Id, AuditDataType.AssetType, model.ToJson()); await _entityChangedSender.SendEntityCreatedEvent <AssetType, AssetTypeContract, AssetTypeChangedEvent>(model, username, correlationId); foreach (var profileSettings in clientProfileSettings) { await _entityChangedSender .SendEntityCreatedEvent <ClientProfileSettings, ClientProfileSettingsContract, ClientProfileSettingsChangedEvent>(profileSettings, username, correlationId); } }