Skip to content

Commit 353375a

Browse files
authored
Merge pull request #73 from taboola/closing-api-gaps-2023
Closing api gaps 2023
2 parents 8124df7 + 0e8903c commit 353375a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1701
-56
lines changed

README.md

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
## Backstage API Java Client
22

33
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.taboola/backstage-api-java-client/badge.svg?style=plastic)](https://maven-badges.herokuapp.com/maven-central/com.taboola/backstage-api-java-client)
4-
[![Build Status](https://app.travis-ci.com/taboola/backstage-api-java-client.svg?branch=master)](https://app.travis-ci.com/taboola/backstage-api-java-client)
4+
5+
[//]: # ([![Build Status](https://app.travis-ci.com/taboola/backstage-api-java-client.svg?branch=master)](https://app.travis-ci.com/taboola/backstage-api-java-client))
56

67
### Table of Contents
78
1. [Getting Started](#1-getting-started)
@@ -65,21 +66,21 @@ try {
6566
//create campaign
6667
Campaign campaign = backstage.campaignsService().create(clientAuth, accountId, createCampaignOperation);
6768
68-
//configure item
69-
CampaignItemOperation campaignItemOperation = CampaignItemOperation.create()
70-
.setUrl("http://www.example.com");
69+
//configure first item
70+
CampaignItemOperation firstCampaignItem = CampaignItemOperation.create()
71+
.setUrl("http://www.example.com")
72+
.setTitle("Example Title")
73+
.setThumbnailUrl("http://www.example.com/thumbnail.png");
7174
72-
//create item
73-
CampaignItem item = backstage.campaignItemsService().createItem(clientAuth, accountId,
74-
campaign.getId(), campaignItemOperation);
75+
//configure collection item creation request
76+
CampaignItemMassiveOperation campaignItemMassiveOperation = CampaignItemMassiveOperation.create()
77+
.addItem(firstCampaignItem);
7578
76-
//polling until Taboola crawler done crawling our supplied URL
77-
while(ItemStatus.CRAWLING.equals(item.getStatus())) {
78-
Thread.sleep(10_000L);
79-
item = backstage.campaignItemsService().readItem(clientAuth, accountId, campaign.getId(), item.getId());
80-
}
79+
//create items
80+
Results<CampaignItem> item = backstage.campaignItemsService().createMassive(clientAuth, accountId,
81+
campaign.getId(), campaignItemMassiveOperation);
8182
82-
//item done crawling, do something...
83+
//items and campaigns were created, do something...
8384
8485
} catch (BackstageAPIUnauthorizedException e) {
8586
logger.warn("Token is expired or bad credentials", e);
@@ -93,7 +94,7 @@ try {
9394
### 3. Authentication
9495

9596
Supports:
96-
1. CLIENT_CREDENTIALS
97+
1. CLIENT_CREDENTIALS - Recommended for server to server integrations
9798
2. PASSWORD_AUTHENTICATION
9899

99100
Authentication service can be found under Backstage instance, see below:

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<modelVersion>4.0.0</modelVersion>
77
<groupId>com.taboola</groupId>
88
<artifactId>backstage-api-java-client</artifactId>
9-
<version>1.1.4</version>
9+
<version>1.1.5</version>
1010

1111
<name>${project.groupId}:${project.artifactId}</name>
1212
<description>Backstage API Java Client</description>

src/main/java/com/taboola/backstage/Backstage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ public static class BackstageBuilder {
181181
private static final String DEFAULT_BACKSTAGE_HOST = "https://backstage.taboola.com/backstage/";
182182
private static final String DEFAULT_AUTH_BACKSTAGE_HOST = "https://authentication.taboola.com/authentication/";
183183
private static final String DEFAULT_USER_AGENT = "Taboola Java Client";
184-
private static final String VERSION = "1.1.4";
184+
private static final String VERSION = "1.1.5";
185185
private static final SerializationConfig DEFAULT_SERIALIZATION_CONFIG = new SerializationConfig();
186186

187187
private String baseUrl;

src/main/java/com/taboola/backstage/internal/BackstageCampaignItemsEndpoint.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
import com.taboola.backstage.model.media.campaigns.items.CampaignItemMassiveCreationOperation;
88
import com.taboola.backstage.model.media.campaigns.items.CampaignItemMassiveOperation;
99
import com.taboola.backstage.model.media.campaigns.items.CampaignItemMassiveUpdateOperation;
10+
import com.taboola.backstage.model.media.campaigns.items.CampaignPerformanceVideoItem;
11+
import com.taboola.backstage.model.media.campaigns.items.PerformanceVideoBulkCreateOperation;
12+
import com.taboola.backstage.model.media.campaigns.items.PerformanceVideoBulkUpdateOperation;
1013

1114
import retrofit2.http.*;
1215

@@ -103,4 +106,53 @@ CampaignItem deleteItem(@Header("Authorization") String accessToken,
103106
@Path("account_id") String accountId,
104107
@Path("campaign_id") String campaignId,
105108
@Path("item_id") String itemId) throws BackstageAPIException;
109+
110+
@GET(BackstagePaths.BACKSTAGE_API_PATH_PREFIX + "/{account_id}/campaigns/{campaign_id}/performance-video/items")
111+
@Headers("Content-Type: application/json")
112+
Results<CampaignPerformanceVideoItem> getVideoCreatives(@Header("Authorization") String authToken,
113+
@Path("account_id") String accountId,
114+
@Path("campaign_id") String campaignId) throws BackstageAPIException;
115+
116+
@GET(BackstagePaths.BACKSTAGE_API_PATH_PREFIX + "/{account_id}/campaigns/{campaign_id}/performance-video/items/{creative_id}")
117+
@Headers("Content-Type: application/json")
118+
CampaignPerformanceVideoItem getVideoCreative(@Header("Authorization") String authToken,
119+
@Path("account_id") String accountId,
120+
@Path("campaign_id") String campaignId,
121+
@Path("creative_id") String creativeId) throws BackstageAPIException;
122+
123+
@POST(BackstagePaths.BACKSTAGE_API_PATH_PREFIX + "/{account_id}/campaigns/{campaign_id}/performance-video/items")
124+
@Headers("Content-Type: application/json")
125+
CampaignPerformanceVideoItem insertVideoCreative(@Header("Authorization") String accessToken,
126+
@Path("account_id") String accountId,
127+
@Path("campaign_id") String campaignId,
128+
@Body CampaignPerformanceVideoItem newItem) throws BackstageAPIException;
129+
130+
@PUT(BackstagePaths.BACKSTAGE_API_PATH_PREFIX + "/{account_id}/campaigns/{campaign_id}/performance-video/items/{creative_id}")
131+
@Headers("Content-Type: application/json")
132+
CampaignPerformanceVideoItem updateVideoCreative(@Header("Authorization") String accessToken,
133+
@Path("account_id") String accountId,
134+
@Path("campaign_id") String campaignId,
135+
@Path("creative_id") String creativeId,
136+
@Query("bypass_url_response_validation") boolean bypassUrlResponseValidation,
137+
@Body CampaignPerformanceVideoItem updatePojo) throws BackstageAPIException;
138+
139+
@DELETE(BackstagePaths.BACKSTAGE_API_PATH_PREFIX + "/{account_id}/campaigns/{campaign_id}/performance-video/items/{creative_id}")
140+
@Headers("Content-Type: application/json")
141+
CampaignPerformanceVideoItem deleteVideoCreative(@Header("Authorization") String accessToken,
142+
@Path("account_id") String accountId,
143+
@Path("campaign_id") String campaignId,
144+
@Path("creative_id") String creativeId) throws BackstageAPIException;
145+
146+
@PUT(BackstagePaths.BACKSTAGE_API_PATH_PREFIX + "/{account_id}/items/bulk/performance-video")
147+
@Headers("Content-Type: application/json")
148+
Results<CampaignPerformanceVideoItem> bulkCreateVideo(@Header("Authorization") String accessToken,
149+
@Path("account_id") String accountId,
150+
@Body PerformanceVideoBulkCreateOperation create) throws BackstageAPIException;
151+
152+
@POST(BackstagePaths.BACKSTAGE_API_PATH_PREFIX + "/{account_id}/items/bulk/performance-video")
153+
@Headers("Content-Type: application/json")
154+
Results<CampaignPerformanceVideoItem> bulkUpdateVideo(@Header("Authorization") String accessToken,
155+
@Path("account_id") String accountId,
156+
@Query("bypass_url_response_validation") boolean bypassUrlResponseValidation,
157+
@Body PerformanceVideoBulkUpdateOperation update) throws BackstageAPIException;
106158
}

src/main/java/com/taboola/backstage/internal/BackstageCampaignsEndpoint.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.taboola.backstage.model.media.campaigns.Campaign;
66
import com.taboola.backstage.model.media.campaigns.CampaignBase;
77
import com.taboola.backstage.model.media.campaigns.CampaignPatch;
8+
import com.taboola.backstage.model.media.campaigns.CampaignTargetingCollection;
89
import com.taboola.backstage.model.media.campaigns.CampaignsMassiveOperation;
910

1011
import retrofit2.http.*;
@@ -77,4 +78,10 @@ CampaignPatch patchCampaign(@Header("Authorization") String accessToken,
7778
Campaign deleteCampaign(@Header("Authorization") String accessToken,
7879
@Path("account_id") String accountId,
7980
@Path("campaign_id") String campaignId);
81+
82+
@GET(BackstagePaths.BACKSTAGE_API_PATH_PREFIX + "{account_id}/campaigns/{campaign_id}/targeting/publisher_targeting/whitelist")
83+
@Headers("Content-Type: application/json")
84+
CampaignTargetingCollection<String> getCampaignTargetingWhiteList(@Header("Authorization") String accessToken,
85+
@Path("account_id") String accountId,
86+
@Path("campaign_id") String campaignId);
8087
}

src/main/java/com/taboola/backstage/internal/BackstageMediaReportsEndpoint.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.taboola.backstage.exceptions.BackstageAPIException;
44
import com.taboola.backstage.model.media.reports.CampaignSummaryReport;
5+
import com.taboola.backstage.model.media.reports.HistoryReport;
56
import com.taboola.backstage.model.media.reports.TopCampaignContentReport;
67
import retrofit2.http.*;
78

@@ -32,4 +33,11 @@ CampaignSummaryReport getCampaignSummary(@Header("Authorization") String authTok
3233
@Query("start_date") String startDate,
3334
@Query("end_date") String endDate,
3435
@QueryMap Map<String, String> filters) throws BackstageAPIException;
35-
}
36+
37+
@GET(BackstagePaths.BACKSTAGE_API_PATH_PREFIX + "/{account_id}/reports/campaign-history/dimensions/by_account")
38+
@Headers("Content-Type: application/json")
39+
HistoryReport getCampaignHistoryByAccountReport(@Header("Authorization") String authToken,
40+
@Path("account_id") String accountId,
41+
@Query("start_date") String startDate,
42+
@Query("end_date") String endDate) throws BackstageAPIException;
43+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.taboola.backstage.model.media.campaigns;
2+
3+
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
4+
5+
/**
6+
* Created by vladi.m
7+
* Date 13/11/2023
8+
* Time 9:46
9+
* Copyright Taboola
10+
*/
11+
public enum AggregationType {
12+
AGGREGATED,
13+
LAST_VALUE,
14+
@JsonEnumDefaultValue UNSUPPORTED_BY_SDK_VALUE
15+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.taboola.backstage.model.media.campaigns;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
5+
/**
6+
* Created by vladi.m
7+
* Date 13/11/2023
8+
* Time 9:38
9+
* Copyright Taboola
10+
*/
11+
public class AttributionConfig {
12+
private Integer lookBackWindowInMinutes;
13+
private Integer vtaLookBackWindowInMinutes;
14+
private AggregationType aggregationType;
15+
16+
public Integer getLookBackWindowInMinutes() {
17+
return lookBackWindowInMinutes;
18+
}
19+
20+
public void setLookBackWindowInMinutes(Integer lookBackWindowInMinutes) {
21+
this.lookBackWindowInMinutes = lookBackWindowInMinutes;
22+
}
23+
24+
public Integer getVtaLookBackWindowInMinutes() {
25+
return vtaLookBackWindowInMinutes;
26+
}
27+
28+
public void setVtaLookBackWindowInMinutes(Integer vtaLookBackWindowInMinutes) {
29+
this.vtaLookBackWindowInMinutes = vtaLookBackWindowInMinutes;
30+
}
31+
32+
public AggregationType getAggregationType() {
33+
return aggregationType;
34+
}
35+
36+
public void setAggregationType(AggregationType aggregationType) {
37+
this.aggregationType = aggregationType;
38+
}
39+
40+
@Override
41+
public String toString() {
42+
return "AttributionConfig{" +
43+
"lookBackWindowInMinutes=" + lookBackWindowInMinutes +
44+
", vtaLookBackWindowInMinutes=" + vtaLookBackWindowInMinutes +
45+
", aggregationType=" + aggregationType +
46+
'}';
47+
}
48+
}

0 commit comments

Comments
 (0)