Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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());
            }
        }