-
Notifications
You must be signed in to change notification settings - Fork 238
Expand file tree
/
Copy pathEidPermissionResolver.java
More file actions
81 lines (65 loc) · 3.43 KB
/
EidPermissionResolver.java
File metadata and controls
81 lines (65 loc) · 3.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package org.prebid.server.auction;
import com.iab.openrtb.request.Eid;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidDataEidPermissions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class EidPermissionResolver {
private static final String WILDCARD_BIDDER = "*";
private static final ExtRequestPrebidDataEidPermissions DEFAULT_RULE = ExtRequestPrebidDataEidPermissions.builder()
.bidders(Collections.singletonList(WILDCARD_BIDDER))
.build();
private static final EidPermissionResolver EMPTY = new EidPermissionResolver(Collections.emptyList());
private final List<ExtRequestPrebidDataEidPermissions> eidPermissions;
private EidPermissionResolver(List<ExtRequestPrebidDataEidPermissions> eidPermissions) {
this.eidPermissions = new ArrayList<>(eidPermissions);
this.eidPermissions.add(DEFAULT_RULE);
}
public static EidPermissionResolver of(List<ExtRequestPrebidDataEidPermissions> eidPermissions) {
return new EidPermissionResolver(eidPermissions);
}
public static EidPermissionResolver empty() {
return EMPTY;
}
public List<Eid> resolveAllowedEids(List<Eid> userEids, String bidder) {
return CollectionUtils.emptyIfNull(userEids)
.stream()
.filter(userEid -> isAllowed(userEid, bidder))
.toList();
}
private boolean isAllowed(Eid eid, String bidder) {
final Map<Integer, List<ExtRequestPrebidDataEidPermissions>> matchingRulesBySpecificity = eidPermissions
.stream()
.filter(rule -> isRuleMatched(eid, rule))
.collect(Collectors.groupingBy(this::getRuleSpecificity));
final int highestSpecificityMatchingRules = Collections.max(matchingRulesBySpecificity.keySet());
return matchingRulesBySpecificity.get(highestSpecificityMatchingRules).stream()
.anyMatch(eidPermission -> isBidderAllowed(bidder, eidPermission.getBidders()));
}
private int getRuleSpecificity(ExtRequestPrebidDataEidPermissions eidPermission) {
return (int) Stream.of(
eidPermission.getInserter(),
eidPermission.getSource(),
eidPermission.getMatcher(),
eidPermission.getMm())
.filter(Objects::nonNull)
.count();
}
private boolean isRuleMatched(Eid eid, ExtRequestPrebidDataEidPermissions eidPermission) {
return (eidPermission.getInserter() == null || eidPermission.getInserter().equals(eid.getInserter()))
&& (eidPermission.getSource() == null || eidPermission.getSource().equals(eid.getSource()))
&& (eidPermission.getMatcher() == null || eidPermission.getMatcher().equals(eid.getMatcher()))
&& (eidPermission.getMm() == null || eidPermission.getMm().equals(eid.getMm()));
}
private boolean isBidderAllowed(String bidder, List<String> ruleBidders) {
return ruleBidders == null || ruleBidders.stream()
.anyMatch(allowedBidder -> StringUtils.equalsIgnoreCase(allowedBidder, bidder)
|| WILDCARD_BIDDER.equals(allowedBidder));
}
}