diff --git a/pom.xml b/pom.xml index 3efa4c4db9..b67f3b1640 100644 --- a/pom.xml +++ b/pom.xml @@ -85,7 +85,7 @@ 2.2.8.RELEASE - 0.145 + 0.148-SNAPSHOT 0.50 1.1 1.15 diff --git a/registry-events/src/main/java/org/gbif/registry/events/collections/SubEntityCollectionEvent.java b/registry-events/src/main/java/org/gbif/registry/events/collections/SubEntityCollectionEvent.java index 823aebd132..d455a21e9e 100644 --- a/registry-events/src/main/java/org/gbif/registry/events/collections/SubEntityCollectionEvent.java +++ b/registry-events/src/main/java/org/gbif/registry/events/collections/SubEntityCollectionEvent.java @@ -72,7 +72,7 @@ private SubEntityCollectionEvent( String subEntityKey, EventType eventType) { super(eventType, collectionEntityClass); - this.collectionEntityKey = Preconditions.checkNotNull(collectionEntityKey); + this.collectionEntityKey = collectionEntityKey; this.subEntityClass = Preconditions.checkNotNull(subEntityClass); this.subEntity = subEntity; this.subEntityKey = Preconditions.checkNotNull(subEntityKey); diff --git a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/service/merge/BaseMergeServiceIT.java b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/service/merge/BaseMergeServiceIT.java index fe726ec3eb..58c8108e9f 100644 --- a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/service/merge/BaseMergeServiceIT.java +++ b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/service/merge/BaseMergeServiceIT.java @@ -58,7 +58,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.test.context.support.WithMockUser; import static org.gbif.registry.domain.collections.Constants.IDIGBIO_NAMESPACE; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -66,6 +65,7 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; public abstract class BaseMergeServiceIT< T extends @@ -106,7 +106,6 @@ public BaseMergeServiceIT( this.personService = personService; } - @WithMockUser(username = "aa") @Test public void mergeTest() { T toReplace = createEntityToReplace(); @@ -173,8 +172,8 @@ public void mergeTest() { assertEquals(2, replaced.getMachineTags().size()); assertEquals(1, replacementUpdated.getMachineTags().size()); assertEquals(2, replacementUpdated.getContacts().size()); - assertEquals(a2, replacementUpdated.getAddress()); - assertEquals(ma1, replacementUpdated.getMailingAddress()); + assertTrue(a2.lenientEquals(replacementUpdated.getAddress())); + assertTrue(ma1.lenientEquals(replacementUpdated.getMailingAddress())); assertEquals(replacement.getCreatedBy(), replacementUpdated.getCreatedBy()); assertNull(replacementUpdated.getDeleted()); assertEquals(1, replaced.getOccurrenceMappings().size()); diff --git a/registry-persistence/src/main/java/org/gbif/registry/persistence/mapper/collections/ChangeSuggestionMapper.java b/registry-persistence/src/main/java/org/gbif/registry/persistence/mapper/collections/ChangeSuggestionMapper.java index 4e23bef4b4..d0ee437735 100644 --- a/registry-persistence/src/main/java/org/gbif/registry/persistence/mapper/collections/ChangeSuggestionMapper.java +++ b/registry-persistence/src/main/java/org/gbif/registry/persistence/mapper/collections/ChangeSuggestionMapper.java @@ -25,7 +25,7 @@ public interface ChangeSuggestionMapper { List list( @Param("status") Status status, @Param("type") Type type, - @Param("entityType") CollectionEntityType collectionEntityType, + @Param("collectionEntityType") CollectionEntityType collectionEntityType, @Param("country") Country country, @Param("proposer") String proposer, @Param("entityKey") UUID entityKey, @@ -34,7 +34,7 @@ List list( long count( @Param("status") Status status, @Param("type") Type type, - @Param("entityType") CollectionEntityType collectionEntityType, + @Param("collectionEntityType") CollectionEntityType collectionEntityType, @Param("country") Country country, @Param("proposer") String proposer, @Param("entityKey") UUID entityKey); diff --git a/registry-persistence/src/main/resources/liquibase/095-grscicoll-audit-log.xml b/registry-persistence/src/main/resources/liquibase/095-grscicoll-audit-log.xml index 434581fc9e..d02fffd917 100644 --- a/registry-persistence/src/main/resources/liquibase/095-grscicoll-audit-log.xml +++ b/registry-persistence/src/main/resources/liquibase/095-grscicoll-audit-log.xml @@ -9,13 +9,16 @@ CREATE TABLE grscicoll_audit_log ( key bigserial NOT NULL PRIMARY KEY, trace_id bigserial NOT NULL, - entity_type enum_grscicoll_entity_type NOT NULL, - entity_key uuid, + collection_entity_type enum_grscicoll_entity_type NOT NULL, + subEntityType varchar(50), + operation varchar(50) NOT NULL, + collection_entity_key uuid, + sub_entity_key varchar(36), + replacement_key uuid, created timestamptz NOT NULL DEFAULT now(), created_by varchar NOT NULL CHECK (assert_min_length(created_by, 3)), pre_state jsonb, - post_state jsonb, - note text); + post_state jsonb) ]]> diff --git a/registry-service/src/main/java/org/gbif/registry/service/collections/merge/BaseMergeService.java b/registry-service/src/main/java/org/gbif/registry/service/collections/merge/BaseMergeService.java index 8d7b6b4b91..9fe3208b97 100644 --- a/registry-service/src/main/java/org/gbif/registry/service/collections/merge/BaseMergeService.java +++ b/registry-service/src/main/java/org/gbif/registry/service/collections/merge/BaseMergeService.java @@ -23,6 +23,7 @@ import org.gbif.api.model.registry.Commentable; import org.gbif.api.model.registry.Identifiable; import org.gbif.api.model.registry.Identifier; +import org.gbif.api.model.registry.MachineTag; import org.gbif.api.model.registry.MachineTaggable; import org.gbif.api.model.registry.Taggable; import org.gbif.api.service.collections.PrimaryCollectionEntityService; @@ -35,7 +36,6 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; -import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.function.UnaryOperator; @@ -109,30 +109,27 @@ && isIDigBioRecord(replacement)) { // merge entity fields T updatedEntityToReplace = mergeEntityFields(entityToReplace, replacement); - updatedEntityToReplace.setModifiedBy(authentication.getName()); primaryEntityService.update(updatedEntityToReplace); // copy the identifiers entityToReplace .getIdentifiers() .forEach( - i -> { - i.setKey(null); - // TODO: created must be null, create utility method to reuse - primaryEntityService.addIdentifier(replacementKey, i); - }); + i -> + primaryEntityService.addIdentifier( + replacementKey, new Identifier(i.getType(), i.getIdentifier()))); // copy iDigBio machine tags entityToReplace.getMachineTags().stream() .filter(mt -> mt.getNamespace().equals(IDIGBIO_NAMESPACE)) .forEach( - mt -> { - mt.setKey(null); - primaryEntityService.addMachineTag(replacementKey, mt); - }); + mt -> + primaryEntityService.addMachineTag( + replacementKey, + new MachineTag(mt.getNamespace(), mt.getName(), mt.getValue()))); // merge contacts - Objects.requireNonNull(entityToReplace.getContacts()).stream() + entityToReplace.getContacts().stream() .filter(c -> !replacement.getContacts().contains(c)) .forEach(c -> primaryEntityService.addContact(replacementKey, c.getKey())); @@ -147,7 +144,9 @@ && isIDigBioRecord(replacement)) { occMappings.forEach( om -> { om.setKey(null); - primaryEntityService.addOccurrenceMapping(replacementKey, om); + primaryEntityService.addOccurrenceMapping( + replacementKey, + new OccurrenceMapping(om.getCode(), om.getIdentifier(), om.getDatasetKey())); }); additionalOperations(entityToReplace, replacement); diff --git a/registry-service/src/main/java/org/gbif/registry/service/collections/merge/CollectionMergeService.java b/registry-service/src/main/java/org/gbif/registry/service/collections/merge/CollectionMergeService.java index e6acbe8fab..759e4654da 100644 --- a/registry-service/src/main/java/org/gbif/registry/service/collections/merge/CollectionMergeService.java +++ b/registry-service/src/main/java/org/gbif/registry/service/collections/merge/CollectionMergeService.java @@ -53,7 +53,6 @@ void checkMergeExtraPreconditions(Collection entityToReplace, Collection replace replacement.getReplacedBy() == null, "Cannot do a merge with an entity that was replaced"); } - // TODO: si uso primaryCollectionEntity lo puedo mover a la base @Override Collection mergeEntityFields(Collection entityToReplace, Collection replacement) { setNullFields(replacement, entityToReplace); @@ -85,7 +84,7 @@ Collection mergeEntityFields(Collection entityToReplace, Collection replacement) @Override void additionalOperations(Collection entityToReplace, Collection replacement) { // fix primary collection of contacts - PagingResponse persons = personService.list(null, entityToReplace.getKey(), null, null); + PagingResponse persons = personService.list(null, null, entityToReplace.getKey(), null); persons .getResults() .forEach( diff --git a/registry-service/src/main/java/org/gbif/registry/service/collections/merge/InstitutionMergeService.java b/registry-service/src/main/java/org/gbif/registry/service/collections/merge/InstitutionMergeService.java index dbfd3f3f17..fd95750417 100644 --- a/registry-service/src/main/java/org/gbif/registry/service/collections/merge/InstitutionMergeService.java +++ b/registry-service/src/main/java/org/gbif/registry/service/collections/merge/InstitutionMergeService.java @@ -18,10 +18,13 @@ import org.gbif.api.model.collections.AlternativeCode; import org.gbif.api.model.collections.Collection; import org.gbif.api.model.collections.Institution; +import org.gbif.api.model.collections.OccurrenceMapping; import org.gbif.api.model.collections.Person; import org.gbif.api.model.collections.request.CollectionSearchRequest; import org.gbif.api.model.collections.view.CollectionView; import org.gbif.api.model.common.paging.PagingResponse; +import org.gbif.api.model.registry.Identifier; +import org.gbif.api.model.registry.MachineTag; import org.gbif.api.service.collections.CollectionService; import org.gbif.api.service.collections.InstitutionService; import org.gbif.api.service.collections.PersonService; @@ -91,7 +94,6 @@ && isIDigBioRecord(institutionToConvert)) { } Collection newCollection = new Collection(); - newCollection.setKey(UUID.randomUUID()); newCollection.setCode(institutionToConvert.getCode()); newCollection.setAlternativeCodes(institutionToConvert.getAlternativeCodes()); newCollection.setName(institutionToConvert.getName()); @@ -105,17 +107,12 @@ && isIDigBioRecord(institutionToConvert)) { newCollection.setApiUrl(institutionToConvert.getApiUrl()); newCollection.setAddress(institutionToConvert.getAddress()); newCollection.setMailingAddress(institutionToConvert.getMailingAddress()); - newCollection.setCreatedBy(authentication.getName()); - newCollection.setModifiedBy(authentication.getName()); // if there is no institution passed we need to create a new institution if (institutionKeyForNewCollection == null) { Institution newInstitution = new Institution(); - newInstitution.setKey(UUID.randomUUID()); newInstitution.setCode(institutionToConvert.getCode()); newInstitution.setName(newInstitutionName); - newInstitution.setCreatedBy(authentication.getName()); - newInstitution.setModifiedBy(authentication.getName()); institutionService.create(newInstitution); newCollection.setInstitutionKey(newInstitution.getKey()); @@ -140,19 +137,18 @@ && isIDigBioRecord(institutionToConvert)) { institutionToConvert .getIdentifiers() .forEach( - i -> { - i.setKey(null); - collectionService.addIdentifier(newCollection.getKey(), i); - }); + i -> + collectionService.addIdentifier( + newCollection.getKey(), new Identifier(i.getType(), i.getIdentifier()))); // move the machine tags institutionToConvert .getMachineTags() .forEach( - mt -> { - mt.setKey(null); - collectionService.addMachineTag(newCollection.getKey(), mt); - }); + mt -> + collectionService.addMachineTag( + newCollection.getKey(), + new MachineTag(mt.getNamespace(), mt.getName(), mt.getValue()))); // move the occurrence mappings institutionToConvert @@ -160,7 +156,9 @@ && isIDigBioRecord(institutionToConvert)) { .forEach( om -> { om.setKey(null); - collectionService.addOccurrenceMapping(newCollection.getKey(), om); + collectionService.addOccurrenceMapping( + newCollection.getKey(), + new OccurrenceMapping(om.getCode(), om.getIdentifier(), om.getDatasetKey())); }); // copy the contacts