Unnest transactionFieldAmount from DomainTransactionRecord

After working further with domain deletes, I realized we'll need to record multiple reportingTimes under a single historyEntry when issuing a -1 counter to cancel grace-period adds. Since the TLD would be the only shared component within a record, we'll just duplicate it across all records to save an unnecessary layer of hierarchy.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=166261413
This commit is contained in:
larryruili 2017-08-23 15:09:46 -07:00 committed by Ben McIlwain
parent f9a2415954
commit 97581e519d
12 changed files with 175 additions and 188 deletions

View file

@ -32,7 +32,6 @@ import static google.registry.model.EppResourceUtils.createDomainRepoId;
import static google.registry.model.EppResourceUtils.loadDomainApplication; import static google.registry.model.EppResourceUtils.loadDomainApplication;
import static google.registry.model.ofy.ObjectifyService.ofy; import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.registry.label.ReservedList.matchesAnchorTenantReservation; import static google.registry.model.registry.label.ReservedList.matchesAnchorTenantReservation;
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.netAddsFieldFromYears;
import static google.registry.pricing.PricingEngineProxy.getDomainCreateCost; import static google.registry.pricing.PricingEngineProxy.getDomainCreateCost;
import static google.registry.util.CollectionUtils.isNullOrEmpty; import static google.registry.util.CollectionUtils.isNullOrEmpty;
import static google.registry.util.DateTimeUtils.END_OF_TIME; import static google.registry.util.DateTimeUtils.END_OF_TIME;
@ -87,7 +86,7 @@ import google.registry.model.poll.PollMessage;
import google.registry.model.registry.Registry; import google.registry.model.registry.Registry;
import google.registry.model.registry.label.ReservationType; import google.registry.model.registry.label.ReservationType;
import google.registry.model.reporting.DomainTransactionRecord; import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount; import google.registry.model.reporting.DomainTransactionRecord.TransactionReportField;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import google.registry.tmch.LordnTask; import google.registry.tmch.LordnTask;
@ -241,11 +240,13 @@ public class DomainAllocateFlow implements TransactionalFlow {
.setPeriod(period) .setPeriod(period)
.setModificationTime(now) .setModificationTime(now)
.setParent(Key.create(DomainResource.class, repoId)) .setParent(Key.create(DomainResource.class, repoId))
.setDomainTransactionRecord( .setDomainTransactionRecords(
ImmutableSet.of(
DomainTransactionRecord.create( DomainTransactionRecord.create(
tld, tld,
now.plus(addGracePeriod), now.plus(addGracePeriod),
TransactionFieldAmount.create(netAddsFieldFromYears(period.getValue()), 1))) TransactionReportField.netAddsFieldFromYears(period.getValue()),
1)))
.build(); .build();
} }

View file

@ -42,7 +42,6 @@ import static google.registry.model.eppcommon.StatusValue.SERVER_UPDATE_PROHIBIT
import static google.registry.model.index.DomainApplicationIndex.loadActiveApplicationsByDomainName; import static google.registry.model.index.DomainApplicationIndex.loadActiveApplicationsByDomainName;
import static google.registry.model.ofy.ObjectifyService.ofy; import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.registry.label.ReservedList.matchesAnchorTenantReservation; import static google.registry.model.registry.label.ReservedList.matchesAnchorTenantReservation;
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.netAddsFieldFromYears;
import static google.registry.util.DateTimeUtils.END_OF_TIME; import static google.registry.util.DateTimeUtils.END_OF_TIME;
import static google.registry.util.DateTimeUtils.leapSafeAddYears; import static google.registry.util.DateTimeUtils.leapSafeAddYears;
@ -100,7 +99,7 @@ import google.registry.model.poll.PollMessage.Autorenew;
import google.registry.model.registry.Registry; import google.registry.model.registry.Registry;
import google.registry.model.registry.Registry.TldState; import google.registry.model.registry.Registry.TldState;
import google.registry.model.reporting.DomainTransactionRecord; import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount; import google.registry.model.reporting.DomainTransactionRecord.TransactionReportField;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import google.registry.tmch.LordnTask; import google.registry.tmch.LordnTask;
@ -372,11 +371,13 @@ public class DomainCreateFlow implements TransactionalFlow {
.setPeriod(period) .setPeriod(period)
.setModificationTime(now) .setModificationTime(now)
.setParent(Key.create(DomainResource.class, repoId)) .setParent(Key.create(DomainResource.class, repoId))
.setDomainTransactionRecord( .setDomainTransactionRecords(
ImmutableSet.of(
DomainTransactionRecord.create( DomainTransactionRecord.create(
tld, tld,
now.plus(addGracePeriod), now.plus(addGracePeriod),
TransactionFieldAmount.create(netAddsFieldFromYears(period.getValue()), 1))) TransactionReportField.netAddsFieldFromYears(period.getValue()),
1)))
.build(); .build();
} }

