private static AutopilotRuleModel MapToAutopilotRuleModel(AutopilotRule autopilotRule, RuleModel rule, RuleTypeModel ruleType, IMapper mapper) { if (autopilotRule == null) { return(null); } var autopilotRuleModel = mapper.Map <AutopilotRuleModel>(autopilotRule); autopilotRuleModel.Description = rule?.Description; autopilotRuleModel.CampaignType = rule?.CampaignType; autopilotRuleModel.RuleType = ruleType?.Name; return(autopilotRuleModel); }
public IHttpActionResult Put([FromUri] int id, [FromBody] RuleTypeModel command) { if (command == null) { return(BadRequest("Entity can not be null")); } if (command.Id != id) { return(BadRequest("Model id does not match")); } if (!ModelState.IsValid || command.Rules == null || !command.Rules.Any()) { return(this.Error().InvalidParameters("Invalid rule type parameters")); } var targetRuleType = _ruleTypeRepository.Get(id); if (targetRuleType is null) { return(NotFound()); } // Update rule type targetRuleType.Name = command.Name; _ruleTypeRepository.Update(targetRuleType); _ruleTypeRepository.SaveChanges(); var rules = _ruleRepository.FindByRuleTypeId(targetRuleType.Id); var deletedRuleIds = rules.Where(r => command.Rules.All(cr => r.Id != cr.Id)) .Select(r => new { r.Id, r.RuleId }) .ToList(); var maxRuleId = command.Rules.Max(r => r.RuleId) + 1; var newRuleIds = new List <int>(); // Upsert rules per rule type foreach (var ruleItem in command.Rules) { var rule = _ruleRepository.Get(ruleItem.Id); if (rule != null) { rule.Description = ruleItem.Description; rule.InternalType = ruleItem.InternalType; rule.Type = ruleItem.Type; _ruleRepository.Update(rule); } else { rule = _mapper.Map <Rule>(ruleItem); rule.Id = 0; rule.RuleTypeId = id; rule.RuleId = maxRuleId++; _ruleRepository.Add(rule); if (targetRuleType.AllowedForAutopilot && !targetRuleType.IsCustom) { newRuleIds.Add(rule.RuleId); } } } _ruleRepository.SaveChanges(); // Delete rules only for custom rule types if (deletedRuleIds.Any()) { deletedRuleIds.ForEach(r => _ruleRepository.Delete(r.Id)); } _ruleRepository.SaveChanges(); if (targetRuleType.AllowedForAutopilot && !targetRuleType.IsCustom) { UpdateAutopilotRulesRepository(targetRuleType.Id, newRuleIds, deletedRuleIds.Select(r => r.RuleId).ToList()); } var ruleType = _ruleTypeRepository.Get(id); return(Ok(Mappings.MapToRuleTypeModel(ruleType, _ruleRepository, _mapper))); }