Skip to content

Commit

Permalink
Merge branch 'liferay:master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
liferay-frontend authored Aug 23, 2023
2 parents 1aa4dd7 + 113dd69 commit 158c334
Show file tree
Hide file tree
Showing 33 changed files with 1,055 additions and 325 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ public interface Endpoint {

public Scope getScope();

public Sort getSort();

public enum Scope {

COMPANY, GROUP
Expand Down Expand Up @@ -94,4 +96,10 @@ public interface Schema {

}

public interface Sort {

public String getODataSortString();

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,9 @@ private List<APIApplication.Endpoint> _getEndpoints(
companyId,
"apiApplicationToAPIEndpoints/externalReferenceCode eq '" +
apiApplicationExternalReferenceCode + "'",
Arrays.asList("apiEndpointToAPIFilters"), "L_API_ENDPOINT"),
Arrays.asList(
"apiEndpointToAPIFilters", "apiEndpointToAPISorts"),
"L_API_ENDPOINT"),
objectEntry -> {
Map<String, Object> properties = objectEntry.getProperties();

Expand Down Expand Up @@ -123,6 +125,11 @@ public Scope getScope() {
StringUtil.toUpperCase(listEntry.getKey()));
}

@Override
public APIApplication.Sort getSort() {
return _getSort(properties);
}

};
});
}
Expand Down Expand Up @@ -308,6 +315,30 @@ public List<APIApplication.Property> getProperties() {
});
}

private APIApplication.Sort _getSort(
Map<String, Object> endpointProperties) {

ObjectEntry[] objectEntries = (ObjectEntry[])endpointProperties.get(
"apiEndpointToAPISorts");

if (ArrayUtil.isEmpty(objectEntries)) {
return null;
}

ObjectEntry objectEntry = objectEntries[0];

Map<String, Object> properties = objectEntry.getProperties();

return new APIApplication.Sort() {

@Override
public String getODataSortString() {
return (String)properties.get("oDataSort");
}

};
}

private APIApplication _toApiApplication(
ObjectEntry apiApplicationObjectEntry, long companyId)
throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,10 @@
package com.liferay.headless.builder.internal.helper;

import com.liferay.headless.builder.application.APIApplication;
import com.liferay.headless.builder.internal.odata.entity.APISchemaEntityModel;
import com.liferay.headless.builder.internal.odata.filter.expression.APISchemaTranslatorExpressionVisitor;
import com.liferay.object.model.ObjectDefinition;
import com.liferay.object.rest.dto.v1_0.ObjectEntry;
import com.liferay.object.rest.filter.parser.ObjectDefinitionFilterParser;
import com.liferay.object.rest.odata.entity.v1_0.provider.EntityModelProvider;
import com.liferay.object.service.ObjectDefinitionLocalService;
import com.liferay.portal.kernel.util.HashMapBuilder;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.odata.entity.EntityModel;
import com.liferay.portal.odata.filter.expression.BinaryExpression;
import com.liferay.portal.odata.filter.expression.Expression;
import com.liferay.portal.odata.filter.expression.factory.ExpressionFactory;
import com.liferay.portal.vulcan.accept.language.AcceptLanguage;
import com.liferay.portal.vulcan.pagination.Page;
import com.liferay.portal.vulcan.pagination.Pagination;