View file

@ -28,7 +28,6 @@ import static google.registry.flows.domain.DomainFlowUtils.validateFeeChallenge;
import static google.registry.flows.domain.DomainFlowUtils.validateRegistrationPeriod; import static google.registry.flows.domain.DomainFlowUtils.validateRegistrationPeriod;
import static google.registry.flows.domain.DomainFlowUtils.verifyUnitIsYears; import static google.registry.flows.domain.DomainFlowUtils.verifyUnitIsYears;
import static google.registry.model.ofy.ObjectifyService.ofy; import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.netRenewsFieldFromYears;
import static google.registry.util.DateTimeUtils.leapSafeAddYears; import static google.registry.util.DateTimeUtils.leapSafeAddYears;
import com.google.common.base.Optional; import com.google.common.base.Optional;
@ -72,7 +71,7 @@ import google.registry.model.eppoutput.EppResponse;
import google.registry.model.poll.PollMessage; import google.registry.model.poll.PollMessage;
import google.registry.model.registry.Registry; import google.registry.model.registry.Registry;
import google.registry.model.reporting.DomainTransactionRecord; import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount; import google.registry.model.reporting.DomainTransactionRecord.TransactionReportField;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import javax.inject.Inject; import javax.inject.Inject;
@ -220,11 +219,13 @@ public final class DomainRenewFlow implements TransactionalFlow {
.setPeriod(period) .setPeriod(period)
.setModificationTime(now) .setModificationTime(now)
.setParent(Key.create(existingDomain)) .setParent(Key.create(existingDomain))
.setDomainTransactionRecord( .setDomainTransactionRecords(
ImmutableSet.of(
DomainTransactionRecord.create( DomainTransactionRecord.create(
existingDomain.getTld(), existingDomain.getTld(),
now.plus(renewGracePeriod), now.plus(renewGracePeriod),
TransactionFieldAmount.create(netRenewsFieldFromYears(period.getValue()), 1))) TransactionReportField.netRenewsFieldFromYears(period.getValue()),
1)))
.build(); .build();
} }

View file

@ -26,7 +26,6 @@ import static google.registry.flows.domain.DomainFlowUtils.validateFeeChallenge;
import static google.registry.flows.domain.DomainFlowUtils.verifyNotReserved; import static google.registry.flows.domain.DomainFlowUtils.verifyNotReserved;
import static google.registry.flows.domain.DomainFlowUtils.verifyPremiumNameIsNotBlocked; import static google.registry.flows.domain.DomainFlowUtils.verifyPremiumNameIsNotBlocked;
import static google.registry.model.ofy.ObjectifyService.ofy; import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.RESTORED_DOMAINS;
import static google.registry.util.DateTimeUtils.END_OF_TIME; import static google.registry.util.DateTimeUtils.END_OF_TIME;
import com.google.common.base.Optional; import com.google.common.base.Optional;
@ -65,7 +64,7 @@ import google.registry.model.eppoutput.EppResponse;
import google.registry.model.poll.PollMessage; import google.registry.model.poll.PollMessage;
import google.registry.model.registry.Registry; import google.registry.model.registry.Registry;
import google.registry.model.reporting.DomainTransactionRecord; import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount; import google.registry.model.reporting.DomainTransactionRecord.TransactionReportField;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import javax.inject.Inject; import javax.inject.Inject;
@ -177,9 +176,10 @@ public final class DomainRestoreRequestFlow implements TransactionalFlow {
.setType(HistoryEntry.Type.DOMAIN_RESTORE) .setType(HistoryEntry.Type.DOMAIN_RESTORE)
.setModificationTime(now) .setModificationTime(now)
.setParent(Key.create(existingDomain)) .setParent(Key.create(existingDomain))
.setDomainTransactionRecord( .setDomainTransactionRecords(
ImmutableSet.of(
DomainTransactionRecord.create( DomainTransactionRecord.create(
existingDomain.getTld(), now, TransactionFieldAmount.create(RESTORED_DOMAINS, 1))) existingDomain.getTld(), now, TransactionReportField.RESTORED_DOMAINS, 1)))
.build(); .build();
} }

