diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/contenttype/ContentTypeResource.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/contenttype/ContentTypeResource.java index 623f46c44c8..b84e9c68c3f 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/contenttype/ContentTypeResource.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/contenttype/ContentTypeResource.java @@ -714,8 +714,7 @@ public Response updateType(@PathParam("idOrVar") @Parameter( contentTypeAPI, false); final ImmutableMap.Builder builderMap = ImmutableMap.builder() - .putAll(contentTypeHelper.contentTypeToMap( - contentTypeAPI.find(tuple2._1.variable()), user)) + .putAll(contentTypeHelper.contentTypeToMap(tuple2._1, user)) .put(MAP_KEY_WORKFLOWS, this.workflowHelper.findSchemesByContentType( contentType.id(), initData.getUser())) diff --git a/dotCMS/src/main/java/com/dotmarketing/portlets/personas/business/PersonaAPIImpl.java b/dotCMS/src/main/java/com/dotmarketing/portlets/personas/business/PersonaAPIImpl.java index 18f88b78e77..d4741d17ffa 100644 --- a/dotCMS/src/main/java/com/dotmarketing/portlets/personas/business/PersonaAPIImpl.java +++ b/dotCMS/src/main/java/com/dotmarketing/portlets/personas/business/PersonaAPIImpl.java @@ -473,7 +473,13 @@ private Persona find(final String identifier, final User user, final boolean res final Contentlet contentlet = APILocator.getContentletAPI().findContentletByIdentifier(identifier, live, APILocator.getLanguageAPI().getDefaultLanguage().getId(), user, respectFrontEndRoles); - return UtilMethods.isSet(contentlet) ? fromContentlet(contentlet) : null; + + if(contentlet != null) { + return fromContentlet(contentlet); + } + + + return findPersonaByTag(identifier, user, respectFrontEndRoles).orElseGet(()->null); } @Override @@ -502,11 +508,15 @@ public Structure getDefaultPersonaStructure() throws DotSecurityException, DotDa public Optional findPersonaByTag(final String personaTag, final User user, final boolean respectFrontEndRoles) throws DotSecurityException, DotDataException { + if(UtilMethods.isEmpty(personaTag)){ + return Optional.empty(); + } + final StringBuilder query = new StringBuilder(" +baseType:").append(BaseContentType.PERSONA.getType()) .append(" +").append(PERSONA_KEY_TAG).append(":").append(personaTag); final List contentlets = - APILocator.getContentletAPI().search(query.toString(), -1, 0, StringPool.BLANK, user, respectFrontEndRoles); + APILocator.getContentletAPI().search(query.toString(), 1, 0, StringPool.BLANK, user, respectFrontEndRoles); final Optional persona = null != contentlets ? contentlets.stream().findFirst() : Optional.empty(); return persona.isPresent() ? Optional.ofNullable(fromContentlet(persona.get())) : Optional.empty(); } diff --git a/dotcms-integration/src/test/java/com/dotmarketing/portlets/personas/business/PersonaAPITest.java b/dotcms-integration/src/test/java/com/dotmarketing/portlets/personas/business/PersonaAPITest.java index 461d2245793..4125f1e1266 100644 --- a/dotcms-integration/src/test/java/com/dotmarketing/portlets/personas/business/PersonaAPITest.java +++ b/dotcms-integration/src/test/java/com/dotmarketing/portlets/personas/business/PersonaAPITest.java @@ -10,10 +10,13 @@ import com.dotcms.repackage.org.apache.struts.Globals; import com.dotmarketing.exception.DotDataException; import com.dotmarketing.exception.DotSecurityException; +import com.dotmarketing.util.UtilMethods; import java.util.List; import java.util.Optional; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import org.awaitility.Awaitility; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -289,6 +292,45 @@ public void testgetPersonasIncludingDefaultPersona_filterNewPersonaContentType_S } } } - - + + + /** + * Method to test: {@link PersonaAPI#find(String identifier,com.liferay.portal.model.User user, boolean respectFrontendRoles)} + * When: finding a persona + * Should: the persona should be resolved by id or by keytag + */ + @Test + public void test_personas_test_resolve_by_keytag() throws Exception { + + ContentType customPersonaType = new ContentTypeDataGen() + .host(host) + .baseContentType(BaseContentType.PERSONA).nextPersisted(); + + final Contentlet newPersona = new ContentletDataGen(customPersonaType.id()) + .host(host) + .setProperty("name", "AnotherPersona" + System.currentTimeMillis()) + .setProperty("keyTag", "AnotherPersona" + System.currentTimeMillis()) + .nextPersisted(); + + Contentlet personaById = personaAPI.find(newPersona.getIdentifier(), APILocator.systemUser(), true); + + + assertTrue(UtilMethods.isSet(()->personaById.getIdentifier())); + + + Awaitility.await().atMost(15, TimeUnit.SECONDS).pollInterval(2, TimeUnit.SECONDS).until(() -> { + try { + Contentlet personaByKeyTag = personaAPI.find(newPersona.getStringProperty("keyTag"), APILocator.systemUser(), true); + assert(personaById.getIdentifier().equals(personaByKeyTag.getIdentifier())); + return true; + } catch (Exception e) { + // ignore + } + return false; + }); + + APILocator.getContentletAPI().destroy(newPersona, APILocator.systemUser(), false); + + + } }