diff --git a/core/src/main/java/google/registry/model/registry/RegistryLockDao.java b/core/src/main/java/google/registry/model/registry/RegistryLockDao.java index 1b88fff59..5852b858c 100644 --- a/core/src/main/java/google/registry/model/registry/RegistryLockDao.java +++ b/core/src/main/java/google/registry/model/registry/RegistryLockDao.java @@ -19,6 +19,7 @@ import static google.registry.model.transaction.TransactionManagerFactory.jpaTm; import com.google.common.collect.ImmutableList; import google.registry.schema.domain.RegistryLock; +import java.util.Optional; import javax.persistence.EntityManager; /** Data access object for {@link google.registry.schema.domain.RegistryLock}. */ @@ -47,6 +48,7 @@ public final class RegistryLockDao { }); } + /** Returns all lock objects that this registrar has created. */ public static ImmutableList getByRegistrarId(String registrarId) { return jpaTm() .transact( @@ -62,6 +64,26 @@ public final class RegistryLockDao { .getResultList())); } + /** + * Returns the most recent lock object for a given repo ID (i.e. a domain) or empty if this domain + * hasn't been locked before. + */ + public static Optional getMostRecentByRepoId(String repoId) { + return jpaTm() + .transact( + () -> + jpaTm() + .getEntityManager() + .createQuery( + "SELECT lock FROM RegistryLock lock WHERE lock.repoId = :repoId" + + " ORDER BY lock.revisionId DESC", + RegistryLock.class) + .setParameter("repoId", repoId) + .setMaxResults(1) + .getResultStream() + .findFirst()); + } + public static RegistryLock save(RegistryLock registryLock) { checkNotNull(registryLock, "Null registry lock cannot be saved"); return jpaTm().transact(() -> jpaTm().getEntityManager().merge(registryLock)); diff --git a/core/src/test/java/google/registry/model/registry/RegistryLockDaoTest.java b/core/src/test/java/google/registry/model/registry/RegistryLockDaoTest.java index 06d63fe90..4fc8f9c06 100644 --- a/core/src/test/java/google/registry/model/registry/RegistryLockDaoTest.java +++ b/core/src/test/java/google/registry/model/registry/RegistryLockDaoTest.java @@ -120,6 +120,26 @@ public final class RegistryLockDaoTest { assertThat(RegistryLockDao.getByRegistrarId("nonexistent")).isEmpty(); } + @Test + public void testLoad_byRepoId() { + RegistryLock completedLock = + createLock().asBuilder().setCompletionTimestamp(jpaTmRule.getTxnClock().nowUtc()).build(); + RegistryLockDao.save(completedLock); + + jpaTmRule.getTxnClock().advanceOneMilli(); + RegistryLock inProgressLock = createLock(); + RegistryLockDao.save(inProgressLock); + + Optional mostRecent = RegistryLockDao.getMostRecentByRepoId("repoId"); + assertThat(mostRecent.isPresent()).isTrue(); + assertThat(mostRecent.get().isVerified()).isFalse(); + } + + @Test + public void testLoad_byRepoId_empty() { + assertThat(RegistryLockDao.getMostRecentByRepoId("nonexistent").isPresent()).isFalse(); + } + private RegistryLock createLock() { return new RegistryLock.Builder() .setRepoId("repoId")