diff --git a/service/config/sample.yml b/service/config/sample.yml index ac2835cd7..c41fbc7ce 100644 --- a/service/config/sample.yml +++ b/service/config/sample.yml @@ -264,3 +264,5 @@ badges: - id: TEST imageUrl: https://example.com/test-badge category: other + badgeIdsEnabledForAll: + - TEST diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/badges/ConfiguredProfileBadgeConverter.java b/service/src/main/java/org/whispersystems/textsecuregcm/badges/ConfiguredProfileBadgeConverter.java index c9d0ad0ad..ac602e2ba 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/badges/ConfiguredProfileBadgeConverter.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/badges/ConfiguredProfileBadgeConverter.java @@ -8,6 +8,7 @@ package org.whispersystems.textsecuregcm.badges; import com.google.common.annotations.VisibleForTesting; import java.time.Clock; import java.time.Instant; +import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; @@ -29,6 +30,7 @@ public class ConfiguredProfileBadgeConverter implements ProfileBadgeConverter { private final Clock clock; private final Map knownBadges; + private final List forcedOnBadges; private final ResourceBundleFactory resourceBundleFactory; public ConfiguredProfileBadgeConverter( @@ -45,6 +47,7 @@ public class ConfiguredProfileBadgeConverter implements ProfileBadgeConverter { this.clock = clock; this.knownBadges = badgesConfiguration.getBadges().stream() .collect(Collectors.toMap(BadgeConfiguration::getId, Function.identity())); + this.forcedOnBadges = badgesConfiguration.getBadgeIdsEnabledForAll(); this.resourceBundleFactory = resourceBundleFactory; } @@ -52,7 +55,7 @@ public class ConfiguredProfileBadgeConverter implements ProfileBadgeConverter { public List convert( final List acceptableLanguages, final List accountBadges) { - if (accountBadges.isEmpty()) { + if (accountBadges.isEmpty() && forcedOnBadges.isEmpty()) { return List.of(); } @@ -86,7 +89,7 @@ public class ConfiguredProfileBadgeConverter implements ProfileBadgeConverter { }; final ResourceBundle resourceBundle = resourceBundleFactory.createBundle(BASE_NAME, desiredLocale, control); - return accountBadges.stream() + List badges = accountBadges.stream() .filter(accountBadge -> accountBadge.isVisible() && now.isBefore(accountBadge.getExpiration()) && knownBadges.containsKey(accountBadge.getId())) @@ -99,6 +102,16 @@ public class ConfiguredProfileBadgeConverter implements ProfileBadgeConverter { resourceBundle.getString(accountBadge.getId() + "_name"), resourceBundle.getString(accountBadge.getId() + "_description")); }) - .collect(Collectors.toList()); + .collect(Collectors.toCollection(ArrayList::new)); + badges.addAll(forcedOnBadges.stream().filter(knownBadges::containsKey).map(id -> { + BadgeConfiguration configuration = knownBadges.get(id); + return new Badge( + id, + configuration.getCategory(), + configuration.getImageUrl(), + resourceBundle.getString(id + "_name"), + resourceBundle.getString(id + "_description")); + }).collect(Collectors.toList())); + return badges; } } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/configuration/BadgesConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/BadgesConfiguration.java index 6e1a39275..adf6fdc6a 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/configuration/BadgesConfiguration.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/BadgesConfiguration.java @@ -16,11 +16,14 @@ import javax.validation.constraints.NotNull; public class BadgesConfiguration { private final List badges; + private final List badgeIdsEnabledForAll; @JsonCreator public BadgesConfiguration( - @JsonProperty("badges") @JsonSetter(nulls = Nulls.AS_EMPTY) final List badges) { + @JsonProperty("badges") @JsonSetter(nulls = Nulls.AS_EMPTY) final List badges, + @JsonProperty("badgeIdsEnabledForAll") @JsonSetter(nulls = Nulls.AS_EMPTY) final List badgeIdsEnabledForAll) { this.badges = Objects.requireNonNull(badges); + this.badgeIdsEnabledForAll = Objects.requireNonNull(badgeIdsEnabledForAll); } @Valid @@ -28,4 +31,10 @@ public class BadgesConfiguration { public List getBadges() { return badges; } + + @Valid + @NotNull + public List getBadgeIdsEnabledForAll() { + return badgeIdsEnabledForAll; + } } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/badges/ConfiguredProfileBadgeConverterTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/badges/ConfiguredProfileBadgeConverterTest.java index ce43ce22b..b58d5a168 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/badges/ConfiguredProfileBadgeConverterTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/badges/ConfiguredProfileBadgeConverterTest.java @@ -89,7 +89,7 @@ public class ConfiguredProfileBadgeConverterTest { return objects; } }; - return new BadgesConfiguration(badges); + return new BadgesConfiguration(badges, List.of()); } private BadgeConfiguration getBadge(BadgesConfiguration badgesConfiguration, int i) {