Skip to content

Commit aae5c5d

Browse files
Add video cache TTL enforcement for /vtrack endpoint (#4136)
1 parent 9796be0 commit aae5c5d

File tree

10 files changed

+570
-109
lines changed

10 files changed

+570
-109
lines changed

src/main/java/org/prebid/server/cache/CoreCacheService.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,11 +212,12 @@ public Future<BidCacheResponse> cachePutObjects(List<BidPutObject> bidPutObjects
212212
Boolean isEventsEnabled,
213213
Set<String> biddersAllowingVastUpdate,
214214
String accountId,
215+
Integer accountTtl,
215216
String integration,
216217
Timeout timeout) {
217218

218-
final List<CachedCreative> cachedCreatives =
219-
updatePutObjects(bidPutObjects, isEventsEnabled, biddersAllowingVastUpdate, accountId, integration);
219+
final List<CachedCreative> cachedCreatives = updatePutObjects(
220+
bidPutObjects, isEventsEnabled, biddersAllowingVastUpdate, accountId, accountTtl, integration);
220221

221222
updateCreativeMetrics(
222223
cachedCreatives,
@@ -230,6 +231,7 @@ private List<CachedCreative> updatePutObjects(List<BidPutObject> bidPutObjects,
230231
Boolean isEventsEnabled,
231232
Set<String> allowedBidders,
232233
String accountId,
234+
Integer accountTtl,
233235
String integration) {
234236

235237
return bidPutObjects.stream()
@@ -244,11 +246,18 @@ private List<CachedCreative> updatePutObjects(List<BidPutObject> bidPutObjects,
244246
putObject,
245247
accountId,
246248
integration))
249+
.ttlseconds(resolveVtrackTtl(putObject.getTtlseconds(), accountTtl))
247250
.build())
248251
.map(payload -> CachedCreative.of(payload, creativeSizeFromTextNode(payload.getValue())))
249252
.toList();
250253
}
251254

255+
private static Integer resolveVtrackTtl(Integer initialObjectTtl, Integer initialAccountTtl) {
256+
final Integer accountTtl = initialAccountTtl != null && initialAccountTtl > 0 ? initialAccountTtl : null;
257+
final Integer objectTtl = initialObjectTtl != null && initialObjectTtl > 0 ? initialObjectTtl : null;
258+
return ObjectUtils.min(objectTtl, accountTtl);
259+
}
260+
252261
public Future<CacheServiceResult> cacheBidsOpenrtb(List<BidInfo> bidsToCache,
253262
AuctionContext auctionContext,
254263
CacheContext cacheContext,

src/main/java/org/prebid/server/handler/PostVtrackHandler.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,15 @@
2929
import org.prebid.server.settings.model.Account;
3030
import org.prebid.server.settings.model.AccountAuctionConfig;
3131
import org.prebid.server.settings.model.AccountEventsConfig;
32+
import org.prebid.server.settings.model.AccountVtrackConfig;
3233
import org.prebid.server.util.HttpUtil;
3334
import org.prebid.server.vertx.verticles.server.HttpEndpoint;
3435
import org.prebid.server.vertx.verticles.server.application.ApplicationResource;
3536

3637
import java.util.Collections;
3738
import java.util.List;
3839
import java.util.Objects;
40+
import java.util.Optional;
3941
import java.util.Set;
4042
import java.util.stream.Collectors;
4143

@@ -180,10 +182,12 @@ private void handleAccountResult(AsyncResult<Account> asyncAccount,
180182
respondWithServerError(routingContext, "Error occurred while fetching account", asyncAccount.cause());
181183
} else {
182184
// insert impression tracking if account allows events and bidder allows VAST modification
183-
final Boolean isEventEnabled = accountEventsEnabled(asyncAccount.result());
185+
final Account account = asyncAccount.result();
186+
final Boolean isEventEnabled = accountEventsEnabled(account);
187+
final Integer accountTtl = accountVtrackTtl(account);
184188
final Set<String> allowedBidders = biddersAllowingVastUpdate(vtrackPuts);
185189
coreCacheService.cachePutObjects(
186-
vtrackPuts, isEventEnabled, allowedBidders, accountId, integration, timeout)
190+
vtrackPuts, isEventEnabled, allowedBidders, accountId, accountTtl, integration, timeout)
187191
.onComplete(asyncCache -> handleCacheResult(asyncCache, routingContext));
188192
}
189193
}
@@ -196,6 +200,12 @@ private static Boolean accountEventsEnabled(Account account) {
196200
return accountEventsConfig != null ? accountEventsConfig.getEnabled() : null;
197201
}
198202

203+
private static Integer accountVtrackTtl(Account account) {
204+
return Optional.ofNullable(account.getVtrack())
205+
.map(AccountVtrackConfig::getTtl)
206+
.orElse(null);
207+
}
208+
199209
/**
200210
* Returns list of bidders that allow VAST XML modification.
201211
*/

src/main/java/org/prebid/server/settings/model/Account.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public class Account {
3030
@JsonAlias("alternate-bidder-codes")
3131
AccountAlternateBidderCodes alternateBidderCodes;
3232

33+
AccountVtrackConfig vtrack;
34+
3335
public static Account empty(String id) {
3436
return Account.builder().id(id).build();
3537
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.prebid.server.settings.model;
2+
3+
import lombok.Value;
4+
5+
@Value(staticConstructor = "of")
6+
public class AccountVtrackConfig {
7+
8+
Integer ttl;
9+
}

src/test/groovy/org/prebid/server/functional/model/config/AccountConfig.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class AccountConfig {
2626
AlternateBidderCodes alternateBidderCodes
2727
@JsonProperty("alternate_bidder_codes")
2828
AlternateBidderCodes alternateBidderCodesSnakeCase
29+
AccountVtrackConfig vtrack
2930

3031
static getDefaultAccountConfig() {
3132
new AccountConfig(status: AccountStatus.ACTIVE)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.prebid.server.functional.model.config
2+
3+
import groovy.transform.ToString
4+
5+
@ToString(includeNames = true, ignoreNulls = true)
6+
class AccountVtrackConfig {
7+
8+
Integer ttl
9+
}

src/test/groovy/org/prebid/server/functional/service/PrebidServerService.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ class PrebidServerService implements ObjectMapperWrapper {
215215
}
216216

217217
PrebidCacheResponse sendPostVtrackRequest(VtrackRequest request, String account) {
218-
def response = given(requestSpecification).queryParam("a", account)
218+
def response = given(requestSpecification).queryParams(["a": account])
219219
.body(request)
220220
.post(VTRACK_ENDPOINT)
221221

0 commit comments

Comments
 (0)