Skip to content

Commit 4c02420

Browse files
committed
Update the fee extension 1.0 and add some tests
Many of the actual fee extension changes are based off Weimin's PR google#2912, though this makes some additional changes based on the XML schema and description from RFC 8748. This adds tests for the DomainCheckFlow which is the most complex and thorough user of the fee extension, but we'll want to add further tests to the other domain flows to make sure they're handled correctly.
1 parent 2b47bc9 commit 4c02420

38 files changed

Lines changed: 1453 additions & 225 deletions

File tree

core/src/main/java/google/registry/flows/domain/DomainCheckFlow.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
import java.util.Optional;
8989
import java.util.Set;
9090
import java.util.stream.Collectors;
91+
import org.joda.money.CurrencyUnit;
9192
import org.joda.time.DateTime;
9293

9394
/**
@@ -298,11 +299,13 @@ private ImmutableList<? extends ResponseExtension> getResponseExtensions(
298299

299300
boolean shouldUseTieredPricingPromotion =
300301
RegistryConfig.getTieredPricingPromotionRegistrarIds().contains(registrarId);
302+
ImmutableSet.Builder<CurrencyUnit> currenciesBuilder = new ImmutableSet.Builder<>();
301303
for (FeeCheckCommandExtensionItem feeCheckItem : feeCheck.getItems()) {
302304
for (String domainName : getDomainNamesToCheckForFee(feeCheckItem, domainNames.keySet())) {
303305
FeeCheckResponseExtensionItem.Builder<?> builder = feeCheckItem.createResponseBuilder();
304306
Optional<Domain> domain = Optional.ofNullable(domainObjs.get(domainName));
305307
Tld tld = Tld.get(domainNames.get(domainName).parent().toString());
308+
currenciesBuilder.add(tld.getCurrency());
306309
Optional<AllocationToken> token;
307310
try {
308311
// The precise token to use for this fee request may vary based on the domain or even the
@@ -385,7 +388,12 @@ private ImmutableList<? extends ResponseExtension> getResponseExtensions(
385388
responseItems.add(builder.setDomainNameIfSupported(domainName).build());
386389
}
387390
}
388-
return ImmutableList.of(feeCheck.createResponse(responseItems.build()));
391+
ImmutableSet<CurrencyUnit> seenCurrencies = currenciesBuilder.build();
392+
if (seenCurrencies.size() > 1) {
393+
throw new MultipleCurrenciesCannotBeCheckedException();
394+
}
395+
return ImmutableList.of(
396+
feeCheck.createResponse(responseItems.build(), seenCurrencies.iterator().next()));
389397
}
390398

391399
/**
@@ -493,4 +501,13 @@ static class OnlyCheckedNamesCanBeFeeCheckedException extends ParameterValuePoli
493501
super("By server policy, fee check names must be listed in the availability check");
494502
}
495503
}
504+
505+
/** Domains across multiple currencies cannot be checked simultaneously. */
506+
static class MultipleCurrenciesCannotBeCheckedException
507+
extends ParameterValuePolicyErrorException {
508+
public MultipleCurrenciesCannotBeCheckedException() {
509+
// The fee extension 1.0 only supports one currency shared across all results
510+
super("Domains across multiple currencies cannot be checked simultaneously");
511+
}
512+
}
496513
}

core/src/main/java/google/registry/model/domain/fee/FeeCheckCommandExtension.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,9 @@ public interface FeeCheckCommandExtension<
4242
ImmutableList<C> getItems();
4343

4444
R createResponse(ImmutableList<? extends FeeCheckResponseExtensionItem> items);
45+
46+
default R createResponse(
47+
ImmutableList<? extends FeeCheckResponseExtensionItem> items, CurrencyUnit currency) {
48+
return createResponse(items);
49+
}
4550
}