View file

@ -17,11 +17,9 @@ package google.registry.model.reporting;
import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
import static google.registry.util.PreconditionsUtils.checkArgumentNotNull; import static google.registry.util.PreconditionsUtils.checkArgumentNotNull;
import com.google.common.collect.ImmutableSet;
import com.googlecode.objectify.annotation.Embed; import com.googlecode.objectify.annotation.Embed;
import google.registry.model.Buildable; import google.registry.model.Buildable;
import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObject;
import java.util.Set;
import org.joda.time.DateTime; import org.joda.time.DateTime;
/** /**
@ -37,6 +35,9 @@ import org.joda.time.DateTime;
@Embed @Embed
public class DomainTransactionRecord extends ImmutableObject implements Buildable { public class DomainTransactionRecord extends ImmutableObject implements Buildable {
/** The TLD this record operates on. */
String tld;
/** /**
* The time this Transaction takes effect (counting grace periods and other nuances). * The time this Transaction takes effect (counting grace periods and other nuances).
* *
@ -50,24 +51,6 @@ public class DomainTransactionRecord extends ImmutableObject implements Buildabl
*/ */
DateTime reportingTime; DateTime reportingTime;
/** The TLD this record operates on. */
String tld;
/** The fields affected by this transaction, and the amounts they're affected by. */
Set<TransactionFieldAmount> transactionFieldAmounts;
/** A tuple that encapsulates an amount to add to a specified field in the report. */
@Embed
public static class TransactionFieldAmount extends ImmutableObject {
public static TransactionFieldAmount create(
TransactionReportField reportField, int reportAmount) {
TransactionFieldAmount instance = new TransactionFieldAmount();
instance.reportField = reportField;
instance.reportAmount = reportAmount;
return instance;
}
/** The transaction report field we add reportAmount to for this registrar. */ /** The transaction report field we add reportAmount to for this registrar. */
TransactionReportField reportField; TransactionReportField reportField;
@ -83,7 +66,7 @@ public class DomainTransactionRecord extends ImmutableObject implements Buildabl
* original SUCCESSFUL transfer counters. Finally, if we explicitly allow a transfer, the report * original SUCCESSFUL transfer counters. Finally, if we explicitly allow a transfer, the report
* amount is 0, as we've already counted the transfer in the original request. * amount is 0, as we've already counted the transfer in the original request.
*/ */
int reportAmount; Integer reportAmount;
/** /**
* The field added to by reportAmount within the transaction report. * The field added to by reportAmount within the transaction report.
@ -142,7 +125,6 @@ public class DomainTransactionRecord extends ImmutableObject implements Buildabl
} }
} }
} }
}
public DateTime getReportingTime() { public DateTime getReportingTime() {
return reportingTime; return reportingTime;
@ -152,20 +134,26 @@ public class DomainTransactionRecord extends ImmutableObject implements Buildabl
return tld; return tld;
} }
public Set<TransactionFieldAmount> getTransactionFieldAmounts() { public TransactionReportField getReportField() {
return transactionFieldAmounts; return reportField;
}
public int getReportAmount() {
return reportAmount;
} }
/** An alternative construction method when the builder is not necessary. */ /** An alternative construction method when the builder is not necessary. */
public static DomainTransactionRecord create( public static DomainTransactionRecord create(
String tld, String tld,
DateTime reportingTime, DateTime reportingTime,
TransactionFieldAmount... transactionFieldAmounts) { TransactionReportField transactionReportField,
int reportAmount) {
return new DomainTransactionRecord.Builder() return new DomainTransactionRecord.Builder()
.setTld(tld) .setTld(tld)
// We report this event when the grace period ends, if applicable // We report this event when the grace period ends, if applicable
.setReportingTime(reportingTime) .setReportingTime(reportingTime)
.setTransactionFieldAmounts(ImmutableSet.copyOf(transactionFieldAmounts)) .setReportField(transactionReportField)
.setReportAmount(reportAmount)
.build(); .build();
} }
@ -184,30 +172,37 @@ public class DomainTransactionRecord extends ImmutableObject implements Buildabl
checkArgumentNotNull(instance, "DomainTransactionRecord instance must not be null"); checkArgumentNotNull(instance, "DomainTransactionRecord instance must not be null");
} }
public Builder setReportingTime(DateTime reportingTime) {
checkArgumentNotNull(reportingTime, "reportingTime must not be mull");
getInstance().reportingTime = reportingTime;
return this;
}
public Builder setTld(String tld) { public Builder setTld(String tld) {
checkArgumentNotNull(tld, "tld must not be null"); checkArgumentNotNull(tld, "tld must not be null");
getInstance().tld = tld; getInstance().tld = tld;
return this; return this;
} }
public Builder setTransactionFieldAmounts( public Builder setReportingTime(DateTime reportingTime) {
ImmutableSet<TransactionFieldAmount> transactionFieldAmounts) { checkArgumentNotNull(reportingTime, "reportingTime must not be mull");
getInstance().transactionFieldAmounts = transactionFieldAmounts; getInstance().reportingTime = reportingTime;
return this;
}
public Builder setReportField(TransactionReportField reportField) {
checkArgumentNotNull(reportField, "reportField must not be null");
getInstance().reportField = reportField;
return this;
}
public Builder setReportAmount(Integer reportAmount) {
checkArgumentNotNull(reportAmount, "reportAmount must not be null");
getInstance().reportAmount = reportAmount;
return this; return this;
} }
@Override @Override
public DomainTransactionRecord build() { public DomainTransactionRecord build() {
checkArgumentNotNull(getInstance().reportingTime, "reportingTime must not be null"); checkArgumentNotNull(getInstance().reportingTime, "reportingTime must be set");
checkArgumentNotNull(getInstance().tld, "tld must not be null"); checkArgumentNotNull(getInstance().tld, "tld must be set");
checkArgumentNotNull( checkArgumentNotNull(
getInstance().transactionFieldAmounts, "transactionFieldAmounts must not be null"); getInstance().reportField, "reportField must be set");
checkArgumentNotNull(getInstance().reportAmount, "reportAmount must be set");
return super.build(); return super.build();
} }
} }

