private static string GetEntityValidationErrors(OENEntities ctx) { var errors = new StringBuilder(); ctx.GetValidationErrors() .ToList() .ForEach(res => { errors.AppendLine("Error Updating entity type " + res.Entry.Entity.GetType() .ToString()); res.ValidationErrors.ToList() .ForEach(err => errors.AppendLine(string.Format("\t{0} : {1}", err.PropertyName, err.ErrorMessage))); }); return errors.ToString(); }
static void Main(string[] args) { OENEntities ctx = null; try { ctx = new OENEntities(); log4net.Config.XmlConfigurator.Configure(); Logger.Info("Starting the association process"); var client = new RestClient(); var request = new RestRequest { OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; } }; //client.BaseUrl = string.Format("https://network.adsmarket.com/api/rest/decoder/publisher_by_group/?uid={0}&key={1}&publisher_id=0&publisher_group={2}&limit={3}",Config.MarketSuperUserId,Config.MarketSuperUserApiKey,Config.MarketApiPublisherGroup,Config.MarketApiPublishersPerRequest ); client.BaseUrl = "https://network.adsmarket.com/api/rest/decoder/publisher_by_group//"; request.AddParameter("uid", Config.MarketSuperUserId); request.AddParameter("key", Config.MarketSuperUserApiKey); request.AddParameter("publisher_id", "0"); request.AddParameter("publisher_group", Config.MarketApiPublisherGroup); request.AddParameter("limit", Config.MarketApiPublishersPerRequest); var publiserResponse = client.Execute<List<Publisher>>(request); if (publiserResponse == null || publiserResponse.Data == null || publiserResponse.Content.ToLower() .Contains("\"errors\"")) { Logger.Info(client.BuildUri(request)); throw new Exception("Response is invalid"); } var publishers = publiserResponse.Data.Where(p => !Config.ExcludedPublisherIds.Contains(p.id)).ToArray(); publiserResponse = null; var dbPublisherIDs = ctx.MarketCampaignAssociations.Select(c => c.MarketAffiliateId) .Distinct() .Union(ctx.MarketOfferAssociations.Select(o => o.MarketAffiliateId).Distinct()); Logger.InfoFormat("Found {0} Publishers, {1} new", publishers.Count(), publishers.Select(p => p.id).Except(dbPublisherIDs).Count()); client = new RestClient(); request = new RestRequest(); //client.BaseUrl = string.Format("https://network.adsmarket.com/site/API2?userid={0}&key={1}&fn=findcampaigns&relationship_status=3",Config.MarketDefaultUserId,Config.MarketDefaultKey); client.BaseUrl = "https://network.adsmarket.com/site/API2"; request.AddParameter("userid", Config.MarketDefaultUserId); request.AddParameter("key", Config.MarketDefaultKey); request.AddParameter("fn", "findcampaigns"); request.AddParameter("relationship_status", "3"); var campaignsResponse = client.Execute<List<Campaign>>(request); if (campaignsResponse == null || campaignsResponse.Data == null || campaignsResponse.Content.ToLower() .Contains("\"errors\"")) { Logger.Info(client.BuildUri(request)); throw new Exception("Response is invalid"); } var dbCampaignIDs = ctx.MarketCampaignAssociations.Select(c => c.CampaignId).Distinct(); Logger.InfoFormat("Found {0} Campaigns, {1} new", campaignsResponse.Data.Count(), campaignsResponse.Data.Select(c => c.Id).Except(dbCampaignIDs).Count()); var programs = campaignsResponse.Data.Select(c => c.ProgramId).Distinct().ToArray(); //foreach (var campaign in campaignsResponse.Data) //{ // if (!programs.Contains(campaign.ProgramId)) // { // programs.Add(campaign.ProgramId); // } //} var dbProgramIDs = ctx.MarketOfferAssociations.Select(o => o.OfferId).Distinct(); Logger.InfoFormat("Found {0} Programs, {1} new", programs.Count(), programs.Except(dbProgramIDs).Count()); var existingProgramAssociations = ctx.MarketOfferAssociations.ToArray(); var missingAPIKey = publishers.Where(p => string.IsNullOrWhiteSpace(p.api_key)).Select(p => p.id); // Associate Programs Logger.InfoFormat("Associating Programs"); foreach (var publisher in publishers) { if (string.IsNullOrWhiteSpace(publisher.api_key)) { Logger.WarnFormat("Publisher {0} missing api_key", publisher.id); } else { var programsToAssociate = programs.Where(p => p != 0 && !existingProgramAssociations.Any(mp => mp.MarketAffiliateId == publisher.id && mp.OfferId == p)); foreach (var program in programsToAssociate) { try { client = new RestClient(); client.BaseUrl = "https://network.adsmarket.com/api/rest/decoder/request_association//"; request = new RestRequest(); request.AddParameter("id", program); request.AddParameter("fapprove", 1); request.AddParameter("uid", publisher.id); request.AddParameter("key", publisher.api_key); request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; }; var programResponse = client.Execute(request); if (programResponse == null || programResponse.Content == null) { Logger.ErrorFormat("Program Association failed Program {0} for Publisher:{1} apiKey:{2}", program, publisher.id, publisher.api_key); continue; } if (programResponse.Content.ToLower() .Contains("error") && !programResponse.Content.ToLower() .Contains("association already exists")) { Logger.ErrorFormat("Program Association failed Program {0} for Publisher:{1} apiKey:{2} response:{3}", program, publisher.id, publisher.api_key, programResponse.Content); continue; } Logger.InfoFormat("Associated Program {0} to Publisher {1}", program, publisher.id); ctx.MarketOfferAssociations.Add(new MarketOfferAssociation() { MarketAPIKey = publisher.api_key, MarketAffiliateId = publisher.id, OfferId = program }); ctx.SaveChanges(); } catch (DbEntityValidationException) { Logger.Error(GetEntityValidationErrors(ctx)); ctx = new OENEntities(); } catch (Exception ex) { Logger.Error(ex.ToString()); } } } } var existingCampaignAssociations = ctx.MarketCampaignAssociations.ToArray(); // Associate Campaigns foreach (var publisher in publishers) { var campaignsToAssociate = campaignsResponse.Data.Where(c => c.Id != 0 && !existingCampaignAssociations.Any(mc => mc.MarketAffiliateId == publisher.id && mc.CampaignId == c.Id)); foreach (var campaign in campaignsToAssociate) { try { client = new RestClient(); client.BaseUrl = "https://network.adsmarket.com/api/rest/decoder/publisher_campaign_association//"; request = new RestRequest(); request.AddParameter("campaign_id", campaign.Id); request.AddParameter("publisher_id", publisher.id); request.AddParameter("uid", "1"); request.AddParameter("key", "a4f0703e44e032caa51fbb092eb6e821"); request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; }; var campaignResponse = client.Execute(request); if (campaignResponse == null || campaignResponse.Content == null) { Logger.ErrorFormat("Campaign Association failed Campaign {0} for Publisher:{1} apiKey:{2}", campaign.Id, publisher.id, publisher.api_key); continue; } if (campaignResponse.Content.ToLower() .Contains("error") && !campaignResponse.Content.ToLower() .Contains("association already exists")) { Logger.ErrorFormat("Campaign Association failed Campaign {0} for Publisher:{1} apiKey:{2} response:{3}", campaign.Id, publisher.id, publisher.api_key, campaignResponse.Content); continue; } Logger.InfoFormat("Associated Campaign {0} to Publisher {1}", campaign.Id, publisher.id); ctx.MarketCampaignAssociations.Add(new MarketCampaignAssociation() { MarketAffiliateId = publisher.id, CampaignId = campaign.Id }); ctx.SaveChanges(); } catch (DbEntityValidationException) { Logger.Error(GetEntityValidationErrors(ctx)); ctx = new OENEntities(); } catch (Exception ex) { Logger.Error(ex.ToString()); } } } Logger.Info("Ending the association process."); } catch (DbEntityValidationException ex) { if (ctx != null) { Logger.Error(GetEntityValidationErrors(ctx)); } else { Logger.Error(ex.ToString()); } } catch (Exception ex) { Logger.Error(ex.ToString()); } }