core/src/main/java/google/registry/model/domain/feestdv1/FeeCheckCommandExtensionItemStdV1.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import google.registry.model.domain.Period;
1919
import google.registry.model.domain.fee.FeeCheckCommandExtensionItem;
2020
import jakarta.xml.bind.annotation.XmlAttribute;
21-
import jakarta.xml.bind.annotation.XmlElement;
2221
import jakarta.xml.bind.annotation.XmlType;
2322
import java.util.Locale;
2423
import java.util.Optional;
@@ -32,12 +31,13 @@
3231
* <pre>{@code
3332
* <fee:command name="renew" phase="sunrise" subphase="hello">
3433
* <fee:period unit="y">1</fee:period>
35-
* <fee:class>premium</fee:class>
36-
* <fee:date>2017-05-17T13:22:21.0Z</fee:date>
3734
* </fee:command>
3835
* }</pre>
36+
*
37+
* <p>The `feeClass` and `feeDate` attributes that are present in version 0.12 are removed from this
38+
* version.
3939
*/
40-
@XmlType(propOrder = {"period", "feeClass", "feeDate"})
40+
@XmlType(propOrder = {"period"})
4141
public class FeeCheckCommandExtensionItemStdV1 extends FeeCheckCommandExtensionItem {
4242

4343
/** The default validity period (if not specified) is 1 year for all operations. */
@@ -50,12 +50,6 @@ public class FeeCheckCommandExtensionItemStdV1 extends FeeCheckCommandExtensionI
5050

5151
@XmlAttribute String subphase;
5252

53-
@XmlElement(name = "class")
54-
String feeClass;
55-
56-
@XmlElement(name = "date")
57-
DateTime feeDate;
58-
5953
/** Version 1.0 does not support domain name or currency in fee extension items. */
6054
@Override
6155
public boolean isDomainNameSupported() {
@@ -107,6 +101,6 @@ public FeeCheckResponseExtensionItemStdV1.Builder createResponseBuilder() {
107101

108102
@Override
109103
public Optional<DateTime> getEffectiveDate() {
110-
return Optional.ofNullable(feeDate);
104+
return Optional.empty();
111105
}
112106
}

core/src/main/java/google/registry/model/domain/feestdv1/FeeCheckCommandExtensionStdV1.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,17 @@ public ImmutableList<FeeCheckCommandExtensionItemStdV1> getItems() {
5151
@Override
5252
public FeeCheckResponseExtensionStdV1 createResponse(
5353
ImmutableList<? extends FeeCheckResponseExtensionItem> items) {
54+
return createResponse(items, CurrencyUnit.USD);
55+
}
56+
57+
@Override
58+
public FeeCheckResponseExtensionStdV1 createResponse(
59+
ImmutableList<? extends FeeCheckResponseExtensionItem> items, CurrencyUnit currency) {
5460
ImmutableList.Builder<FeeCheckResponseExtensionItemStdV1> builder =
5561
new ImmutableList.Builder<>();
5662
for (FeeCheckResponseExtensionItem item : items) {
57-
if (item instanceof FeeCheckResponseExtensionItemStdV1) {
58-
builder.add((FeeCheckResponseExtensionItemStdV1) item);
63+
if (item instanceof FeeCheckResponseExtensionItemStdV1 stdv1Item) {
64+
builder.add(stdv1Item);
5965
}
6066
}
6167
return FeeCheckResponseExtensionStdV1.create(currency, builder.build());

core/src/main/java/google/registry/model/domain/feestdv1/FeeCheckResponseExtensionItemCommandStdV1.java

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,11 @@
2424
import google.registry.model.domain.fee.Fee;
2525
import google.registry.model.domain.fee.FeeQueryCommandExtensionItem.CommandName;
2626
import jakarta.xml.bind.annotation.XmlAttribute;
27-
import jakarta.xml.bind.annotation.XmlElement;
2827
import jakarta.xml.bind.annotation.XmlType;
2928
import java.util.List;
30-
import org.joda.time.DateTime;
3129

3230
/** The version 1.0 response command entity for a domain check on a single resource. */
33-
@XmlType(propOrder = {"period", "fee", "effectiveDate", "notAfterDate"})
31+
@XmlType(propOrder = {"period", "fee"})
3432
public class FeeCheckResponseExtensionItemCommandStdV1 extends ImmutableObject {
3533

3634
/** The command that was checked. */
@@ -53,14 +51,6 @@ public class FeeCheckResponseExtensionItemCommandStdV1 extends ImmutableObject {
5351
*/
5452
List<Fee> fee;
5553

56-
/** The effective date that the check is to be performed on (if specified in the query). */
57-
@XmlElement(name = "date")
58-
DateTime effectiveDate;
59-
60-
/** The date after which the quoted fee is no longer valid (if applicable). */
61-
@XmlElement(name = "notAfter")
62-
DateTime notAfterDate;
63-
6454
/** Builder for {@link FeeCheckResponseExtensionItemCommandStdV1}. */
6555
public static class Builder extends Buildable.Builder<FeeCheckResponseExtensionItemCommandStdV1> {
6656

@@ -84,16 +74,6 @@ public Builder setPeriod(Period period) {
8474
return this;
8575
}
8676

87-
public Builder setEffectiveDate(DateTime effectiveDate) {
88-
getInstance().effectiveDate = effectiveDate;
89-
return this;
90-
}
91-
92-
public Builder setNotAfterDate(DateTime notAfterDate) {
93-
getInstance().notAfterDate = notAfterDate;
94-
return this;
95-
}
96-
9777
public Builder setFee(List<Fee> fees) {
9878
getInstance().fee = forceEmptyToNull(ImmutableList.copyOf(fees));
9979
return this;

core/src/main/java/google/registry/model/domain/feestdv1/FeeCheckResponseExtensionItemStdV1.java

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,18 @@
1717
import static google.registry.util.CollectionUtils.forceEmptyToNull;
1818

1919
import com.google.common.collect.ImmutableList;
20-
import google.registry.model.domain.DomainObjectSpec;
2120
import google.registry.model.domain.Period;
2221
import google.registry.model.domain.fee.Fee;
2322
import google.registry.model.domain.fee.FeeCheckResponseExtensionItem;
2423
import google.registry.model.domain.fee.FeeQueryCommandExtensionItem.CommandName;
2524
import jakarta.xml.bind.annotation.XmlType;
26-
import org.joda.time.DateTime;
2725

2826
/** The version 1.0 response for a domain check on a single resource. */
29-
@XmlType(propOrder = {"object", "feeClass", "command"})
27+
@XmlType(propOrder = {"objID", "feeClass", "command"})
3028
public class FeeCheckResponseExtensionItemStdV1 extends FeeCheckResponseExtensionItem {
3129

3230
/** The domain that was checked. */
33-
DomainObjectSpec object;
31+
String objID;
3432

3533
/** The command that was checked. */
3634
FeeCheckResponseExtensionItemCommandStdV1 command;
@@ -88,7 +86,7 @@ public Builder setClass(String feeClass) {
8886

8987
@Override
9088
public Builder setDomainNameIfSupported(String name) {
91-
getInstance().object = new DomainObjectSpec(name);
89+
getInstance().objID = name;
9290
return this;
9391
}
9492

@@ -97,17 +95,5 @@ public FeeCheckResponseExtensionItemStdV1 build() {
9795
getInstance().command = commandBuilder.build();
9896
return super.build();
9997
}
100-
101-
@Override
102-
public Builder setEffectiveDateIfSupported(DateTime effectiveDate) {
103-
commandBuilder.setEffectiveDate(effectiveDate);
104-
return this;
105-
}
106-
107-
@Override
108-
public Builder setNotAfterDateIfSupported(DateTime notAfterDate) {
109-
commandBuilder.setNotAfterDate(notAfterDate);
110-
return this;
111-
}
11298
}
11399
}

core/src/main/java/google/registry/model/eppcommon/ProtocolDefinition.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public enum ServiceExtension {
5656
FEE_0_6(FeeCheckCommandExtensionV06.class, FeeCheckResponseExtensionV06.class, true),
5757
FEE_0_11(FeeCheckCommandExtensionV11.class, FeeCheckResponseExtensionV11.class, true),
5858
FEE_0_12(FeeCheckCommandExtensionV12.class, FeeCheckResponseExtensionV12.class, true),
59-
FEE_1_00(FeeCheckCommandExtensionStdV1.class, FeeCheckResponseExtensionStdV1.class, false),
59+
FEE_1_00(FeeCheckCommandExtensionStdV1.class, FeeCheckResponseExtensionStdV1.class, true),
6060
METADATA_1_0(MetadataExtension.class, null, false);
6161

6262
private final Class<? extends CommandExtension> commandExtensionClass;

0 commit comments

Comments
 (0)