View file

@ -14,6 +14,9 @@
package google.registry.model.reporting; package google.registry.model.reporting;
import static google.registry.util.CollectionUtils.nullToEmptyImmutableCopy;
import com.google.common.collect.ImmutableSet;
import com.googlecode.objectify.Key; import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity; import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id; import com.googlecode.objectify.annotation.Id;
@ -27,7 +30,7 @@ import google.registry.model.ImmutableObject;
import google.registry.model.annotations.ReportedOn; import google.registry.model.annotations.ReportedOn;
import google.registry.model.domain.Period; import google.registry.model.domain.Period;
import google.registry.model.eppcommon.Trid; import google.registry.model.eppcommon.Trid;
import javax.annotation.Nullable; import java.util.Set;
import org.joda.time.DateTime; import org.joda.time.DateTime;
/** A record of an EPP command that mutated a resource. */ /** A record of an EPP command that mutated a resource. */
@ -128,12 +131,11 @@ public class HistoryEntry extends ImmutableObject implements Buildable {
/** /**
* Logging field for transaction reporting. * Logging field for transaction reporting.
* *
* <p>This will be null for any HistoryEntry generated before this field was added. This will * <p>This will be empty for any HistoryEntry generated before this field was added. This will
* also be null if the HistoryEntry refers to an EPP mutation that does not affect domain * also be empty if the HistoryEntry refers to an EPP mutation that does not affect domain
* transaction counts (such as contact or host mutations). * transaction counts (such as contact or host mutations).
*/ */
@Nullable Set<DomainTransactionRecord> domainTransactionRecords;
DomainTransactionRecord domainTransactionRecord;
public Key<? extends EppResource> getParent() { public Key<? extends EppResource> getParent() {
return parent; return parent;
@ -179,9 +181,8 @@ public class HistoryEntry extends ImmutableObject implements Buildable {
return requestedByRegistrar; return requestedByRegistrar;
} }
@Nullable public ImmutableSet<DomainTransactionRecord> getDomainTransactionRecords() {
public DomainTransactionRecord getDomainTransactionRecord() { return nullToEmptyImmutableCopy(domainTransactionRecords);
return domainTransactionRecord;
} }
@Override @Override
@ -257,8 +258,9 @@ public class HistoryEntry extends ImmutableObject implements Buildable {
return this; return this;
} }
public Builder setDomainTransactionRecord(DomainTransactionRecord domainTransactionRecord) { public Builder setDomainTransactionRecords(
getInstance().domainTransactionRecord = domainTransactionRecord; ImmutableSet<DomainTransactionRecord> domainTransactionRecords) {
getInstance().domainTransactionRecords = domainTransactionRecords;
return this; return this;
} }
} }