Expand All @@ -42,8 +33,9 @@
public class EndpointHelper {

public Page<Map<String, Object>> getResponseEntityMapsPage(
long companyId, APIApplication.Endpoint endpoint,
String filterString, Pagination pagination, String scopeKey)
AcceptLanguage acceptLanguage, long companyId,
APIApplication.Endpoint endpoint, String filterString,
Pagination pagination, String scopeKey, String sortString)
throws Exception {

List<Map<String, Object>> responseEntityMaps = new ArrayList<>();
Expand All @@ -61,10 +53,13 @@ public Page<Map<String, Object>> getResponseEntityMapsPage(
Page<ObjectEntry> objectEntriesPage =
_objectEntryHelper.getObjectEntriesPage(
companyId,
_getFilterExpression(companyId, endpoint, filterString),
_filterExpressionHelper.getExpression(
companyId, endpoint, filterString),
ListUtil.fromCollection(relationshipsNames), pagination,
responseSchema.getMainObjectDefinitionExternalReferenceCode(),
scopeKey);
scopeKey,
_sortsHelper.getSorts(
acceptLanguage, companyId, endpoint, sortString));

for (ObjectEntry objectEntry : objectEntriesPage.getItems()) {
Map<String, Object> responseEntityMap = new HashMap<>();
Expand Down Expand Up @@ -100,61 +95,6 @@ public Page<Map<String, Object>> getResponseEntityMapsPage(
responseEntityMaps, pagination, objectEntriesPage.getTotalCount());
}

private Expression _getFilterExpression(
long companyId, APIApplication.Endpoint endpoint,
String filterString)
throws Exception {

APIApplication.Filter filter = endpoint.getFilter();

if ((filter == null) && (filterString == null)) {
return null;
}

APIApplication.Schema schema = endpoint.getResponseSchema();

ObjectDefinition objectDefinition =
_objectDefinitionLocalService.
getObjectDefinitionByExternalReferenceCode(
schema.getMainObjectDefinitionExternalReferenceCode(),
companyId);

EntityModel entityModel = _entityModelProvider.getEntityModel(
objectDefinition);

Expression endpointFilterExpression = null;

if (filter != null) {
endpointFilterExpression = _objectDefinitionFilterParser.parse(
entityModel, filter.getODataFilterString(), objectDefinition);
}

Expression requestFilterExpression = null;

if (filterString != null) {
EntityModel apiSchemaEntityModel = new APISchemaEntityModel(
entityModel, endpoint.getResponseSchema());

Expression expression = _objectDefinitionFilterParser.parse(
apiSchemaEntityModel, filterString, objectDefinition);

requestFilterExpression = expression.accept(
new APISchemaTranslatorExpressionVisitor(
apiSchemaEntityModel, _expressionFactory));
}

if (endpointFilterExpression == null) {
return requestFilterExpression;
}
else if (requestFilterExpression == null) {
return endpointFilterExpression;
}

return _expressionFactory.createBinaryExpression(
endpointFilterExpression, BinaryExpression.Operation.AND,
requestFilterExpression);
}

private Map<String, Object> _getObjectEntryProperties(
ObjectEntry objectEntry) {

Expand Down Expand Up @@ -204,18 +144,12 @@ private Object _getRelatedObjectValue(
}

@Reference
private EntityModelProvider _entityModelProvider;
private FilterExpressionHelper _filterExpressionHelper;

@Reference
private ExpressionFactory _expressionFactory;

@Reference
private ObjectDefinitionFilterParser _objectDefinitionFilterParser;

@Reference
private ObjectDefinitionLocalService _objectDefinitionLocalService;
private ObjectEntryHelper _objectEntryHelper;

@Reference
private ObjectEntryHelper _objectEntryHelper;
private SortsHelper _sortsHelper;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/**
* SPDX-FileCopyrightText: (c) 2023 Liferay, Inc. https://liferay.com
* SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
*/

package com.liferay.headless.builder.internal.helper;

import com.liferay.headless.builder.application.APIApplication;
import com.liferay.headless.builder.internal.odata.entity.APISchemaEntityModel;
import com.liferay.headless.builder.internal.odata.filter.expression.APISchemaTranslatorExpressionVisitor;
import com.liferay.object.model.ObjectDefinition;
import com.liferay.object.rest.filter.parser.ObjectDefinitionFilterParser;
import com.liferay.object.rest.odata.entity.v1_0.provider.EntityModelProvider;
import com.liferay.object.service.ObjectDefinitionLocalService;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.odata.entity.EntityModel;
import com.liferay.portal.odata.filter.InvalidFilterException;
import com.liferay.portal.odata.filter.expression.BinaryExpression;
import com.liferay.portal.odata.filter.expression.Expression;
import com.liferay.portal.odata.filter.expression.ExpressionVisitException;
import com.liferay.portal.odata.filter.expression.factory.ExpressionFactory;

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

/**
* @author Luis Miguel Barcos
*/
@Component(service = FilterExpressionHelper.class)
public class FilterExpressionHelper {

public Expression getExpression(
long companyId, APIApplication.Endpoint endpoint,
String filterString)
throws PortalException {

APIApplication.Filter filter = endpoint.getFilter();

if ((filter == null) && Validator.isNull(filterString)) {
return null;
}

Expression endpointFilterExpression = null;

APIApplication.Schema schema = endpoint.getResponseSchema();

String objectDefinitionExternalReferenceCode =
schema.getMainObjectDefinitionExternalReferenceCode();

ObjectDefinition objectDefinition =
_objectDefinitionLocalService.
getObjectDefinitionByExternalReferenceCode(
objectDefinitionExternalReferenceCode, companyId);

EntityModel entityModel = _entityModelProvider.getEntityModel(
objectDefinition);

if (filter != null) {
endpointFilterExpression = _objectDefinitionFilterParser.parse(
entityModel, filter.getODataFilterString(), objectDefinition);
}

Expression requestFilterExpression = null;

if (Validator.isNotNull(filterString)) {
EntityModel apiSchemaEntityModel = new APISchemaEntityModel(
entityModel, endpoint.getResponseSchema());

Expression expression = _objectDefinitionFilterParser.parse(
apiSchemaEntityModel, filterString, objectDefinition);

try {
requestFilterExpression = expression.accept(
new APISchemaTranslatorExpressionVisitor(
apiSchemaEntityModel, _expressionFactory));
}
catch (ExpressionVisitException expressionVisitException) {
throw new InvalidFilterException(
expressionVisitException.getMessage(),
expressionVisitException);
}
}

if (endpointFilterExpression == null) {
return requestFilterExpression;
}
else if (requestFilterExpression == null) {
return endpointFilterExpression;
}

return _expressionFactory.createBinaryExpression(
endpointFilterExpression, BinaryExpression.Operation.AND,
requestFilterExpression);
}

@Reference
private EntityModelProvider _entityModelProvider;

@Reference
private ExpressionFactory _expressionFactory;

@Reference
private ObjectDefinitionFilterParser _objectDefinitionFilterParser;

@Reference
private ObjectDefinitionLocalService _objectDefinitionLocalService;

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import com.liferay.object.service.ObjectRelationshipLocalService;
import com.liferay.petra.function.UnsafeSupplier;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.search.Sort;
import com.liferay.portal.kernel.security.permission.PermissionCheckerFactory;
import com.liferay.portal.kernel.security.permission.PermissionThreadLocal;
import com.liferay.portal.kernel.service.UserLocalService;
Expand Down Expand Up @@ -74,7 +75,8 @@ public List<ObjectEntry> getObjectEntries(
public Page<ObjectEntry> getObjectEntriesPage(
long companyId, Expression filterExpression,
List<String> nestedFields, Pagination pagination,
String objectDefinitionExternalReferenceCode, String scopeKey)
String objectDefinitionExternalReferenceCode, String scopeKey,
Sort[] sorts)
throws Exception {

ObjectDefinition objectDefinition =
Expand All @@ -100,7 +102,7 @@ public Page<ObjectEntry> getObjectEntriesPage(
return defaultObjectEntryManager.getObjectEntries(
companyId, objectDefinition, scopeKey, null,
_getDefaultDTOConverterContext(objectDefinition),
filterExpression, pagination, null, null);
filterExpression, pagination, null, sorts);
});
}

Expand All @@ -122,7 +124,7 @@ public Page<ObjectEntry> getObjectEntriesPage(
companyId,
_objectDefinitionFilterParser.parse(filterString, objectDefinition),
nestedFields, pagination, objectDefinitionExternalReferenceCode,
null);
null, null);
}

public ObjectEntry getObjectEntry(
Expand Down
Loading

0 comments on commit 158c334

Please sign in to comment.