public IHttpActionResult GetCampaignFilterGroup([FromUri] CampaignFilterGroupQueryModel queryModel) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var campaigns = _campaignRepository.GetAllFlat(); return(Ok(GenerateCampaignFilterGroup(campaigns, queryModel))); }
public CampaignFilterGroupModel GenerateCampaignFilterGroup(IEnumerable <CampaignReducedModel> campaigns, CampaignFilterGroupQueryModel query) { var campaignFilterGroupModel = new CampaignFilterGroupModel(); if (campaigns is null || !campaigns.Any() || query is null) { return(campaignFilterGroupModel); } var businessTypes = new List <string>(); var clashExternalRefs = new List <string>(); var productExternalIds = new List <string>(); var reportingCategories = new List <string>(); var campaignsOutput = new List <CampaignFilterGroupDataModel>(); var clashCodes = new List <CampaignFilterGroupDataModel>(); var productBasicModels = new List <CampaignFilterGroupDataModel>(); var mediaSalesGroups = new List <CampaignFilterGroupDataModel>(); var productAssignees = new List <CampaignFilterGroupDataModel>(); var agencies = new List <CampaignFilterGroupDataModel>(); var advertisers = new List <CampaignFilterGroupDataModel>(); foreach (var campaign in campaigns) { businessTypes.Add(campaign.BusinessType); campaignsOutput.Add(new CampaignFilterGroupDataModel { Identifier = campaign.ExternalId, Text = campaign.Name }); productExternalIds.Add(campaign.Product); } var productDictionary = _productRepository .FindByExternal(productExternalIds) .ToDictionary(r => r.Externalidentifier); foreach (var productExternalId in productExternalIds) { if (productDictionary.TryGetValue(productExternalId, out Product product)) { productBasicModels.Add(new CampaignFilterGroupDataModel { Identifier = productExternalId, Text = product.Name }); if (!string.IsNullOrEmpty(product.ClashCode)) { clashExternalRefs.Add(product.ClashCode); } if (!string.IsNullOrEmpty(product.ReportingCategory)) { reportingCategories.Add(product.ReportingCategory); } if (product.AgencyGroup != null && !string.IsNullOrEmpty(product.AgencyGroup.Code)) { mediaSalesGroups.Add(new CampaignFilterGroupDataModel { Identifier = product.AgencyGroup.Code, Text = string.IsNullOrEmpty(product.AgencyGroup.ShortName) ? product.AgencyGroup.Code : product.AgencyGroup.ShortName }); } if (product.SalesExecutive != null) { productAssignees.Add(new CampaignFilterGroupDataModel { Identifier = product.SalesExecutive.Identifier.ToString(), Text = string.IsNullOrEmpty(product.SalesExecutive.Name) ? product.SalesExecutive.Identifier.ToString() : product.SalesExecutive.Name }); } if (!string.IsNullOrEmpty(product.AgencyIdentifier)) { agencies.Add(new CampaignFilterGroupDataModel { Identifier = product.AgencyIdentifier, Text = string.IsNullOrEmpty(product.AgencyName) ? product.AgencyIdentifier : product.AgencyName }); } if (!string.IsNullOrEmpty(product.AdvertiserIdentifier)) { advertisers.Add(new CampaignFilterGroupDataModel { Identifier = product.AdvertiserIdentifier, Text = string.IsNullOrEmpty(product.AdvertiserName) ? product.AdvertiserIdentifier : product.AdvertiserName }); } } } if (query.IsProductFiltered) { campaignFilterGroupModel.Products = productBasicModels .DistinctBy(o => new { o.Identifier, o.Text }) .OrderBy(o => o.Text);; } if (query.IsClashCodeFiltered) { var clashes = _clashRepository.FindByExternal(clashExternalRefs.Distinct().ToList()); foreach (var clash in clashes) { clashCodes.Add(new CampaignFilterGroupDataModel { Identifier = clash.Externalref, Text = clash.Description }); } campaignFilterGroupModel.ClashCodes = clashCodes .DistinctBy(o => new { o.Identifier, o.Text }) .OrderBy(o => o.Text); } if (query.IsBusinessTypeFiltered) { campaignFilterGroupModel.BusinessTypes = businessTypes.Distinct().OrderBy(o => o); } if (query.IsCampaignIdentifierFiltered) { campaignFilterGroupModel.Campaigns = campaignsOutput .DistinctBy(o => new { o.Identifier, o.Text }) .OrderBy(o => o.Text); } if (query.IsReportingCategoryFiltered) { campaignFilterGroupModel.ReportingCategories = reportingCategories.Distinct().OrderBy(o => o); } if (query.IsMediaSalesGroupFiltered) { campaignFilterGroupModel.MediaSalesGroups = mediaSalesGroups .DistinctBy(o => new { o.Identifier, o.Text }) .OrderBy(o => o.Text); } if (query.IsProductAssigneeFiltered) { campaignFilterGroupModel.ProductAssignees = productAssignees .DistinctBy(o => new { o.Identifier, o.Text }) .OrderBy(o => o.Text); } if (query.IsAgencyFiltered) { campaignFilterGroupModel.Agencies = agencies .DistinctBy(o => new { o.Identifier, o.Text }) .OrderBy(o => o.Text); } if (query.IsAdvertiserFiltered) { campaignFilterGroupModel.Advertisers = advertisers .DistinctBy(o => new { o.Identifier, o.Text }) .OrderBy(o => o.Text); } return(campaignFilterGroupModel); }