View file

@ -18,7 +18,6 @@ import static com.google.common.io.BaseEncoding.base16;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static google.registry.model.EppResourceUtils.loadDomainApplication; import static google.registry.model.EppResourceUtils.loadDomainApplication;
import static google.registry.model.ofy.ObjectifyService.ofy; import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.netAddsFieldFromYears;
import static google.registry.testing.DatastoreHelper.assertBillingEvents; import static google.registry.testing.DatastoreHelper.assertBillingEvents;
import static google.registry.testing.DatastoreHelper.createTld; import static google.registry.testing.DatastoreHelper.createTld;
import static google.registry.testing.DatastoreHelper.getOnlyHistoryEntryOfType; import static google.registry.testing.DatastoreHelper.getOnlyHistoryEntryOfType;
@ -73,7 +72,7 @@ import google.registry.model.poll.PollMessage;
import google.registry.model.registry.Registry; import google.registry.model.registry.Registry;
import google.registry.model.registry.Registry.TldState; import google.registry.model.registry.Registry.TldState;
import google.registry.model.reporting.DomainTransactionRecord; import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount; import google.registry.model.reporting.DomainTransactionRecord.TransactionReportField;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
import google.registry.model.smd.EncodedSignedMark; import google.registry.model.smd.EncodedSignedMark;
import google.registry.testing.TaskQueueHelper.TaskMatcher; import google.registry.testing.TaskQueueHelper.TaskMatcher;
@ -675,12 +674,11 @@ public class DomainAllocateFlowTest
DomainResource domain = reloadResourceByForeignKey(); DomainResource domain = reloadResourceByForeignKey();
HistoryEntry historyEntry = HistoryEntry historyEntry =
getOnlyHistoryEntryOfType(domain, HistoryEntry.Type.DOMAIN_ALLOCATE); getOnlyHistoryEntryOfType(domain, HistoryEntry.Type.DOMAIN_ALLOCATE);
DomainTransactionRecord transactionRecord = historyEntry.getDomainTransactionRecord(); assertThat(historyEntry.getDomainTransactionRecords()).containsExactly(
DomainTransactionRecord.create(
assertThat(transactionRecord.getTld()).isEqualTo("tld"); "tld",
assertThat(transactionRecord.getReportingTime()) historyEntry.getModificationTime().plusMinutes(9),
.isEqualTo(historyEntry.getModificationTime().plusMinutes(9)); TransactionReportField.netAddsFieldFromYears(2),
assertThat(transactionRecord.getTransactionFieldAmounts()) 1));
.containsExactly(TransactionFieldAmount.create(netAddsFieldFromYears(2), 1));
} }
} }

View file

