mirror of
https://github.com/google/nomulus
synced 2026-02-24 13:54:59 +00:00
Compare commits
1 Commits
nomulus-20
...
nomulus-20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
929dccbfe3 |
@@ -76,7 +76,7 @@ import google.registry.model.reporting.HistoryEntry.HistoryEntryId;
|
||||
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
|
||||
import google.registry.model.tld.Tld;
|
||||
import google.registry.model.transfer.DomainTransferData;
|
||||
import google.registry.model.transfer.TransferData.TransferServerApproveEntity;
|
||||
import google.registry.model.transfer.DomainTransferData.TransferServerApproveEntity;
|
||||
import google.registry.model.transfer.TransferResponse.DomainTransferResponse;
|
||||
import google.registry.model.transfer.TransferStatus;
|
||||
import jakarta.inject.Inject;
|
||||
|
||||
@@ -36,8 +36,7 @@ import google.registry.model.poll.PollMessage;
|
||||
import google.registry.model.reporting.HistoryEntry.HistoryEntryId;
|
||||
import google.registry.model.tld.Tld;
|
||||
import google.registry.model.transfer.DomainTransferData;
|
||||
import google.registry.model.transfer.TransferData;
|
||||
import google.registry.model.transfer.TransferData.TransferServerApproveEntity;
|
||||
import google.registry.model.transfer.DomainTransferData.TransferServerApproveEntity;
|
||||
import google.registry.model.transfer.TransferResponse.DomainTransferResponse;
|
||||
import google.registry.model.transfer.TransferStatus;
|
||||
import google.registry.persistence.VKey;
|
||||
@@ -51,7 +50,7 @@ import org.joda.time.DateTime;
|
||||
*/
|
||||
public final class DomainTransferUtils {
|
||||
|
||||
/** Sets up {@link TransferData} for a domain with links to entities for server approval. */
|
||||
/** Sets up {@link DomainTransferData} for a domain with links to entities for server approval. */
|
||||
public static DomainTransferData createPendingTransferData(
|
||||
String domainRepoId,
|
||||
Long historyId,
|
||||
@@ -179,7 +178,7 @@ public final class DomainTransferUtils {
|
||||
/** Create a poll message for the gaining client in a transfer. */
|
||||
public static PollMessage createGainingTransferPollMessage(
|
||||
String targetId,
|
||||
TransferData transferData,
|
||||
DomainTransferData transferData,
|
||||
@Nullable DateTime extendedRegistrationExpirationTime,
|
||||
DateTime now,
|
||||
HistoryEntryId domainHistoryId) {
|
||||
@@ -202,7 +201,7 @@ public final class DomainTransferUtils {
|
||||
/** Create a poll message for the losing client in a transfer. */
|
||||
public static PollMessage createLosingTransferPollMessage(
|
||||
String targetId,
|
||||
TransferData transferData,
|
||||
DomainTransferData transferData,
|
||||
@Nullable DateTime extendedRegistrationExpirationTime,
|
||||
HistoryEntryId domainHistoryId) {
|
||||
return new PollMessage.OneTime.Builder()
|
||||
@@ -216,10 +215,10 @@ public final class DomainTransferUtils {
|
||||
.build();
|
||||
}
|
||||
|
||||
/** Create a {@link DomainTransferResponse} off of the info in a {@link TransferData}. */
|
||||
/** Create a {@link DomainTransferResponse} off of the info in a {@link DomainTransferData}. */
|
||||
static DomainTransferResponse createTransferResponse(
|
||||
String targetId,
|
||||
TransferData transferData,
|
||||
DomainTransferData transferData,
|
||||
@Nullable DateTime extendedRegistrationExpirationTime) {
|
||||
return new DomainTransferResponse.Builder()
|
||||
.setDomainName(targetId)
|
||||
|
||||
@@ -34,7 +34,6 @@ import com.google.common.collect.ImmutableSet;
|
||||
import com.google.gson.annotations.Expose;
|
||||
import google.registry.config.RegistryConfig;
|
||||
import google.registry.model.eppcommon.StatusValue;
|
||||
import google.registry.model.transfer.TransferData;
|
||||
import google.registry.persistence.VKey;
|
||||
import google.registry.util.NonFinalForTesting;
|
||||
import jakarta.persistence.Access;
|
||||
@@ -207,27 +206,6 @@ public abstract class EppResource extends UpdateAutoTimestampEntity implements B
|
||||
/** EppResources that are loaded via foreign keys should implement this marker interface. */
|
||||
public interface ForeignKeyedEppResource {}
|
||||
|
||||
/** An interface for resources that have transfer data. */
|
||||
public interface ResourceWithTransferData<T extends TransferData> {
|
||||
T getTransferData();
|
||||
|
||||
/**
|
||||
* The time that this resource was last transferred.
|
||||
*
|
||||
* <p>Can be null if the resource has never been transferred.
|
||||
*/
|
||||
DateTime getLastTransferTime();
|
||||
}
|
||||
|
||||
/** An interface for builders of resources that have transfer data. */
|
||||
public interface BuilderWithTransferData<
|
||||
T extends TransferData, B extends BuilderWithTransferData<T, B>> {
|
||||
B setTransferData(T transferData);
|
||||
|
||||
/** Set the time when this resource was transferred. */
|
||||
B setLastTransferTime(DateTime lastTransferTime);
|
||||
}
|
||||
|
||||
/** Abstract builder for {@link EppResource} types. */
|
||||
public abstract static class Builder<T extends EppResource, B extends Builder<T, B>>
|
||||
extends GenericBuilder<T, B> {
|
||||
|
||||
@@ -29,7 +29,6 @@ import google.registry.model.poll.PendingActionNotificationResponse.DomainPendin
|
||||
import google.registry.model.poll.PollMessage;
|
||||
import google.registry.model.reporting.HistoryEntry;
|
||||
import google.registry.model.transfer.DomainTransferData;
|
||||
import google.registry.model.transfer.TransferData;
|
||||
import google.registry.model.transfer.TransferResponse;
|
||||
import google.registry.model.transfer.TransferResponse.DomainTransferResponse;
|
||||
import google.registry.model.transfer.TransferStatus;
|
||||
@@ -79,7 +78,7 @@ public final class ResourceTransferUtils {
|
||||
if (!domain.getStatusValues().contains(StatusValue.PENDING_TRANSFER)) {
|
||||
return;
|
||||
}
|
||||
TransferData oldTransferData = domain.getTransferData();
|
||||
DomainTransferData oldTransferData = domain.getTransferData();
|
||||
tm().delete(oldTransferData.getServerApproveEntities());
|
||||
tm().put(
|
||||
new PollMessage.OneTime.Builder()
|
||||
@@ -99,8 +98,8 @@ public final class ResourceTransferUtils {
|
||||
* Turn a domain into a builder with its pending transfer resolved.
|
||||
*
|
||||
* <p>This removes the {@link StatusValue#PENDING_TRANSFER} status, sets the {@link
|
||||
* TransferStatus}, clears all the server-approve fields on the {@link TransferData}, and sets the
|
||||
* expiration time of the last pending transfer to now.
|
||||
* TransferStatus}, clears all the server-approve fields on the {@link DomainTransferData}, and
|
||||
* sets the expiration time of the last pending transfer to now.
|
||||
*/
|
||||
private static Domain.Builder resolvePendingTransfer(
|
||||
Domain domain, TransferStatus transferStatus, DateTime now) {
|
||||
@@ -125,9 +124,9 @@ public final class ResourceTransferUtils {
|
||||
* Resolve a pending transfer by awarding it to the gaining client.
|
||||
*
|
||||
* <p>This removes the {@link StatusValue#PENDING_TRANSFER} status, sets the {@link
|
||||
* TransferStatus}, clears all the server-approve fields on the {@link TransferData}, sets the new
|
||||
* client id, and sets the last transfer time and the expiration time of the last pending transfer
|
||||
* to now.
|
||||
* TransferStatus}, clears all the server-approve fields on the {@link DomainTransferData}, sets
|
||||
* the new client id, and sets the last transfer time and the expiration time of the last pending
|
||||
* transfer to now.
|
||||
*/
|
||||
public static Domain approvePendingTransfer(
|
||||
Domain domain, TransferStatus transferStatus, DateTime now) {
|
||||
@@ -143,9 +142,9 @@ public final class ResourceTransferUtils {
|
||||
* Resolve a pending transfer by denying it.
|
||||
*
|
||||
* <p>This removes the {@link StatusValue#PENDING_TRANSFER} status, sets the {@link
|
||||
* TransferStatus}, clears all the server-approve fields on the {@link TransferData}, sets the
|
||||
* expiration time of the last pending transfer to now, sets the last EPP update time to now, and
|
||||
* sets the last EPP update client id to the given client id.
|
||||
* TransferStatus}, clears all the server-approve fields on the {@link DomainTransferData}, sets
|
||||
* the expiration time of the last pending transfer to now, sets the last EPP update time to now,
|
||||
* and sets the last EPP update client id to the given client id.
|
||||
*/
|
||||
public static Domain denyPendingTransfer(
|
||||
Domain domain, TransferStatus transferStatus, DateTime now, String lastEppUpdateRegistrarId) {
|
||||
|
||||
@@ -26,7 +26,7 @@ import google.registry.model.UnsafeSerializable;
|
||||
import google.registry.model.annotations.IdAllocation;
|
||||
import google.registry.model.domain.DomainHistory;
|
||||
import google.registry.model.reporting.HistoryEntry.HistoryEntryId;
|
||||
import google.registry.model.transfer.TransferData.TransferServerApproveEntity;
|
||||
import google.registry.model.transfer.DomainTransferData.TransferServerApproveEntity;
|
||||
import google.registry.persistence.VKey;
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.EnumType;
|
||||
|
||||
@@ -43,7 +43,6 @@ import com.google.common.collect.Sets;
|
||||
import com.google.gson.annotations.Expose;
|
||||
import google.registry.flows.ResourceFlowUtils;
|
||||
import google.registry.model.EppResource;
|
||||
import google.registry.model.EppResource.ResourceWithTransferData;
|
||||
import google.registry.model.billing.BillingRecurrence;
|
||||
import google.registry.model.domain.launch.LaunchNotice;
|
||||
import google.registry.model.domain.rgp.GracePeriodStatus;
|
||||
@@ -96,8 +95,7 @@ import org.joda.time.Interval;
|
||||
@MappedSuperclass
|
||||
@Embeddable
|
||||
@Access(AccessType.FIELD)
|
||||
public class DomainBase extends EppResource
|
||||
implements ResourceWithTransferData<DomainTransferData> {
|
||||
public class DomainBase extends EppResource {
|
||||
|
||||
/** The max number of years that a domain can be registered for, as set by ICANN policy. */
|
||||
public static final int MAX_REGISTRATION_YEARS = 10;
|
||||
@@ -319,12 +317,10 @@ public class DomainBase extends EppResource
|
||||
return Optional.ofNullable(autorenewEndTime.equals(END_OF_TIME) ? null : autorenewEndTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainTransferData getTransferData() {
|
||||
return Optional.ofNullable(transferData).orElse(DomainTransferData.EMPTY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DateTime getLastTransferTime() {
|
||||
return lastTransferTime;
|
||||
}
|
||||
@@ -605,7 +601,7 @@ public class DomainBase extends EppResource
|
||||
|
||||
/** A builder for constructing {@link Domain}, since it is immutable. */
|
||||
public static class Builder<T extends DomainBase, B extends Builder<T, B>>
|
||||
extends EppResource.Builder<T, B> implements BuilderWithTransferData<DomainTransferData, B> {
|
||||
extends EppResource.Builder<T, B> {
|
||||
|
||||
public Builder() {}
|
||||
|
||||
@@ -783,13 +779,11 @@ public class DomainBase extends EppResource
|
||||
return thisCastToDerived();
|
||||
}
|
||||
|
||||
@Override
|
||||
public B setTransferData(DomainTransferData transferData) {
|
||||
getInstance().transferData = transferData;
|
||||
return thisCastToDerived();
|
||||
}
|
||||
|
||||
@Override
|
||||
public B setLastTransferTime(DateTime lastTransferTime) {
|
||||
getInstance().lastTransferTime = lastTransferTime;
|
||||
return thisCastToDerived();
|
||||
|
||||
@@ -24,7 +24,6 @@ import static google.registry.util.DomainNameUtils.canonicalizeHostname;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import google.registry.model.EppResource;
|
||||
import google.registry.model.domain.Domain;
|
||||
import google.registry.model.transfer.TransferData;
|
||||
import google.registry.persistence.VKey;
|
||||
import google.registry.persistence.converter.InetAddressSetUserType;
|
||||
import jakarta.persistence.Access;
|
||||
@@ -41,8 +40,8 @@ import org.joda.time.DateTime;
|
||||
/**
|
||||
* A persistable Host resource including mutable and non-mutable fields.
|
||||
*
|
||||
* <p>A host's {@link TransferData} is stored on the superordinate domain. Non-subordinate hosts
|
||||
* don't carry a full set of TransferData; all they have is lastTransferTime.
|
||||
* <p>A host's full transfer data is stored on the superordinate domain. Non-subordinate hosts don't
|
||||
* carry a full set of TransferData; all they have is lastTransferTime.
|
||||
*
|
||||
* <p>This class deliberately does not include an {@link jakarta.persistence.Id} so that any
|
||||
* foreign-keyed fields can refer to the proper parent entity's ID, whether we're storing this in
|
||||
|
||||
@@ -32,14 +32,12 @@ import google.registry.model.domain.DomainRenewData;
|
||||
import google.registry.model.eppoutput.EppResponse.ResponseData;
|
||||
import google.registry.model.host.Host;
|
||||
import google.registry.model.host.HostHistory;
|
||||
import google.registry.model.poll.PendingActionNotificationResponse.ContactPendingActionNotificationResponse;
|
||||
import google.registry.model.poll.PendingActionNotificationResponse.DomainPendingActionNotificationResponse;
|
||||
import google.registry.model.poll.PendingActionNotificationResponse.HostPendingActionNotificationResponse;
|
||||
import google.registry.model.reporting.HistoryEntry;
|
||||
import google.registry.model.reporting.HistoryEntry.HistoryEntryId;
|
||||
import google.registry.model.transfer.TransferData.TransferServerApproveEntity;
|
||||
import google.registry.model.transfer.DomainTransferData.TransferServerApproveEntity;
|
||||
import google.registry.model.transfer.TransferResponse;
|
||||
import google.registry.model.transfer.TransferResponse.ContactTransferResponse;
|
||||
import google.registry.model.transfer.TransferResponse.DomainTransferResponse;
|
||||
import google.registry.persistence.VKey;
|
||||
import google.registry.persistence.WithVKey;
|
||||
@@ -406,12 +404,8 @@ public abstract class PollMessage extends ImmutableObject
|
||||
if (pendingActionNotificationResponse != null) {
|
||||
// Promote the pending action notification response to its specialized type.
|
||||
if (contactId != null) {
|
||||
pendingActionNotificationResponse =
|
||||
ContactPendingActionNotificationResponse.create(
|
||||
pendingActionNotificationResponse.nameOrId.value,
|
||||
pendingActionNotificationResponse.getActionResult(),
|
||||
pendingActionNotificationResponse.getTrid(),
|
||||
pendingActionNotificationResponse.processedDate);
|
||||
// Contacts are no longer supported
|
||||
pendingActionNotificationResponse = null;
|
||||
} else if (domainName != null) {
|
||||
pendingActionNotificationResponse =
|
||||
DomainPendingActionNotificationResponse.create(
|
||||
@@ -432,16 +426,8 @@ public abstract class PollMessage extends ImmutableObject
|
||||
// The transferResponse is currently an unspecialized TransferResponse instance, create the
|
||||
// appropriate subclass so that the value is consistently specialized
|
||||
if (contactId != null) {
|
||||
transferResponse =
|
||||
new ContactTransferResponse.Builder()
|
||||
.setContactId(contactId)
|
||||
.setGainingRegistrarId(transferResponse.getGainingRegistrarId())
|
||||
.setLosingRegistrarId(transferResponse.getLosingRegistrarId())
|
||||
.setTransferStatus(transferResponse.getTransferStatus())
|
||||
.setTransferRequestTime(transferResponse.getTransferRequestTime())
|
||||
.setPendingTransferExpirationTime(
|
||||
transferResponse.getPendingTransferExpirationTime())
|
||||
.build();
|
||||
// Contacts are no longer supported
|
||||
transferResponse = null;
|
||||
} else if (domainName != null) {
|
||||
transferResponse =
|
||||
new DomainTransferResponse.Builder()
|
||||
@@ -488,9 +474,6 @@ public abstract class PollMessage extends ImmutableObject
|
||||
|
||||
// Set identifier fields based on the type of the notification response.
|
||||
if (instance.pendingActionNotificationResponse
|
||||
instanceof ContactPendingActionNotificationResponse) {
|
||||
instance.contactId = instance.pendingActionNotificationResponse.nameOrId.value;
|
||||
} else if (instance.pendingActionNotificationResponse
|
||||
instanceof DomainPendingActionNotificationResponse) {
|
||||
instance.domainName = instance.pendingActionNotificationResponse.nameOrId.value;
|
||||
} else if (instance.pendingActionNotificationResponse
|
||||
@@ -507,9 +490,7 @@ public abstract class PollMessage extends ImmutableObject
|
||||
.orElse(null);
|
||||
|
||||
// Set the identifier according to the TransferResponse type.
|
||||
if (instance.transferResponse instanceof ContactTransferResponse) {
|
||||
instance.contactId = ((ContactTransferResponse) instance.transferResponse).getContactId();
|
||||
} else if (instance.transferResponse instanceof DomainTransferResponse response) {
|
||||
if (instance.transferResponse instanceof DomainTransferResponse response) {
|
||||
instance.domainName = response.getDomainName();
|
||||
instance.extendedRegistrationExpirationTime =
|
||||
response.getExtendedRegistrationExpirationTime();
|
||||
|
||||
@@ -25,7 +25,7 @@ import jakarta.xml.bind.annotation.XmlElement;
|
||||
import jakarta.xml.bind.annotation.XmlTransient;
|
||||
import org.joda.time.DateTime;
|
||||
|
||||
/** Fields common to {@link TransferData} and {@link TransferResponse}. */
|
||||
/** Fields common to {@link DomainTransferData} and {@link TransferResponse}. */
|
||||
@XmlTransient
|
||||
@MappedSuperclass
|
||||
public abstract class BaseTransferObject extends ImmutableObject implements UnsafeSerializable {
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
// Copyright 2020 The Nomulus Authors. All Rights Reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package google.registry.model.transfer;
|
||||
|
||||
import jakarta.persistence.Embeddable;
|
||||
|
||||
/** Transfer data for contact. */
|
||||
@Embeddable
|
||||
public class ContactTransferData extends TransferData {
|
||||
public static final ContactTransferData EMPTY = new ContactTransferData();
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return EMPTY.equals(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Builder createEmptyBuilder() {
|
||||
return new Builder();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Builder asBuilder() {
|
||||
return new Builder(clone(this));
|
||||
}
|
||||
|
||||
public static class Builder extends TransferData.Builder<ContactTransferData, Builder> {
|
||||
/** Create a {@link Builder} wrapping a new instance. */
|
||||
public Builder() {}
|
||||
|
||||
/** Create a {@link Builder} wrapping the given instance. */
|
||||
private Builder(ContactTransferData instance) {
|
||||
super(instance);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,14 +14,20 @@
|
||||
|
||||
package google.registry.model.transfer;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkState;
|
||||
import static com.google.common.collect.ImmutableList.toImmutableList;
|
||||
import static google.registry.util.CollectionUtils.isNullOrEmpty;
|
||||
import static google.registry.util.CollectionUtils.nullToEmpty;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import google.registry.model.Buildable;
|
||||
import google.registry.model.billing.BillingCancellation;
|
||||
import google.registry.model.billing.BillingEvent;
|
||||
import google.registry.model.billing.BillingRecurrence;
|
||||
import google.registry.model.domain.Period;
|
||||
import google.registry.model.domain.Period.Unit;
|
||||
import google.registry.model.eppcommon.Trid;
|
||||
import google.registry.model.poll.PollMessage;
|
||||
import google.registry.persistence.VKey;
|
||||
import google.registry.util.NullIgnoringCollectionBuilder;
|
||||
@@ -36,9 +42,41 @@ import org.joda.time.DateTime;
|
||||
|
||||
/** Transfer data for domain. */
|
||||
@Embeddable
|
||||
public class DomainTransferData extends TransferData {
|
||||
public class DomainTransferData extends BaseTransferObject implements Buildable {
|
||||
public static final DomainTransferData EMPTY = new DomainTransferData();
|
||||
|
||||
/** The transaction id of the most recent transfer request (or null if there never was one). */
|
||||
@Embedded
|
||||
@AttributeOverrides({
|
||||
@AttributeOverride(
|
||||
name = "serverTransactionId",
|
||||
column = @Column(name = "transfer_server_txn_id")),
|
||||
@AttributeOverride(
|
||||
name = "clientTransactionId",
|
||||
column = @Column(name = "transfer_client_txn_id"))
|
||||
})
|
||||
Trid transferRequestTrid;
|
||||
|
||||
@Column(name = "transfer_repo_id")
|
||||
String repoId;
|
||||
|
||||
@Column(name = "transfer_history_entry_id")
|
||||
Long historyEntryId;
|
||||
|
||||
// The pollMessageId1 and pollMessageId2 are used to store the IDs for gaining and losing poll
|
||||
// messages in Cloud SQL.
|
||||
//
|
||||
// In addition, there may be a third poll message for the autorenew poll message on domain
|
||||
// transfer if applicable.
|
||||
@Column(name = "transfer_poll_message_id_1")
|
||||
Long pollMessageId1;
|
||||
|
||||
@Column(name = "transfer_poll_message_id_2")
|
||||
Long pollMessageId2;
|
||||
|
||||
@Column(name = "transfer_poll_message_id_3")
|
||||
Long pollMessageId3;
|
||||
|
||||
/**
|
||||
* The period to extend the registration upon completion of the transfer.
|
||||
*
|
||||
@@ -107,15 +145,19 @@ public class DomainTransferData extends TransferData {
|
||||
@Column(name = "transfer_autorenew_poll_message_history_id")
|
||||
Long serverApproveAutorenewPollMessageHistoryId;
|
||||
|
||||
@Override
|
||||
public Builder copyConstantFieldsToBuilder() {
|
||||
return ((Builder) super.copyConstantFieldsToBuilder()).setTransferPeriod(transferPeriod);
|
||||
}
|
||||
|
||||
public Period getTransferPeriod() {
|
||||
return transferPeriod;
|
||||
}
|
||||
|
||||
public Long getHistoryEntryId() {
|
||||
return historyEntryId;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Trid getTransferRequestTrid() {
|
||||
return transferRequestTrid;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public DateTime getTransferredRegistrationExpirationTime() {
|
||||
return transferredRegistrationExpirationTime;
|
||||
@@ -141,12 +183,13 @@ public class DomainTransferData extends TransferData {
|
||||
return serverApproveAutorenewPollMessageHistoryId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImmutableSet<VKey<? extends TransferServerApproveEntity>> getServerApproveEntities() {
|
||||
ImmutableSet.Builder<VKey<? extends TransferServerApproveEntity>> builder =
|
||||
new ImmutableSet.Builder<>();
|
||||
builder.addAll(super.getServerApproveEntities());
|
||||
return NullIgnoringCollectionBuilder.create(builder)
|
||||
.add(pollMessageId1 != null ? VKey.create(PollMessage.class, pollMessageId1) : null)
|
||||
.add(pollMessageId2 != null ? VKey.create(PollMessage.class, pollMessageId2) : null)
|
||||
.add(pollMessageId3 != null ? VKey.create(PollMessage.class, pollMessageId3) : null)
|
||||
.add(serverApproveBillingEvent)
|
||||
.add(serverApproveAutorenewEvent)
|
||||
.add(billingCancellationId)
|
||||
@@ -154,16 +197,10 @@ public class DomainTransferData extends TransferData {
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return EMPTY.equals(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Builder createEmptyBuilder() {
|
||||
return new Builder();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Builder asBuilder() {
|
||||
return new Builder(clone(this));
|
||||
@@ -186,7 +223,72 @@ public class DomainTransferData extends TransferData {
|
||||
}
|
||||
}
|
||||
|
||||
public static class Builder extends TransferData.Builder<DomainTransferData, Builder> {
|
||||
/**
|
||||
* Returns a fresh Builder populated only with the constant fields of this TransferData, i.e.
|
||||
* those that are fixed and unchanging throughout the transfer process.
|
||||
*
|
||||
* <p>These fields are:
|
||||
*
|
||||
* <ul>
|
||||
* <li>transferRequestTrid
|
||||
* <li>transferRequestTime
|
||||
* <li>gainingClientId
|
||||
* <li>losingClientId
|
||||
* <li>transferPeriod
|
||||
* </ul>
|
||||
*/
|
||||
public Builder copyConstantFieldsToBuilder() {
|
||||
return new Builder()
|
||||
.setTransferPeriod(transferPeriod)
|
||||
.setTransferRequestTrid(transferRequestTrid)
|
||||
.setTransferRequestTime(transferRequestTime)
|
||||
.setGainingRegistrarId(gainingClientId)
|
||||
.setLosingRegistrarId(losingClientId);
|
||||
}
|
||||
|
||||
/** Maps serverApproveEntities set to the individual fields. */
|
||||
static void mapServerApproveEntitiesToFields(
|
||||
Set<VKey<? extends TransferServerApproveEntity>> serverApproveEntities,
|
||||
DomainTransferData transferData) {
|
||||
if (isNullOrEmpty(serverApproveEntities)) {
|
||||
transferData.pollMessageId1 = null;
|
||||
transferData.pollMessageId2 = null;
|
||||
transferData.pollMessageId3 = null;
|
||||
return;
|
||||
}
|
||||
ImmutableList<Long> sortedPollMessageIds = getSortedPollMessageIds(serverApproveEntities);
|
||||
if (!sortedPollMessageIds.isEmpty()) {
|
||||
transferData.pollMessageId1 = sortedPollMessageIds.get(0);
|
||||
}
|
||||
if (sortedPollMessageIds.size() >= 2) {
|
||||
transferData.pollMessageId2 = sortedPollMessageIds.get(1);
|
||||
}
|
||||
if (sortedPollMessageIds.size() >= 3) {
|
||||
transferData.pollMessageId3 = sortedPollMessageIds.get(2);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets poll message IDs from the given serverApproveEntities and sorts the IDs in natural order.
|
||||
*/
|
||||
private static ImmutableList<Long> getSortedPollMessageIds(
|
||||
Set<VKey<? extends TransferServerApproveEntity>> serverApproveEntities) {
|
||||
return nullToEmpty(serverApproveEntities).stream()
|
||||
.filter(vKey -> PollMessage.class.isAssignableFrom(vKey.getKind()))
|
||||
.map(vKey -> (long) vKey.getKey())
|
||||
.sorted()
|
||||
.collect(toImmutableList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Marker interface for objects that are written in anticipation of a server approval, and
|
||||
* therefore need to be deleted under any other outcome.
|
||||
*/
|
||||
public interface TransferServerApproveEntity {
|
||||
VKey<? extends TransferServerApproveEntity> createVKey();
|
||||
}
|
||||
|
||||
public static class Builder extends BaseTransferObject.Builder<DomainTransferData, Builder> {
|
||||
/** Create a {@link Builder} wrapping a new instance. */
|
||||
public Builder() {}
|
||||
|
||||
@@ -195,6 +297,20 @@ public class DomainTransferData extends TransferData {
|
||||
super(instance);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainTransferData build() {
|
||||
if (getInstance().pollMessageId1 != null) {
|
||||
checkState(getInstance().repoId != null, "Repo id undefined");
|
||||
checkState(getInstance().historyEntryId != null, "History entry undefined");
|
||||
}
|
||||
return super.build();
|
||||
}
|
||||
|
||||
public Builder setTransferRequestTrid(Trid transferRequestTrid) {
|
||||
getInstance().transferRequestTrid = transferRequestTrid;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setTransferPeriod(Period transferPeriod) {
|
||||
getInstance().transferPeriod = transferPeriod;
|
||||
return this;
|
||||
@@ -223,12 +339,13 @@ public class DomainTransferData extends TransferData {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Builder setServerApproveEntities(
|
||||
String repoId,
|
||||
Long historyId,
|
||||
ImmutableSet<VKey<? extends TransferServerApproveEntity>> serverApproveEntities) {
|
||||
super.setServerApproveEntities(repoId, historyId, serverApproveEntities);
|
||||
getInstance().repoId = repoId;
|
||||
getInstance().historyEntryId = historyId;
|
||||
mapServerApproveEntitiesToFields(serverApproveEntities, getInstance());
|
||||
mapBillingCancellationEntityToField(serverApproveEntities, getInstance());
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -1,205 +0,0 @@
|
||||
// Copyright 2017 The Nomulus Authors. All Rights Reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package google.registry.model.transfer;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkState;
|
||||
import static com.google.common.collect.ImmutableList.toImmutableList;
|
||||
import static google.registry.util.CollectionUtils.isNullOrEmpty;
|
||||
import static google.registry.util.CollectionUtils.nullToEmpty;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import google.registry.model.Buildable;
|
||||
import google.registry.model.EppResource;
|
||||
import google.registry.model.eppcommon.Trid;
|
||||
import google.registry.model.poll.PollMessage;
|
||||
import google.registry.persistence.VKey;
|
||||
import google.registry.util.NullIgnoringCollectionBuilder;
|
||||
import jakarta.persistence.AttributeOverride;
|
||||
import jakarta.persistence.AttributeOverrides;
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Embedded;
|
||||
import jakarta.persistence.MappedSuperclass;
|
||||
import java.util.Set;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* Common transfer data for {@link EppResource} types. Only applies to domains and contacts; hosts
|
||||
* are implicitly transferred with their superordinate domain.
|
||||
*/
|
||||
@MappedSuperclass
|
||||
public abstract class TransferData extends BaseTransferObject implements Buildable {
|
||||
|
||||
/** The transaction id of the most recent transfer request (or null if there never was one). */
|
||||
@Embedded
|
||||
@AttributeOverrides({
|
||||
@AttributeOverride(
|
||||
name = "serverTransactionId",
|
||||
column = @Column(name = "transfer_server_txn_id")),
|
||||
@AttributeOverride(
|
||||
name = "clientTransactionId",
|
||||
column = @Column(name = "transfer_client_txn_id"))
|
||||
})
|
||||
Trid transferRequestTrid;
|
||||
|
||||
@Column(name = "transfer_repo_id")
|
||||
String repoId;
|
||||
|
||||
@Column(name = "transfer_history_entry_id")
|
||||
Long historyEntryId;
|
||||
|
||||
// The pollMessageId1 and pollMessageId2 are used to store the IDs for gaining and losing poll
|
||||
// messages in Cloud SQL.
|
||||
//
|
||||
// In addition, there may be a third poll message for the autorenew poll message on domain
|
||||
// transfer if applicable.
|
||||
@Column(name = "transfer_poll_message_id_1")
|
||||
Long pollMessageId1;
|
||||
|
||||
@Column(name = "transfer_poll_message_id_2")
|
||||
Long pollMessageId2;
|
||||
|
||||
@Column(name = "transfer_poll_message_id_3")
|
||||
Long pollMessageId3;
|
||||
|
||||
public abstract boolean isEmpty();
|
||||
|
||||
public Long getHistoryEntryId() {
|
||||
return historyEntryId;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Trid getTransferRequestTrid() {
|
||||
return transferRequestTrid;
|
||||
}
|
||||
|
||||
public ImmutableSet<VKey<? extends TransferServerApproveEntity>> getServerApproveEntities() {
|
||||
return NullIgnoringCollectionBuilder.create(
|
||||
new ImmutableSet.Builder<VKey<? extends TransferServerApproveEntity>>())
|
||||
.add(pollMessageId1 != null ? VKey.create(PollMessage.class, pollMessageId1) : null)
|
||||
.add(pollMessageId2 != null ? VKey.create(PollMessage.class, pollMessageId2) : null)
|
||||
.add(pollMessageId3 != null ? VKey.create(PollMessage.class, pollMessageId3) : null)
|
||||
.getBuilder()
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract Builder<?, ?> asBuilder();
|
||||
|
||||
protected abstract Builder<?, ?> createEmptyBuilder();
|
||||
|
||||
/**
|
||||
* Returns a fresh Builder populated only with the constant fields of this TransferData, i.e.
|
||||
* those that are fixed and unchanging throughout the transfer process.
|
||||
*
|
||||
* <p>These fields are:
|
||||
*
|
||||
* <ul>
|
||||
* <li>transferRequestTrid
|
||||
* <li>transferRequestTime
|
||||
* <li>gainingClientId
|
||||
* <li>losingClientId
|
||||
* <li>transferPeriod
|
||||
* </ul>
|
||||
*/
|
||||
public Builder<?, ?> copyConstantFieldsToBuilder() {
|
||||
Builder<?, ?> newBuilder = createEmptyBuilder();
|
||||
newBuilder
|
||||
.setTransferRequestTrid(transferRequestTrid)
|
||||
.setTransferRequestTime(transferRequestTime)
|
||||
.setGainingRegistrarId(gainingClientId)
|
||||
.setLosingRegistrarId(losingClientId);
|
||||
return newBuilder;
|
||||
}
|
||||
|
||||
/** Maps serverApproveEntities set to the individual fields. */
|
||||
static void mapServerApproveEntitiesToFields(
|
||||
Set<VKey<? extends TransferServerApproveEntity>> serverApproveEntities,
|
||||
TransferData transferData) {
|
||||
if (isNullOrEmpty(serverApproveEntities)) {
|
||||
transferData.pollMessageId1 = null;
|
||||
transferData.pollMessageId2 = null;
|
||||
transferData.pollMessageId3 = null;
|
||||
return;
|
||||
}
|
||||
ImmutableList<Long> sortedPollMessageIds = getSortedPollMessageIds(serverApproveEntities);
|
||||
if (sortedPollMessageIds.size() >= 1) {
|
||||
transferData.pollMessageId1 = sortedPollMessageIds.get(0);
|
||||
}
|
||||
if (sortedPollMessageIds.size() >= 2) {
|
||||
transferData.pollMessageId2 = sortedPollMessageIds.get(1);
|
||||
}
|
||||
if (sortedPollMessageIds.size() >= 3) {
|
||||
transferData.pollMessageId3 = sortedPollMessageIds.get(2);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets poll message IDs from the given serverApproveEntities and sorted the IDs in natural order.
|
||||
*/
|
||||
private static ImmutableList<Long> getSortedPollMessageIds(
|
||||
Set<VKey<? extends TransferServerApproveEntity>> serverApproveEntities) {
|
||||
return nullToEmpty(serverApproveEntities).stream()
|
||||
.filter(vKey -> PollMessage.class.isAssignableFrom(vKey.getKind()))
|
||||
.map(vKey -> (long) vKey.getKey())
|
||||
.sorted()
|
||||
.collect(toImmutableList());
|
||||
}
|
||||
|
||||
/** Builder for {@link TransferData} because it is immutable. */
|
||||
public abstract static class Builder<T extends TransferData, B extends Builder<T, B>>
|
||||
extends BaseTransferObject.Builder<T, B> {
|
||||
|
||||
/** Create a {@link Builder} wrapping a new instance. */
|
||||
protected Builder() {}
|
||||
|
||||
/** Create a {@link Builder} wrapping the given instance. */
|
||||
protected Builder(T instance) {
|
||||
super(instance);
|
||||
}
|
||||
|
||||
public B setTransferRequestTrid(Trid transferRequestTrid) {
|
||||
getInstance().transferRequestTrid = transferRequestTrid;
|
||||
return thisCastToDerived();
|
||||
}
|
||||
|
||||
public B setServerApproveEntities(
|
||||
String repoId,
|
||||
Long historyId,
|
||||
ImmutableSet<VKey<? extends TransferServerApproveEntity>> serverApproveEntities) {
|
||||
getInstance().repoId = repoId;
|
||||
getInstance().historyEntryId = historyId;
|
||||
mapServerApproveEntitiesToFields(serverApproveEntities, getInstance());
|
||||
return thisCastToDerived();
|
||||
}
|
||||
|
||||
@Override
|
||||
public T build() {
|
||||
if (getInstance().pollMessageId1 != null) {
|
||||
checkState(getInstance().repoId != null, "Repo id undefined");
|
||||
checkState(getInstance().historyEntryId != null, "History entry undefined");
|
||||
}
|
||||
return super.build();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Marker interface for objects that are written in anticipation of a server approval, and
|
||||
* therefore need to be deleted under any other outcome.
|
||||
*/
|
||||
public interface TransferServerApproveEntity {
|
||||
VKey<? extends TransferServerApproveEntity> createVKey();
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,6 @@ import google.registry.model.domain.secdns.DomainDsData;
|
||||
import google.registry.model.eppcommon.StatusValue;
|
||||
import google.registry.model.rde.RdeMode;
|
||||
import google.registry.model.transfer.DomainTransferData;
|
||||
import google.registry.model.transfer.TransferData;
|
||||
import google.registry.util.Idn;
|
||||
import google.registry.xjc.domain.XjcDomainNsType;
|
||||
import google.registry.xjc.domain.XjcDomainStatusType;
|
||||
@@ -221,7 +220,7 @@ final class DomainToXjcConverter {
|
||||
&& !Strings.isNullOrEmpty(model.getTransferData().getLosingRegistrarId());
|
||||
}
|
||||
|
||||
/** Converts {@link TransferData} to {@link XjcRdeDomainTransferDataType}. */
|
||||
/** Converts {@link DomainTransferData} to {@link XjcRdeDomainTransferDataType}. */
|
||||
private static XjcRdeDomainTransferDataType convertTransferData(DomainTransferData model) {
|
||||
XjcRdeDomainTransferDataType bean = new XjcRdeDomainTransferDataType();
|
||||
bean.setTrStatus(
|
||||
|
||||
@@ -41,7 +41,7 @@ import google.registry.model.eppcommon.StatusValue;
|
||||
import google.registry.model.host.Host;
|
||||
import google.registry.model.reporting.HistoryEntry;
|
||||
import google.registry.model.tld.Tld;
|
||||
import google.registry.model.transfer.TransferData;
|
||||
import google.registry.model.transfer.DomainTransferData;
|
||||
import google.registry.model.transfer.TransferStatus;
|
||||
import google.registry.persistence.transaction.JpaTransactionManagerExtension;
|
||||
import org.joda.time.DateTime;
|
||||
@@ -161,7 +161,8 @@ abstract class DomainTransferFlowTestCase<F extends Flow, R extends EppResource>
|
||||
.build();
|
||||
}
|
||||
|
||||
void assertTransferFailed(Domain domain, TransferStatus status, TransferData oldTransferData) {
|
||||
void assertTransferFailed(
|
||||
Domain domain, TransferStatus status, DomainTransferData oldTransferData) {
|
||||
assertAboutDomains()
|
||||
.that(domain)
|
||||
.doesNotHaveStatusValue(StatusValue.PENDING_TRANSFER)
|
||||
|
||||
@@ -54,7 +54,7 @@ import google.registry.model.poll.PollMessage;
|
||||
import google.registry.model.reporting.DomainTransactionRecord;
|
||||
import google.registry.model.reporting.HistoryEntry;
|
||||
import google.registry.model.tld.Tld;
|
||||
import google.registry.model.transfer.TransferData;
|
||||
import google.registry.model.transfer.DomainTransferData;
|
||||
import google.registry.model.transfer.TransferResponse;
|
||||
import google.registry.model.transfer.TransferStatus;
|
||||
import org.joda.time.DateTime;
|
||||
@@ -90,7 +90,7 @@ class DomainTransferRejectFlowTest
|
||||
assertMutatingFlow(true);
|
||||
DateTime originalExpirationTime = domain.getRegistrationExpirationTime();
|
||||
ImmutableSet<GracePeriod> originalGracePeriods = domain.getGracePeriods();
|
||||
TransferData originalTransferData = domain.getTransferData();
|
||||
DomainTransferData originalTransferData = domain.getTransferData();
|
||||
runFlowAssertResponse(loadFile(expectedXmlFilename));
|
||||
// Transfer should have been rejected. Verify correct fields were set.
|
||||
domain = reloadResourceByForeignKey();
|
||||
|
||||
@@ -29,8 +29,8 @@ import org.joda.time.DateTime;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/** Unit tests for {@link TransferData}. */
|
||||
public class TransferDataTest {
|
||||
/** Unit tests for {@link DomainTransferData}. */
|
||||
public class DomainTransferDataTest {
|
||||
|
||||
private final DateTime now = DateTime.now(UTC);
|
||||
|
||||
@@ -261,7 +261,7 @@ td.section {
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="property_name">generated on</td>
|
||||
<td class="property_value">2026-02-20 05:51:31</td>
|
||||
<td class="property_value">2026-02-20 20:45:48</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="property_name">last flyway file</td>
|
||||
@@ -273,7 +273,7 @@ td.section {
|
||||
<p> </p>
|
||||
<svg viewBox="0.00 0.00 4846.00 3765.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="erDiagram" style="overflow: hidden; width: 100%; height: 800px">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 3761)">
|
||||
<title>SchemaCrawler_Diagram</title> <polygon fill="white" stroke="transparent" points="-4,4 -4,-3761 4842,-3761 4842,4 -4,4" /> <text text-anchor="start" x="4598" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00">generated by</text> <text text-anchor="start" x="4681" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00">SchemaCrawler 16.27.1</text> <text text-anchor="start" x="4597" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00">generated on</text> <text text-anchor="start" x="4681" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00">2026-02-20 05:51:31</text> <polygon fill="none" stroke="#888888" points="4594,-4 4594,-44 4830,-44 4830,-4 4594,-4" /> <!-- allocationtoken_a08ccbef -->
|
||||
<title>SchemaCrawler_Diagram</title> <polygon fill="white" stroke="transparent" points="-4,4 -4,-3761 4842,-3761 4842,4 -4,4" /> <text text-anchor="start" x="4598" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00">generated by</text> <text text-anchor="start" x="4681" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00">SchemaCrawler 16.27.1</text> <text text-anchor="start" x="4597" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00">generated on</text> <text text-anchor="start" x="4681" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00">2026-02-20 20:45:48</text> <polygon fill="none" stroke="#888888" points="4594,-4 4594,-44 4830,-44 4830,-4 4594,-4" /> <!-- allocationtoken_a08ccbef -->
|
||||
<g id="node1" class="node">
|
||||
<title>allocationtoken_a08ccbef</title> <polygon fill="#e9c2f2" stroke="transparent" points="525.5,-1272 525.5,-1291 711.5,-1291 711.5,-1272 525.5,-1272" /> <text text-anchor="start" x="527.5" y="-1278.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">public."AllocationToken"</text> <polygon fill="#e9c2f2" stroke="transparent" points="711.5,-1272 711.5,-1291 785.5,-1291 785.5,-1272 711.5,-1272" /> <text text-anchor="start" x="746.5" y="-1277.8" font-family="Helvetica,sans-Serif" font-size="14.00">[table]</text> <text text-anchor="start" x="527.5" y="-1259.8" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">token</text> <text text-anchor="start" x="705.5" y="-1258.8" font-family="Helvetica,sans-Serif" font-size="14.00"> </text> <text text-anchor="start" x="713.5" y="-1258.8" font-family="Helvetica,sans-Serif" font-size="14.00">text not null</text> <text text-anchor="start" x="527.5" y="-1239.8" font-family="Helvetica,sans-Serif" font-size="14.00">domain_name</text> <text text-anchor="start" x="705.5" y="-1239.8" font-family="Helvetica,sans-Serif" font-size="14.00"> </text> <text text-anchor="start" x="713.5" y="-1239.8" font-family="Helvetica,sans-Serif" font-size="14.00">text</text> <text text-anchor="start" x="527.5" y="-1220.8" font-family="Helvetica,sans-Serif" font-size="14.00">redemption_domain_repo_id</text> <text text-anchor="start" x="705.5" y="-1220.8" font-family="Helvetica,sans-Serif" font-size="14.00"> </text> <text text-anchor="start" x="713.5" y="-1220.8" font-family="Helvetica,sans-Serif" font-size="14.00">text</text> <text text-anchor="start" x="527.5" y="-1201.8" font-family="Helvetica,sans-Serif" font-size="14.00">token_type</text> <text text-anchor="start" x="705.5" y="-1201.8" font-family="Helvetica,sans-Serif" font-size="14.00"> </text> <text text-anchor="start" x="713.5" y="-1201.8" font-family="Helvetica,sans-Serif" font-size="14.00">text</text> <polygon fill="none" stroke="#888888" points="524.5,-1195.5 524.5,-1292.5 786.5,-1292.5 786.5,-1195.5 524.5,-1195.5" />
|
||||
</g>
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -206,20 +206,20 @@
|
||||
tech_contact text,
|
||||
tld text,
|
||||
transfer_billing_cancellation_id bigint,
|
||||
transfer_history_entry_id bigint,
|
||||
transfer_poll_message_id_1 bigint,
|
||||
transfer_poll_message_id_2 bigint,
|
||||
transfer_poll_message_id_3 bigint,
|
||||
transfer_repo_id text,
|
||||
transfer_billing_recurrence_id bigint,
|
||||
transfer_autorenew_poll_message_id bigint,
|
||||
transfer_autorenew_poll_message_history_id bigint,
|
||||
transfer_billing_event_id bigint,
|
||||
transfer_renew_period_unit text check (transfer_renew_period_unit in ('YEARS','MONTHS')),
|
||||
transfer_renew_period_value integer,
|
||||
transfer_registration_expiration_time timestamp(6) with time zone,
|
||||
transfer_history_entry_id bigint,
|
||||
transfer_poll_message_id_1 bigint,
|
||||
transfer_poll_message_id_2 bigint,
|
||||
transfer_poll_message_id_3 bigint,
|
||||
transfer_repo_id text,
|
||||
transfer_client_txn_id text,
|
||||
transfer_server_txn_id text,
|
||||
transfer_registration_expiration_time timestamp(6) with time zone,
|
||||
transfer_gaining_registrar_id text,
|
||||
transfer_losing_registrar_id text,
|
||||
transfer_pending_expiration_time timestamp(6) with time zone,
|
||||
@@ -278,20 +278,20 @@
|
||||
tech_contact text,
|
||||
tld text,
|
||||
transfer_billing_cancellation_id bigint,
|
||||
transfer_history_entry_id bigint,
|
||||
transfer_poll_message_id_1 bigint,
|
||||
transfer_poll_message_id_2 bigint,
|
||||
transfer_poll_message_id_3 bigint,
|
||||
transfer_repo_id text,
|
||||
transfer_billing_recurrence_id bigint,
|
||||
transfer_autorenew_poll_message_id bigint,
|
||||
transfer_autorenew_poll_message_history_id bigint,
|
||||
transfer_billing_event_id bigint,
|
||||
transfer_renew_period_unit text check (transfer_renew_period_unit in ('YEARS','MONTHS')),
|
||||
transfer_renew_period_value integer,
|
||||
transfer_registration_expiration_time timestamp(6) with time zone,
|
||||
transfer_history_entry_id bigint,
|
||||
transfer_poll_message_id_1 bigint,
|
||||
transfer_poll_message_id_2 bigint,
|
||||
transfer_poll_message_id_3 bigint,
|
||||
transfer_repo_id text,
|
||||
transfer_client_txn_id text,
|
||||
transfer_server_txn_id text,
|
||||
transfer_registration_expiration_time timestamp(6) with time zone,
|
||||
transfer_gaining_registrar_id text,
|
||||
transfer_losing_registrar_id text,
|
||||
transfer_pending_expiration_time timestamp(6) with time zone,
|
||||
|
||||
Reference in New Issue
Block a user