Record transaction for domain adds, renews and allocates

This is the second of many cls adding explicit logging in all our domain
mutation flows to facilitate transaction reporting.

Adds and renews each result in a +1 counter for the NET_ADDS/RENEWS_#_YR field,
which I've added simple (# of years, add or renew) -> Enum functions to get.
Allocates are just a special case of adds, and are counted in a similar manner.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=165963249
This commit is contained in:
larryruili 2017-08-21 12:57:01 -07:00 committed by Ben McIlwain
parent cb854f1b8b
commit c40dc67c5b
8 changed files with 170 additions and 24 deletions

View file

@ -32,6 +32,7 @@ import static google.registry.model.EppResourceUtils.createDomainRepoId;
import static google.registry.model.EppResourceUtils.loadDomainApplication;
import static google.registry.model.ofy.ObjectifyService.ofy;
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.util.CollectionUtils.isNullOrEmpty;
import static google.registry.util.DateTimeUtils.END_OF_TIME;
@ -85,12 +86,15 @@ import google.registry.model.poll.PendingActionNotificationResponse.DomainPendin
import google.registry.model.poll.PollMessage;
import google.registry.model.registry.Registry;
import google.registry.model.registry.label.ReservationType;
import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount;
import google.registry.model.reporting.HistoryEntry;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import google.registry.tmch.LordnTask;
import java.util.Set;
import javax.inject.Inject;
import org.joda.time.DateTime;
import org.joda.time.Duration;
/**
* An EPP flow that allocates a new domain resource from a domain application.
@ -156,7 +160,8 @@ public class DomainAllocateFlow implements TransactionalFlow {
loadAndValidateApplication(allocateCreate.getApplicationRoid(), now);
String repoId = createDomainRepoId(ObjectifyService.allocateId(), registry.getTldStr());
ImmutableSet.Builder<ImmutableObject> entitiesToSave = new ImmutableSet.Builder<>();
HistoryEntry historyEntry = buildHistoryEntry(repoId, period, now);
HistoryEntry historyEntry = buildHistoryEntry(
repoId, period, now, registry.getAddGracePeriodLength(), registry.getTldStr());
entitiesToSave.add(historyEntry);
ImmutableSet<? extends ImmutableObject> billsAndPolls = createBillingEventsAndPollMessages(
domainName, application, historyEntry, isSunrushAddGracePeriod, registry, now, years);
@ -229,12 +234,18 @@ public class DomainAllocateFlow implements TransactionalFlow {
return application;
}
private HistoryEntry buildHistoryEntry(String repoId, Period period, DateTime now) {
private HistoryEntry buildHistoryEntry(
String repoId, Period period, DateTime now, Duration addGracePeriod, String tld) {
return historyBuilder
.setType(HistoryEntry.Type.DOMAIN_ALLOCATE)
.setPeriod(period)
.setModificationTime(now)
.setParent(Key.create(DomainResource.class, repoId))
.setDomainTransactionRecord(
DomainTransactionRecord.create(
tld,
now.plus(addGracePeriod),
TransactionFieldAmount.create(netAddsFieldFromYears(period.getValue()), 1)))
.build();
}

View file

@ -42,6 +42,7 @@ import static google.registry.model.eppcommon.StatusValue.SERVER_UPDATE_PROHIBIT
import static google.registry.model.index.DomainApplicationIndex.loadActiveApplicationsByDomainName;
import static google.registry.model.ofy.ObjectifyService.ofy;
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.leapSafeAddYears;
@ -98,11 +99,14 @@ import google.registry.model.poll.PollMessage;
import google.registry.model.poll.PollMessage.Autorenew;
import google.registry.model.registry.Registry;
import google.registry.model.registry.Registry.TldState;
import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount;
import google.registry.model.reporting.HistoryEntry;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import google.registry.tmch.LordnTask;
import javax.inject.Inject;
import org.joda.time.DateTime;
import org.joda.time.Duration;
/**
* An EPP flow that creates a new domain resource.
@ -258,7 +262,8 @@ public class DomainCreateFlow implements TransactionalFlow {
validateSecDnsExtension(eppInput.getSingleExtension(SecDnsCreateExtension.class));
String repoId = createDomainRepoId(ObjectifyService.allocateId(), registry.getTldStr());
DateTime registrationExpirationTime = leapSafeAddYears(now, years);
HistoryEntry historyEntry = buildHistoryEntry(repoId, period, now);
HistoryEntry historyEntry = buildHistoryEntry(
repoId, period, now, registry.getAddGracePeriodLength(), registry.getTldStr());
// Bill for the create.
BillingEvent.OneTime createBillingEvent =
createOneTimeBillingEvent(
@ -360,12 +365,18 @@ public class DomainCreateFlow implements TransactionalFlow {
}
}
private HistoryEntry buildHistoryEntry(String repoId, Period period, DateTime now) {
private HistoryEntry buildHistoryEntry(
String repoId, Period period, DateTime now, Duration addGracePeriod, String tld) {
return historyBuilder
.setType(HistoryEntry.Type.DOMAIN_CREATE)
.setPeriod(period)
.setModificationTime(now)
.setParent(Key.create(DomainResource.class, repoId))
.setDomainTransactionRecord(
DomainTransactionRecord.create(
tld,
now.plus(addGracePeriod),
TransactionFieldAmount.create(netAddsFieldFromYears(period.getValue()), 1)))
.build();
}

View file

@ -28,6 +28,7 @@ import static google.registry.flows.domain.DomainFlowUtils.validateFeeChallenge;
import static google.registry.flows.domain.DomainFlowUtils.validateRegistrationPeriod;
import static google.registry.flows.domain.DomainFlowUtils.verifyUnitIsYears;
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 com.google.common.base.Optional;
@ -56,6 +57,7 @@ import google.registry.model.domain.DomainCommand.Renew;
import google.registry.model.domain.DomainRenewData;
import google.registry.model.domain.DomainResource;
import google.registry.model.domain.GracePeriod;
import google.registry.model.domain.Period;
import google.registry.model.domain.fee.BaseFee.FeeType;
import google.registry.model.domain.fee.Fee;
import google.registry.model.domain.fee.FeeRenewCommandExtension;
@ -69,11 +71,14 @@ import google.registry.model.eppinput.ResourceCommand;
import google.registry.model.eppoutput.EppResponse;
import google.registry.model.poll.PollMessage;
import google.registry.model.registry.Registry;
import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount;
import google.registry.model.reporting.HistoryEntry;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import javax.inject.Inject;
import org.joda.money.Money;
import org.joda.time.DateTime;
import org.joda.time.Duration;
/**
* An EPP flow that renews a domain.
@ -150,12 +155,9 @@ public final class DomainRenewFlow implements TransactionalFlow {
.setNow(now)
.setYears(years)
.build());
HistoryEntry historyEntry = historyBuilder
.setType(HistoryEntry.Type.DOMAIN_RENEW)
.setPeriod(command.getPeriod())
.setModificationTime(now)
.setParent(Key.create(existingDomain))
.build();
Registry registry = Registry.get(existingDomain.getTld());
HistoryEntry historyEntry = buildHistoryEntry(
existingDomain, command.getPeriod(), now, registry.getRenewGracePeriodLength());
String tld = existingDomain.getTld();
// Bill for this explicit renew itself.
BillingEvent.OneTime explicitRenewEvent =
@ -211,6 +213,21 @@ public final class DomainRenewFlow implements TransactionalFlow {
.build();
}
private HistoryEntry buildHistoryEntry(
DomainResource existingDomain, Period period, DateTime now, Duration renewGracePeriod) {
return historyBuilder
.setType(HistoryEntry.Type.DOMAIN_RENEW)
.setPeriod(period)
.setModificationTime(now)
.setParent(Key.create(existingDomain))
.setDomainTransactionRecord(
DomainTransactionRecord.create(
existingDomain.getTld(),
now.plus(renewGracePeriod),
TransactionFieldAmount.create(netRenewsFieldFromYears(period.getValue()), 1)))
.build();
}
private void verifyRenewAllowed(
Optional<AuthInfo> authInfo,
DomainResource existingDomain,

View file

@ -173,18 +173,13 @@ public final class DomainRestoreRequestFlow implements TransactionalFlow {
}
private HistoryEntry buildHistoryEntry(DomainResource existingDomain, DateTime now) {
DomainTransactionRecord transactionRecord =
new DomainTransactionRecord.Builder()
.setTld(existingDomain.getTld())
.setReportingTime(now)
.setTransactionFieldAmounts(
ImmutableSet.of(TransactionFieldAmount.create(RESTORED_DOMAINS, 1)))
.build();
return historyBuilder
.setType(HistoryEntry.Type.DOMAIN_RESTORE)
.setModificationTime(now)
.setParent(Key.create(existingDomain))
.setDomainTransactionRecord(transactionRecord)
.setDomainTransactionRecord(
DomainTransactionRecord.create(
existingDomain.getTld(), now, TransactionFieldAmount.create(RESTORED_DOMAINS, 1)))
.build();
}