@ -22,7 +22,6 @@ import static google.registry.model.eppcommon.StatusValue.OK;
import static google.registry.model.eppcommon.StatusValue.SERVER_TRANSFER_PROHIBITED; import static google.registry.model.eppcommon.StatusValue.SERVER_TRANSFER_PROHIBITED;
import static google.registry.model.eppcommon.StatusValue.SERVER_UPDATE_PROHIBITED; import static google.registry.model.eppcommon.StatusValue.SERVER_UPDATE_PROHIBITED;
import static google.registry.model.ofy.ObjectifyService.ofy; import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.netAddsFieldFromYears;
import static google.registry.pricing.PricingEngineProxy.isDomainPremium; import static google.registry.pricing.PricingEngineProxy.isDomainPremium;
import static google.registry.testing.DatastoreHelper.assertBillingEvents; import static google.registry.testing.DatastoreHelper.assertBillingEvents;
import static google.registry.testing.DatastoreHelper.assertPollMessagesForResource; import static google.registry.testing.DatastoreHelper.assertPollMessagesForResource;
@ -129,7 +128,7 @@ import google.registry.model.poll.PollMessage;
import google.registry.model.registry.Registry; import google.registry.model.registry.Registry;
import google.registry.model.registry.Registry.TldState; import google.registry.model.registry.Registry.TldState;
import google.registry.model.reporting.DomainTransactionRecord; import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount; import google.registry.model.reporting.DomainTransactionRecord.TransactionReportField;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
import google.registry.monitoring.whitebox.EppMetric; import google.registry.monitoring.whitebox.EppMetric;
import google.registry.testing.DatastoreHelper; import google.registry.testing.DatastoreHelper;
@ -2003,14 +2002,12 @@ public class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow,
runFlow(); runFlow();
DomainResource domain = reloadResourceByForeignKey(); DomainResource domain = reloadResourceByForeignKey();
HistoryEntry historyEntry = getHistoryEntries(domain).get(0); HistoryEntry historyEntry = getHistoryEntries(domain).get(0);
DomainTransactionRecord transactionRecord = assertThat(historyEntry.getDomainTransactionRecords()).containsExactly(
historyEntry.getDomainTransactionRecord(); DomainTransactionRecord.create(
"tld",
assertThat(transactionRecord.getTld()).isEqualTo("tld"); historyEntry.getModificationTime().plusMinutes(9),
assertThat(transactionRecord.getReportingTime()) TransactionReportField.netAddsFieldFromYears(2),
.isEqualTo(historyEntry.getModificationTime().plusMinutes(9)); 1));
assertThat(transactionRecord.getTransactionFieldAmounts())
.containsExactly(TransactionFieldAmount.create(netAddsFieldFromYears(2), 1));
} }
@Test @Test

View file

@ -17,7 +17,6 @@ package google.registry.flows.domain;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static google.registry.flows.domain.DomainTransferFlowTestCase.persistWithPendingTransfer; import static google.registry.flows.domain.DomainTransferFlowTestCase.persistWithPendingTransfer;
import static google.registry.model.ofy.ObjectifyService.ofy; import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.netRenewsFieldFromYears;
import static google.registry.testing.DatastoreHelper.assertBillingEvents; import static google.registry.testing.DatastoreHelper.assertBillingEvents;
import static google.registry.testing.DatastoreHelper.createTld; import static google.registry.testing.DatastoreHelper.createTld;
import static google.registry.testing.DatastoreHelper.getOnlyHistoryEntryOfType; import static google.registry.testing.DatastoreHelper.getOnlyHistoryEntryOfType;
@ -60,7 +59,7 @@ import google.registry.model.eppcommon.StatusValue;
import google.registry.model.poll.PollMessage; import google.registry.model.poll.PollMessage;
import google.registry.model.registry.Registry; import google.registry.model.registry.Registry;
import google.registry.model.reporting.DomainTransactionRecord; import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount; import google.registry.model.reporting.DomainTransactionRecord.TransactionReportField;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
import java.util.Map; import java.util.Map;
import org.joda.money.Money; import org.joda.money.Money;
@ -677,12 +676,11 @@ public class DomainRenewFlowTest extends ResourceFlowTestCase<DomainRenewFlow, D
DomainResource domain = reloadResourceByForeignKey(); DomainResource domain = reloadResourceByForeignKey();
HistoryEntry historyEntry = HistoryEntry historyEntry =
getOnlyHistoryEntryOfType(domain, HistoryEntry.Type.DOMAIN_RENEW); getOnlyHistoryEntryOfType(domain, HistoryEntry.Type.DOMAIN_RENEW);
DomainTransactionRecord transactionRecord = historyEntry.getDomainTransactionRecord(); assertThat(historyEntry.getDomainTransactionRecords()).containsExactly(
DomainTransactionRecord.create(
assertThat(transactionRecord.getTld()).isEqualTo("tld"); "tld",
assertThat(transactionRecord.getReportingTime()) historyEntry.getModificationTime().plusMinutes(9),
.isEqualTo(historyEntry.getModificationTime().plusMinutes(9)); TransactionReportField.netRenewsFieldFromYears(5),
assertThat(transactionRecord.getTransactionFieldAmounts()) 1));
.containsExactly(TransactionFieldAmount.create(netRenewsFieldFromYears(5), 1));
} }
} }

