From 6ce69849bd80e7efcfaff389a79b0d1c40abcf3e Mon Sep 17 00:00:00 2001 From: Brian Bachtel Date: Mon, 1 Aug 2016 15:54:31 -0400 Subject: [PATCH] add campaign criterion example and query method --- v201603/campaign_criterion.go | 45 +++++++++++++++++++--- v201603/cli/campaign_criterion.go | 63 +++++++++++++++++++++++++++++++ v201603/criterion.go | 1 + 3 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 v201603/cli/campaign_criterion.go diff --git a/v201603/campaign_criterion.go b/v201603/campaign_criterion.go index 079c0cb..283dfec 100644 --- a/v201603/campaign_criterion.go +++ b/v201603/campaign_criterion.go @@ -17,8 +17,9 @@ func NewCampaignCriterionService(auth *Auth) *CampaignCriterionService { type CampaignCriterion struct { CampaignId int64 `xml:"campaignId"` + IsNegative bool `xml:"isNegative,omitempty"` Criterion Criterion `xml:"criterion"` - BidModifier float64 `xml:"bidModifier,omitempty"` + BidModifier *float64 `xml:"bidModifier,omitempty"` Errors []error `xml:"-"` } @@ -38,14 +39,19 @@ func (cc CampaignCriterion) MarshalXML(e *xml.Encoder, start xml.StartElement) e if err := criterionMarshalXML(cc.Criterion, e); err != nil { return err } + if cc.BidModifier != nil { + e.EncodeElement(&cc.BidModifier, xml.StartElement{Name: xml.Name{"", "bidModifier"}}) + } + e.EncodeToken(start.End()) return nil } type NegativeCampaignCriterion struct { CampaignId int64 `xml:"campaignId"` + IsNegative bool `xml:"isNegative,omitempty"` Criterion Criterion `xml:"criterion"` - BidModifier float64 `xml:"bidModifier,omitempty"` + BidModifier *float64 `xml:"bidModifier,omitempty"` Errors []error `xml:"-"` } @@ -89,10 +95,14 @@ func (ccs *CampaignCriterions) UnmarshalXML(dec *xml.Decoder, start xml.StartEle return err } cc.Criterion = criterion - case "BidModifier": + case "bidModifier": if err := dec.DecodeElement(&cc.BidModifier, &start); err != nil { return err } + case "isNegative": + if err := dec.DecodeElement(&cc.IsNegative, &start); err != nil { + return err + } } } } @@ -232,6 +242,31 @@ func (s *CampaignCriterionService) Mutate(campaignCriterionOperations CampaignCr return mutateResp.CampaignCriterions, err } -func (s *CampaignCriterionService) Query(query string) (campaignCriterions CampaignCriterions, err error) { - return campaignCriterions, err +func (s *CampaignCriterionService) Query(query string) (campaignCriterions CampaignCriterions, totalCount int64, err error) { + respBody, err := s.Auth.request( + campaignCriterionServiceUrl, + "query", + AWQLQuery{ + XMLName: xml.Name{ + Space: baseUrl, + Local: "query", + }, + Query: query, + }, + ) + + if err != nil { + return campaignCriterions, totalCount, err + } + + getResp := struct { + Size int64 `xml:"rval>totalNumEntries"` + CampaignCriterions CampaignCriterions `xml:"rval>entries"` + }{} + + err = xml.Unmarshal([]byte(respBody), &getResp) + if err != nil { + return campaignCriterions, totalCount, err + } + return getResp.CampaignCriterions, getResp.Size, err } diff --git a/v201603/cli/campaign_criterion.go b/v201603/cli/campaign_criterion.go new file mode 100644 index 0000000..b299ebb --- /dev/null +++ b/v201603/cli/campaign_criterion.go @@ -0,0 +1,63 @@ +package main + +import ( + "encoding/json" + "flag" + "fmt" + gads "github.com/colinmutter/gads/v201603" + "log" +) + +var configJson = flag.String("oauth", "./oauth.json", "API credentials") + +func main() { + flag.Parse() + config, err := gads.NewCredentialsFromFile(*configJson) + if err != nil { + log.Fatal(err) + } + + cs := gads.NewCampaignCriterionService(&config.Auth) + + //bidmodifier := float64(2) + //var bidmodifier float64 + //bidmodifier = 1.04 + + campaignCriterions := gads.CampaignCriterions{ + gads.NegativeCampaignCriterion{ + CampaignId: 123456789, + Criterion: gads.Location{ + Id: 21168, + }, + }, + gads.CampaignCriterion{ + CampaignId: 123456789, + Criterion: gads.Location{ + Id: 21167, + }, + }, + } + + criterions, err := cs.Mutate( + gads.CampaignCriterionOperations{ + "ADD": campaignCriterions, + }, + ) + + fmt.Println(criterions) + criterionJSON, _ := json.MarshalIndent(criterions, "", " ") + fmt.Printf("%s\n", criterionJSON) + + // show all Location Criterion + fmt.Printf("Campaign Criterion\n") + foundCriterions, totalCount, err := cs.Query("SELECT CampaignId,IsNegative,BidModifier,CriteriaType,Id,LocationName,DisplayType,ParentLocations WHERE CampaignId = '211793582' AND CriteriaType IN ['LOCATION']") + fmt.Println(totalCount) + if err != nil { + log.Fatal(err) + } + for _, criterion := range foundCriterions { + criterionJSON, _ := json.MarshalIndent(criterion, "", " ") + fmt.Printf("%s\n", criterionJSON) + } + +} diff --git a/v201603/criterion.go b/v201603/criterion.go index 20f855c..f24951f 100644 --- a/v201603/criterion.go +++ b/v201603/criterion.go @@ -59,6 +59,7 @@ type LanguageCriterion struct { // ParentLocations: type Location struct { Id int64 `xml:"id,omitempty"` + Type string `xml:"type,omitempty"` LocationName string `xml:"locationName,omitempty"` DisplayType string `xml:"displayType,omitempty"` TargetingStatus string `xml:"targetingStatus,omitempty"`