() {
+ public GrpcAttributeUniquenessType findValueByNumber(int number) {
+ return GrpcAttributeUniquenessType.forNumber(number);
+ }
+ };
+
+ public final com.google.protobuf.Descriptors.EnumValueDescriptor
+ getValueDescriptor() {
+ if (this == UNRECOGNIZED) {
+ throw new java.lang.IllegalStateException(
+ "Can't get the descriptor of an unrecognized enum value.");
+ }
+ return getDescriptor().getValues().get(ordinal());
+ }
+ public final com.google.protobuf.Descriptors.EnumDescriptor
+ getDescriptorForType() {
+ return getDescriptor();
+ }
+ public static final com.google.protobuf.Descriptors.EnumDescriptor
+ getDescriptor() {
+ return io.evitadb.externalApi.grpc.generated.GrpcEnums.getDescriptor().getEnumTypes().get(1);
+ }
+
+ private static final GrpcAttributeUniquenessType[] VALUES = values();
+
+ public static GrpcAttributeUniquenessType valueOf(
+ com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+ if (desc.getType() != getDescriptor()) {
+ throw new java.lang.IllegalArgumentException(
+ "EnumValueDescriptor is not for this type.");
+ }
+ if (desc.getIndex() == -1) {
+ return UNRECOGNIZED;
+ }
+ return VALUES[desc.getIndex()];
+ }
+
+ private final int value;
+
+ private GrpcAttributeUniquenessType(int value) {
+ this.value = value;
+ }
+
+ // @@protoc_insertion_point(enum_scope:io.evitadb.externalApi.grpc.generated.GrpcAttributeUniquenessType)
+}
+
diff --git a/evita_external_api/evita_external_api_grpc/shared/src/main/java/io/evitadb/externalApi/grpc/generated/GrpcGlobalAttributeUniquenessType.java b/evita_external_api/evita_external_api_grpc/shared/src/main/java/io/evitadb/externalApi/grpc/generated/GrpcGlobalAttributeUniquenessType.java
new file mode 100644
index 000000000..b3336ec70
--- /dev/null
+++ b/evita_external_api/evita_external_api_grpc/shared/src/main/java/io/evitadb/externalApi/grpc/generated/GrpcGlobalAttributeUniquenessType.java
@@ -0,0 +1,179 @@
+/*
+ *
+ * _ _ ____ ____
+ * _____ _(_) |_ __ _| _ \| __ )
+ * / _ \ \ / / | __/ _` | | | | _ \
+ * | __/\ V /| | || (_| | |_| | |_) |
+ * \___| \_/ |_|\__\__,_|____/|____/
+ *
+ * Copyright (c) 2023
+ *
+ * Licensed under the Business Source License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://github.com/FgForrest/evitaDB/blob/main/LICENSE
+ *
+ * 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.
+ */
+
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: GrpcEnums.proto
+
+package io.evitadb.externalApi.grpc.generated;
+
+/**
+ *
+ * This enum represents the uniqueness type of an {@link GlobalAttributeSchema}. It is used to determine whether
+ * the attribute value must be unique among all the entities using this {@link GlobalAttributeSchema} or whether it
+ * must be unique only among entities of the same locale.
+ *
+ *
+ * Protobuf enum {@code io.evitadb.externalApi.grpc.generated.GrpcGlobalAttributeUniquenessType}
+ */
+public enum GrpcGlobalAttributeUniquenessType
+ implements com.google.protobuf.ProtocolMessageEnum {
+ /**
+ *
+ * The attribute is not unique (default).
+ *
+ *
+ * NOT_GLOBALLY_UNIQUE = 0;
+ */
+ NOT_GLOBALLY_UNIQUE(0),
+ /**
+ *
+ * The attribute value (either localized or non-localized) must be unique among all values among all the entities
+ * using this {@link GlobalAttributeSchema} in the entire catalog.
+ *
+ *
+ * UNIQUE_WITHIN_CATALOG = 1;
+ */
+ UNIQUE_WITHIN_CATALOG(1),
+ /**
+ *
+ * The localized attribute value must be unique among all values of the same {@link Locale} among all the entities
+ * using this {@link GlobalAttributeSchema} in the entire catalog.
+ *
+ *
+ * UNIQUE_WITHIN_CATALOG_LOCALE = 2;
+ */
+ UNIQUE_WITHIN_CATALOG_LOCALE(2),
+ UNRECOGNIZED(-1),
+ ;
+
+ /**
+ *
+ * The attribute is not unique (default).
+ *
+ *
+ * NOT_GLOBALLY_UNIQUE = 0;
+ */
+ public static final int NOT_GLOBALLY_UNIQUE_VALUE = 0;
+ /**
+ *
+ * The attribute value (either localized or non-localized) must be unique among all values among all the entities
+ * using this {@link GlobalAttributeSchema} in the entire catalog.
+ *
+ *
+ * UNIQUE_WITHIN_CATALOG = 1;
+ */
+ public static final int UNIQUE_WITHIN_CATALOG_VALUE = 1;
+ /**
+ *
+ * The localized attribute value must be unique among all values of the same {@link Locale} among all the entities
+ * using this {@link GlobalAttributeSchema} in the entire catalog.
+ *
+ *
+ * UNIQUE_WITHIN_CATALOG_LOCALE = 2;
+ */
+ public static final int UNIQUE_WITHIN_CATALOG_LOCALE_VALUE = 2;
+
+
+ public final int getNumber() {
+ if (this == UNRECOGNIZED) {
+ throw new java.lang.IllegalArgumentException(
+ "Can't get the number of an unknown enum value.");
+ }
+ return value;
+ }
+
+ /**
+ * @param value The numeric wire value of the corresponding enum entry.
+ * @return The enum associated with the given numeric wire value.
+ * @deprecated Use {@link #forNumber(int)} instead.
+ */
+ @java.lang.Deprecated
+ public static GrpcGlobalAttributeUniquenessType valueOf(int value) {
+ return forNumber(value);
+ }
+
+ /**
+ * @param value The numeric wire value of the corresponding enum entry.
+ * @return The enum associated with the given numeric wire value.
+ */
+ public static GrpcGlobalAttributeUniquenessType forNumber(int value) {
+ switch (value) {
+ case 0: return NOT_GLOBALLY_UNIQUE;
+ case 1: return UNIQUE_WITHIN_CATALOG;
+ case 2: return UNIQUE_WITHIN_CATALOG_LOCALE;
+ default: return null;
+ }
+ }
+
+ public static com.google.protobuf.Internal.EnumLiteMap
+ internalGetValueMap() {
+ return internalValueMap;
+ }
+ private static final com.google.protobuf.Internal.EnumLiteMap<
+ GrpcGlobalAttributeUniquenessType> internalValueMap =
+ new com.google.protobuf.Internal.EnumLiteMap() {
+ public GrpcGlobalAttributeUniquenessType findValueByNumber(int number) {
+ return GrpcGlobalAttributeUniquenessType.forNumber(number);
+ }
+ };
+
+ public final com.google.protobuf.Descriptors.EnumValueDescriptor
+ getValueDescriptor() {
+ if (this == UNRECOGNIZED) {
+ throw new java.lang.IllegalStateException(
+ "Can't get the descriptor of an unrecognized enum value.");
+ }
+ return getDescriptor().getValues().get(ordinal());
+ }
+ public final com.google.protobuf.Descriptors.EnumDescriptor
+ getDescriptorForType() {
+ return getDescriptor();
+ }
+ public static final com.google.protobuf.Descriptors.EnumDescriptor
+ getDescriptor() {
+ return io.evitadb.externalApi.grpc.generated.GrpcEnums.getDescriptor().getEnumTypes().get(2);
+ }
+
+ private static final GrpcGlobalAttributeUniquenessType[] VALUES = values();
+
+ public static GrpcGlobalAttributeUniquenessType valueOf(
+ com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+ if (desc.getType() != getDescriptor()) {
+ throw new java.lang.IllegalArgumentException(
+ "EnumValueDescriptor is not for this type.");
+ }
+ if (desc.getIndex() == -1) {
+ return UNRECOGNIZED;
+ }
+ return VALUES[desc.getIndex()];
+ }
+
+ private final int value;
+
+ private GrpcGlobalAttributeUniquenessType(int value) {
+ this.value = value;
+ }
+
+ // @@protoc_insertion_point(enum_scope:io.evitadb.externalApi.grpc.generated.GrpcGlobalAttributeUniquenessType)
+}
+
diff --git a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/builder/GenericEntityObjectBuilder.java b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/builder/GenericEntityObjectBuilder.java
index 0b75f63d5..85437fd55 100644
--- a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/builder/GenericEntityObjectBuilder.java
+++ b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/builder/GenericEntityObjectBuilder.java
@@ -55,7 +55,7 @@ public void buildCommonTypes() {
@Nonnull
private OpenApiObject buildEntityObject() {
- final String objectName = EntityDescriptor.THIS_GLOBAL.name();
+ final String objectName = GenericEntityDescriptor.THIS.name();
// build specific entity object
final OpenApiObject.Builder entityObject = GenericEntityDescriptor.THIS
diff --git a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/builder/GenericFullResponseObjectBuilder.java b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/builder/GenericFullResponseObjectBuilder.java
index b8b8e638b..46c64d1cb 100644
--- a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/builder/GenericFullResponseObjectBuilder.java
+++ b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/builder/GenericFullResponseObjectBuilder.java
@@ -128,7 +128,7 @@ private OpenApiTypeReference buildRecordPageObject() {
.to(objectBuilderTransformer)
.property(DataChunkDescriptor.DATA
.to(propertyBuilderTransformer)
- .type(nonNull(arrayOf(typeRefTo(GenericEntityDescriptor.THIS_GLOBAL.name())))))
+ .type(nonNull(arrayOf(typeRefTo(GenericEntityDescriptor.THIS.name())))))
.property(DataChunkUnionDescriptor.DISCRIMINATOR
.to(propertyBuilderTransformer)
.type(nonNull(typeRefTo(GenericDataChunkUnionDescriptor.THIS.name()))))
@@ -143,7 +143,7 @@ private OpenApiTypeReference buildRecordStripObject() {
.to(objectBuilderTransformer)
.property(DataChunkDescriptor.DATA
.to(propertyBuilderTransformer)
- .type(nonNull(arrayOf(typeRefTo(GenericEntityDescriptor.THIS_GLOBAL.name())))))
+ .type(nonNull(arrayOf(typeRefTo(GenericEntityDescriptor.THIS.name())))))
.property(DataChunkUnionDescriptor.DISCRIMINATOR
.to(propertyBuilderTransformer)
.type(nonNull(typeRefTo(GenericDataChunkUnionDescriptor.THIS.name()))))
@@ -188,7 +188,7 @@ private OpenApiTypeReference buildFacetGroupStatisticsObject() {
.to(objectBuilderTransformer)
.property(FacetGroupStatisticsDescriptor.GROUP_ENTITY
.to(propertyBuilderTransformer)
- .type(typeRefTo(GenericEntityDescriptor.THIS_GLOBAL.name())))
+ .type(typeRefTo(GenericEntityDescriptor.THIS.name())))
.property(FacetGroupStatisticsDescriptor.FACET_STATISTICS
.to(propertyBuilderTransformer)
.type(nonNull(arrayOf(typeRefTo(GenericFacetStatisticsDescriptor.THIS.name())))))
@@ -203,7 +203,7 @@ private OpenApiTypeReference buildFacetStatisticsObject() {
.to(objectBuilderTransformer)
.property(FacetStatisticsDescriptor.FACET_ENTITY
.to(propertyBuilderTransformer)
- .type(typeRefTo(GenericEntityDescriptor.THIS_GLOBAL.name())))
+ .type(typeRefTo(GenericEntityDescriptor.THIS.name())))
.build();
return buildingContext.registerType(facetStatisticsObject);
@@ -225,7 +225,7 @@ private OpenApiTypeReference buildLevelInfoObject() {
.to(objectBuilderTransformer)
.property(LevelInfoDescriptor.ENTITY
.to(propertyBuilderTransformer)
- .type(nonNull(typeRefTo(GenericEntityDescriptor.THIS_GLOBAL.name()))))
+ .type(nonNull(typeRefTo(GenericEntityDescriptor.THIS.name()))))
.property(LevelInfoDescriptor.CHILDREN
.to(propertyBuilderTransformer)
.type(nonNull(arrayOf(typeRefTo(GenericLevelInfoDescriptor.THIS.name())))))
diff --git a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/model/entity/GenericEntityDescriptor.java b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/model/entity/GenericEntityDescriptor.java
index fea05ea0d..cdad49c5f 100644
--- a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/model/entity/GenericEntityDescriptor.java
+++ b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/model/entity/GenericEntityDescriptor.java
@@ -25,6 +25,7 @@
import io.evitadb.externalApi.api.catalog.dataApi.model.AttributesProviderDescriptor;
import io.evitadb.externalApi.api.catalog.dataApi.model.EntityDescriptor;
+import io.evitadb.externalApi.api.model.ObjectDescriptor;
import io.evitadb.externalApi.api.model.PropertyDescriptor;
import io.evitadb.externalApi.dataType.GenericObject;
import io.evitadb.externalApi.rest.api.catalog.dataApi.model.entity.RestEntityDescriptor;
@@ -54,4 +55,11 @@ public interface GenericEntityDescriptor extends RestEntityDescriptor {
""")
.type(nullable(GenericObject.class))
.build();
+
+ ObjectDescriptor THIS = ObjectDescriptor.extend(THIS_REFERENCE)
+ .name("Entity")
+ .description("""
+ Catalog-wise entity with only common data across all entity collections.
+ """)
+ .build();
}
diff --git a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/openApi/OpenApiLabApiEndpoint.java b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/openApi/OpenApiLabApiEndpoint.java
index 105536333..f086338cf 100644
--- a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/openApi/OpenApiLabApiEndpoint.java
+++ b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/openApi/OpenApiLabApiEndpoint.java
@@ -70,7 +70,7 @@ private OpenApiLabApiEndpoint(@Nonnull PathItem.HttpMethod method,
@Nonnull List parameters,
@Nullable OpenApiSimpleType requestBody,
@Nonnull OpenApiSimpleType successResponse,
- @Nonnull Function> handlerBuilder) {
+ @Nonnull Function> handlerBuilder) {
super(method, path, false, operationId, description, deprecationNotice, parameters, requestBody, successResponse, handlerBuilder);
}
@@ -84,7 +84,7 @@ public static Builder newLabApiEndpoint() {
@Nonnull
@Override
- public RestEndpointHandler, LabApiHandlingContext> toHandler(@Nonnull ObjectMapper objectMapper,
+ public RestEndpointHandler toHandler(@Nonnull ObjectMapper objectMapper,
@Nonnull Evita evita,
@Nonnull OpenAPI openApi,
@Nonnull Map>> enumMapping) {
@@ -111,7 +111,7 @@ public static class Builder {
@Nullable private OpenApiSimpleType requestBody;
@Nullable private OpenApiSimpleType successResponse;
- @Nullable private Function> handlerBuilder;
+ @Nullable private Function> handlerBuilder;
private Builder() {
this.parameters = new LinkedList<>();
@@ -218,7 +218,7 @@ public Builder successResponse(@Nonnull OpenApiSimpleType successResponseType) {
* Sets handler builder.
*/
@Nonnull
- public Builder handler(@Nonnull Function> handlerBuilder) {
+ public Builder handler(@Nonnull Function> handlerBuilder) {
this.handlerBuilder = handlerBuilder;
return this;
}
diff --git a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/CatalogSchemaHandler.java b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/CatalogSchemaHandler.java
index dd048bafe..82b279daa 100644
--- a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/CatalogSchemaHandler.java
+++ b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/CatalogSchemaHandler.java
@@ -26,12 +26,13 @@
import io.evitadb.api.CatalogContract;
import io.evitadb.api.EvitaSessionContract;
import io.evitadb.api.requestResponse.schema.CatalogSchemaContract;
-import io.evitadb.externalApi.api.ExternalApiNamingConventions;
import io.evitadb.externalApi.lab.api.model.CatalogsHeaderDescriptor;
import io.evitadb.externalApi.rest.api.catalog.schemaApi.resolver.serializer.CatalogSchemaJsonSerializer;
+import io.evitadb.externalApi.rest.exception.RestInternalError;
import io.evitadb.externalApi.rest.exception.RestInvalidArgumentException;
import io.evitadb.externalApi.rest.io.JsonRestHandler;
import io.evitadb.externalApi.rest.io.RestEndpointExchange;
+import io.evitadb.utils.Assert;
import lombok.extern.slf4j.Slf4j;
import javax.annotation.Nonnull;
@@ -46,7 +47,7 @@
* @author Lukáš Hornych, FG Forrest a.s. (c) 2023
*/
@Slf4j
-public abstract class CatalogSchemaHandler extends JsonRestHandler {
+public abstract class CatalogSchemaHandler extends JsonRestHandler {
@Nonnull
private final CatalogSchemaJsonSerializer catalogSchemaJsonSerializer;
@@ -73,7 +74,11 @@ protected Optional createSession(@Nonnull RestEndpointExch
.orElseThrow(() -> new RestInvalidArgumentException("Catalog `" + catalogName + "` does not exist."));
if (modifiesData()) {
- return Optional.of(restApiHandlingContext.getEvita().createReadWriteSession(catalog.getName()));
+ final EvitaSessionContract session = restApiHandlingContext.getEvita().createReadWriteSession(catalog.getName());
+ if (catalog.supportsTransaction()) {
+ session.openTransaction();
+ }
+ return Optional.of(session);
} else {
return Optional.of(restApiHandlingContext.getEvita().createReadOnlySession(catalog.getName()));
}
@@ -81,9 +86,13 @@ protected Optional createSession(@Nonnull RestEndpointExch
@Nonnull
@Override
- protected Object convertResultIntoSerializableObject(@Nonnull RestEndpointExchange exchange, @Nonnull CatalogSchemaContract catalogSchema) {
+ protected Object convertResultIntoSerializableObject(@Nonnull RestEndpointExchange exchange, @Nonnull Object catalogSchema) {
+ Assert.isPremiseValid(
+ catalogSchema instanceof CatalogSchemaContract,
+ () -> new RestInternalError("Expected catalog schema, but got `" + catalogSchema.getClass().getName() + "`.")
+ );
return catalogSchemaJsonSerializer.serialize(
- catalogSchema,
+ (CatalogSchemaContract) catalogSchema,
exchange.session()::getEntitySchemaOrThrow,
exchange.session().getAllEntityTypes()
);
diff --git a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/GetCatalogSchemaHandler.java b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/GetCatalogSchemaHandler.java
index 5157bdbf9..ae11bffea 100644
--- a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/GetCatalogSchemaHandler.java
+++ b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/GetCatalogSchemaHandler.java
@@ -47,8 +47,8 @@ public GetCatalogSchemaHandler(@Nonnull LabApiHandlingContext labApiHandlingCont
@Override
@Nonnull
- protected EndpointResponse doHandleRequest(@Nonnull RestEndpointExchange exchange) {
- return new SuccessEndpointResponse<>(exchange.session().getCatalogSchema());
+ protected EndpointResponse doHandleRequest(@Nonnull RestEndpointExchange exchange) {
+ return new SuccessEndpointResponse(convertResultIntoSerializableObject(exchange, exchange.session().getCatalogSchema()));
}
@Nonnull
diff --git a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/ListCatalogsHandler.java b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/ListCatalogsHandler.java
index c2c8673a0..2572058fd 100644
--- a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/ListCatalogsHandler.java
+++ b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/ListCatalogsHandler.java
@@ -28,8 +28,10 @@
import io.evitadb.externalApi.http.EndpointResponse;
import io.evitadb.externalApi.http.SuccessEndpointResponse;
import io.evitadb.externalApi.rest.api.system.resolver.serializer.CatalogJsonSerializer;
+import io.evitadb.externalApi.rest.exception.RestInternalError;
import io.evitadb.externalApi.rest.io.JsonRestHandler;
import io.evitadb.externalApi.rest.io.RestEndpointExchange;
+import io.evitadb.utils.Assert;
import io.undertow.util.Methods;
import javax.annotation.Nonnull;
@@ -42,7 +44,7 @@
*
* @author Lukáš Hornych, FG Forrest a.s. (c) 2023
*/
-public class ListCatalogsHandler extends JsonRestHandler, LabApiHandlingContext> {
+public class ListCatalogsHandler extends JsonRestHandler {
@Nonnull
private final CatalogJsonSerializer catalogJsonSerializer;
@@ -54,9 +56,9 @@ public ListCatalogsHandler(@Nonnull LabApiHandlingContext restApiHandlingContext
@Nonnull
@Override
- protected EndpointResponse> doHandleRequest(@Nonnull RestEndpointExchange exchange) {
+ protected EndpointResponse doHandleRequest(@Nonnull RestEndpointExchange exchange) {
final Collection catalogs = restApiHandlingContext.getEvita().getCatalogs();
- return new SuccessEndpointResponse<>(catalogs);
+ return new SuccessEndpointResponse(convertResultIntoSerializableObject(exchange, catalogs));
}
@Nonnull
@@ -73,7 +75,12 @@ public LinkedHashSet getSupportedResponseContentTypes() {
@Nonnull
@Override
- protected JsonNode convertResultIntoSerializableObject(@Nonnull RestEndpointExchange exchange, @Nonnull Collection catalogs) {
- return catalogJsonSerializer.serialize(catalogs);
+ protected JsonNode convertResultIntoSerializableObject(@Nonnull RestEndpointExchange exchange, @Nonnull Object catalogs) {
+ Assert.isPremiseValid(
+ catalogs instanceof Collection,
+ () -> new RestInternalError("Expected collection of catalogs, but got `" + catalogs.getClass().getName() + "`.")
+ );
+ //noinspection unchecked
+ return catalogJsonSerializer.serialize((Collection) catalogs);
}
}
diff --git a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/LivenessHandler.java b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/LivenessHandler.java
index 9a468118f..1fd5a2ebd 100644
--- a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/LivenessHandler.java
+++ b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/LivenessHandler.java
@@ -39,7 +39,7 @@
*
* @author Lukáš Hornych, FG Forrest a.s. (c) 2023
*/
-public class LivenessHandler extends JsonRestHandler {
+public class LivenessHandler extends JsonRestHandler {
public LivenessHandler(@Nonnull LabApiHandlingContext labApiHandlingContext) {
super(labApiHandlingContext);
@@ -47,8 +47,8 @@ public LivenessHandler(@Nonnull LabApiHandlingContext labApiHandlingContext) {
@Nonnull
@Override
- protected EndpointResponse doHandleRequest(@Nonnull RestEndpointExchange exchange) {
- return new SuccessEndpointResponse<>(new LivenessDto(true));
+ protected EndpointResponse doHandleRequest(@Nonnull RestEndpointExchange exchange) {
+ return new SuccessEndpointResponse(convertResultIntoSerializableObject(exchange, new LivenessDto(true)));
}
@Nonnull
diff --git a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/QueryEntitiesHandler.java b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/QueryEntitiesHandler.java
index ac67ae813..eac581a52 100644
--- a/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/QueryEntitiesHandler.java
+++ b/evita_external_api/evita_external_api_lab/src/main/java/io/evitadb/externalApi/lab/api/resolver/endpoint/QueryEntitiesHandler.java
@@ -47,6 +47,7 @@
import io.evitadb.externalApi.rest.exception.RestInternalError;
import io.evitadb.externalApi.rest.io.JsonRestHandler;
import io.evitadb.externalApi.rest.io.RestEndpointExchange;
+import io.evitadb.utils.Assert;
import io.evitadb.utils.StringUtils;
import io.undertow.util.Methods;
import lombok.extern.slf4j.Slf4j;
@@ -64,7 +65,7 @@
* @author Lukáš Hornych, FG Forrest a.s. (c) 2023
*/
@Slf4j
-public class QueryEntitiesHandler extends JsonRestHandler, LabApiHandlingContext> {
+public class QueryEntitiesHandler extends JsonRestHandler {
@Nonnull private final QueryParser queryParser;
@Nonnull private final GenericEntityJsonSerializer entityJsonSerializer;
@@ -94,12 +95,12 @@ protected Optional createSession(@Nonnull RestEndpointExch
@Nonnull
@Override
- protected EndpointResponse> doHandleRequest(@Nonnull RestEndpointExchange exchange) {
+ protected EndpointResponse doHandleRequest(@Nonnull RestEndpointExchange exchange) {
final Query query = resolveQuery(exchange);
log.debug("Generated evitaDB query for entity query is `{}`.", query);
final EvitaResponse response = exchange.session().query(query, EntityClassifier.class);
- return new SuccessEndpointResponse<>(response);
+ return new SuccessEndpointResponse(convertResultIntoSerializableObject(exchange, response));
}
@Nonnull
@@ -130,17 +131,23 @@ protected Query resolveQuery(@Nonnull RestEndpointExchange exchange) {
@Nonnull
@Override
- protected Object convertResultIntoSerializableObject(@Nonnull RestEndpointExchange exchange, @Nonnull EvitaResponse result) {
+ protected Object convertResultIntoSerializableObject(@Nonnull RestEndpointExchange exchange, @Nonnull Object result) {
+ Assert.isPremiseValid(
+ result instanceof EvitaResponse,
+ () -> new RestInternalError("Expected evitaDB response, but got `" + result.getClass().getName() + "`.")
+ );
+ //noinspection unchecked
+ final EvitaResponse evitaResponse = (EvitaResponse) result;
final QueryResponseBuilder queryResponseBuilder = QueryResponse.builder()
- .recordPage(serializeRecordPage(result));
- if (!result.getExtraResults().isEmpty()) {
+ .recordPage(serializeRecordPage(evitaResponse));
+ if (!evitaResponse.getExtraResults().isEmpty()) {
queryResponseBuilder
.extraResults(
extraResultsJsonSerializer.serialize(
- result.getExtraResults(),
+ evitaResponse.getExtraResults(),
exchange.session()
- .getEntitySchema(result.getSourceQuery().getCollection().getEntityType())
- .orElseThrow(() -> new RestInternalError("No entity schema found for entity type `" + result.getSourceQuery().getCollection().getEntityType() + "`."))
+ .getEntitySchema(evitaResponse.getSourceQuery().getCollection().getEntityType())
+ .orElseThrow(() -> new RestInternalError("No entity schema found for entity type `" + evitaResponse.getSourceQuery().getCollection().getEntityType() + "`."))
)
);
}
diff --git a/evita_external_api/evita_external_api_rest/src/main/java/io/evitadb/externalApi/rest/RestManager.java b/evita_external_api/evita_external_api_rest/src/main/java/io/evitadb/externalApi/rest/RestManager.java
index 58661d1ed..c1d14fc4f 100644
--- a/evita_external_api/evita_external_api_rest/src/main/java/io/evitadb/externalApi/rest/RestManager.java
+++ b/evita_external_api/evita_external_api_rest/src/main/java/io/evitadb/externalApi/rest/RestManager.java
@@ -201,7 +201,7 @@ private void registerSystemRestEndpoint(@Nonnull Rest.Endpoint endpoint) {
/**
* Registers endpoints into router. Also CORS endpoint is created automatically for this endpoint.
*/
- private void registerRestEndpoint(@Nonnull HttpString method, @Nonnull UriPath path, @Nonnull RestEndpointHandler, ?> handler) {
+ private void registerRestEndpoint(@Nonnull HttpString method, @Nonnull UriPath path, @Nonnull RestEndpointHandler> handler) {
final CorsEndpoint corsEndpoint = corsEndpoints.computeIfAbsent(path, p -> new CorsEndpoint(restConfig));
corsEndpoint.addMetadataFromHandler(handler);
diff --git a/evita_external_api/evita_external_api_rest/src/main/java/io/evitadb/externalApi/rest/api/Rest.java b/evita_external_api/evita_external_api_rest/src/main/java/io/evitadb/externalApi/rest/api/Rest.java
index f79dc3f5f..89aa8af3a 100644
--- a/evita_external_api/evita_external_api_rest/src/main/java/io/evitadb/externalApi/rest/api/Rest.java
+++ b/evita_external_api/evita_external_api_rest/src/main/java/io/evitadb/externalApi/rest/api/Rest.java
@@ -40,5 +40,5 @@ public record Rest(@Nonnull OpenAPI openApi, @Nonnull List endpoints)
public record Endpoint(@Nonnull UriPath path,
@Nonnull HttpString method,
- @Nonnull RestEndpointHandler, ?> handler) {}
+ @Nonnull RestEndpointHandler> handler) {}
}
diff --git a/evita_external_api/evita_external_api_rest/src/main/java/io/evitadb/externalApi/rest/api/catalog/dataApi/resolver/endpoint/CollectionsHandler.java b/evita_external_api/evita_external_api_rest/src/main/java/io/evitadb/externalApi/rest/api/catalog/dataApi/resolver/endpoint/CollectionsHandler.java
index 7bb6e9eae..478ecd67a 100644
--- a/evita_external_api/evita_external_api_rest/src/main/java/io/evitadb/externalApi/rest/api/catalog/dataApi/resolver/endpoint/CollectionsHandler.java
+++ b/evita_external_api/evita_external_api_rest/src/main/java/io/evitadb/externalApi/rest/api/catalog/dataApi/resolver/endpoint/CollectionsHandler.java
@@ -43,7 +43,7 @@
*
* @author Martin Veska (veska@fg.cz), FG Forrest a.s. (c) 2022
*/
-public class CollectionsHandler extends JsonRestHandler, CatalogRestHandlingContext> {
+public class CollectionsHandler extends JsonRestHandler {
public CollectionsHandler(@Nonnull CatalogRestHandlingContext restHandlingContext) {
super(restHandlingContext);
@@ -51,7 +51,7 @@ public CollectionsHandler(@Nonnull CatalogRestHandlingContext restHandlingContex
@Nonnull
@Override
- protected EndpointResponse> doHandleRequest(@Nonnull RestEndpointExchange exchange) {
+ protected EndpointResponse doHandleRequest(@Nonnull RestEndpointExchange exchange) {
final Map