View file

@ -16,7 +16,6 @@ package google.registry.flows.domain;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static google.registry.model.ofy.ObjectifyService.ofy; import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.RESTORED_DOMAINS;
import static google.registry.testing.DatastoreHelper.assertBillingEvents; import static google.registry.testing.DatastoreHelper.assertBillingEvents;
import static google.registry.testing.DatastoreHelper.createTld; import static google.registry.testing.DatastoreHelper.createTld;
import static google.registry.testing.DatastoreHelper.getOnlyHistoryEntryOfType; import static google.registry.testing.DatastoreHelper.getOnlyHistoryEntryOfType;
@ -62,7 +61,7 @@ import google.registry.model.eppcommon.StatusValue;
import google.registry.model.poll.PollMessage; import google.registry.model.poll.PollMessage;
import google.registry.model.registry.Registry; import google.registry.model.registry.Registry;
import google.registry.model.reporting.DomainTransactionRecord; import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount; import google.registry.model.reporting.DomainTransactionRecord.TransactionReportField;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
import java.util.Map; import java.util.Map;
import org.joda.money.Money; import org.joda.money.Money;
@ -579,13 +578,12 @@ public class DomainRestoreRequestFlowTest extends
DomainResource domain = reloadResourceByForeignKey(); DomainResource domain = reloadResourceByForeignKey();
HistoryEntry historyEntryDomainRestore = HistoryEntry historyEntryDomainRestore =
getOnlyHistoryEntryOfType(domain, HistoryEntry.Type.DOMAIN_RESTORE); getOnlyHistoryEntryOfType(domain, HistoryEntry.Type.DOMAIN_RESTORE);
DomainTransactionRecord transactionRecord = assertThat(historyEntryDomainRestore.getDomainTransactionRecords())
historyEntryDomainRestore.getDomainTransactionRecord(); .containsExactly(
DomainTransactionRecord.create(
assertThat(transactionRecord.getTld()).isEqualTo("tld"); "tld",
assertThat(transactionRecord.getReportingTime()) historyEntryDomainRestore.getModificationTime(),
.isEqualTo(historyEntryDomainRestore.getModificationTime()); TransactionReportField.RESTORED_DOMAINS,
assertThat(transactionRecord.getTransactionFieldAmounts()) 1));
.containsExactly(TransactionFieldAmount.create(RESTORED_DOMAINS, 1));
} }
} }

View file

@ -16,7 +16,6 @@ package google.registry.model.reporting;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static google.registry.model.ofy.ObjectifyService.ofy; import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.NET_ADDS_1_YR;
import static google.registry.testing.DatastoreHelper.createTld; import static google.registry.testing.DatastoreHelper.createTld;
import static google.registry.testing.DatastoreHelper.newDomainResource; import static google.registry.testing.DatastoreHelper.newDomainResource;
import static google.registry.testing.DatastoreHelper.persistResource; import static google.registry.testing.DatastoreHelper.persistResource;
@ -26,7 +25,7 @@ import com.google.common.collect.ImmutableSet;
import google.registry.model.EntityTestCase; import google.registry.model.EntityTestCase;
import google.registry.model.domain.Period; import google.registry.model.domain.Period;
import google.registry.model.eppcommon.Trid; import google.registry.model.eppcommon.Trid;
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount; import google.registry.model.reporting.DomainTransactionRecord.TransactionReportField;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -42,8 +41,8 @@ public class HistoryEntryTest extends EntityTestCase {
new DomainTransactionRecord.Builder() new DomainTransactionRecord.Builder()
.setTld("foobar") .setTld("foobar")
.setReportingTime(clock.nowUtc()) .setReportingTime(clock.nowUtc())
.setTransactionFieldAmounts( .setReportField(TransactionReportField.NET_ADDS_1_YR)
ImmutableSet.of(TransactionFieldAmount.create(NET_ADDS_1_YR, 1))) .setReportAmount(1)
.build(); .build();
// Set up a new persisted HistoryEntry entity. // Set up a new persisted HistoryEntry entity.
historyEntry = historyEntry =
@ -59,7 +58,7 @@ public class HistoryEntryTest extends EntityTestCase {
.setBySuperuser(false) .setBySuperuser(false)
.setReason("reason") .setReason("reason")
.setRequestedByRegistrar(false) .setRequestedByRegistrar(false)
.setDomainTransactionRecord(transactionRecord) .setDomainTransactionRecords(ImmutableSet.of(transactionRecord))
.build(); .build();
persistResource(historyEntry); persistResource(historyEntry);
} }

View file

@ -782,15 +782,12 @@ class google.registry.model.registry.label.ReservedList$ReservedListEntry {
java.lang.String comment; java.lang.String comment;
} }
class google.registry.model.reporting.DomainTransactionRecord { class google.registry.model.reporting.DomainTransactionRecord {
google.registry.model.reporting.DomainTransactionRecord$TransactionReportField reportField;
int reportAmount;
java.lang.String tld; java.lang.String tld;
java.util.Set<google.registry.model.reporting.DomainTransactionRecord$TransactionFieldAmount> transactionFieldAmounts;
org.joda.time.DateTime reportingTime; org.joda.time.DateTime reportingTime;
} }
class google.registry.model.reporting.DomainTransactionRecord$TransactionFieldAmount { enum google.registry.model.reporting.DomainTransactionRecord$TransactionReportField {
google.registry.model.reporting.DomainTransactionRecord$TransactionFieldAmount$TransactionReportField reportField;
int reportAmount;
}
enum google.registry.model.reporting.DomainTransactionRecord$TransactionFieldAmount$TransactionReportField {
DELETED_DOMAINS_GRACE; DELETED_DOMAINS_GRACE;
DELETED_DOMAINS_NOGRACE; DELETED_DOMAINS_NOGRACE;
NET_ADDS_10_YR; NET_ADDS_10_YR;
@ -826,12 +823,12 @@ class google.registry.model.reporting.HistoryEntry {
byte[] xmlBytes; byte[] xmlBytes;
google.registry.model.domain.Period period; google.registry.model.domain.Period period;
google.registry.model.eppcommon.Trid trid; google.registry.model.eppcommon.Trid trid;
google.registry.model.reporting.DomainTransactionRecord domainTransactionRecord;
google.registry.model.reporting.HistoryEntry$Type type; google.registry.model.reporting.HistoryEntry$Type type;
java.lang.Boolean requestedByRegistrar; java.lang.Boolean requestedByRegistrar;
java.lang.String clientId; java.lang.String clientId;
java.lang.String otherClientId; java.lang.String otherClientId;
java.lang.String reason; java.lang.String reason;
java.util.Set<google.registry.model.reporting.DomainTransactionRecord> domainTransactionRecords;
org.joda.time.DateTime modificationTime; org.joda.time.DateTime modificationTime;
} }
enum google.registry.model.reporting.HistoryEntry$Type { enum google.registry.model.reporting.HistoryEntry$Type {