From 3f43dd9b591d716a0d232b176488fe6cceab2393 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Thu, 26 Feb 2026 13:40:10 +0200 Subject: [PATCH] openapi improvements --- .../server/config/SwaggerConfiguration.java | 5 +++- .../common/data/ai/dto/TbChatRequest.java | 24 +------------------ .../data/ai/model/chat/AiChatModelConfig.java | 2 -- ...entsBasedCalculatedFieldConfiguration.java | 1 - .../BaseCalculatedFieldConfiguration.java | 2 +- ...sionBasedCalculatedFieldConfiguration.java | 3 --- .../data/exception/ThingsboardErrorCode.java | 2 -- .../config/SmppSmsProviderConfiguration.java | 3 +-- .../common/data/sync/ie/EntityExportData.java | 1 + .../transport/http/DeviceApiController.java | 3 --- 10 files changed, 8 insertions(+), 38 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java b/application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java index db9a7953af..e7a7711577 100644 --- a/application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java +++ b/application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java @@ -17,6 +17,7 @@ package org.thingsboard.server.config; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import io.swagger.v3.core.converter.AnnotatedType; import io.swagger.v3.core.converter.ModelConverter; import io.swagger.v3.core.converter.ModelConverters; @@ -649,9 +650,11 @@ public class SwaggerConfiguration { } private static Example errorExample(String summary, ThingsboardErrorResponse example) { + var node = (ObjectNode) JacksonUtil.valueToTree(example); + node.put("timestamp", 1609459200000L); return new Example() .summary(summary) - .value(example); + .value(node); } } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/ai/dto/TbChatRequest.java b/common/data/src/main/java/org/thingsboard/server/common/data/ai/dto/TbChatRequest.java index 5d7315f221..66706fdb1c 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/ai/dto/TbChatRequest.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/ai/dto/TbChatRequest.java @@ -20,20 +20,10 @@ import dev.langchain4j.data.message.Content; import dev.langchain4j.data.message.SystemMessage; import dev.langchain4j.data.message.UserMessage; import dev.langchain4j.model.chat.request.ChatRequest; -import io.swagger.v3.oas.annotations.media.DiscriminatorMapping; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import org.thingsboard.server.common.data.ai.model.chat.AiChatModelConfig; -import org.thingsboard.server.common.data.ai.model.chat.AmazonBedrockChatModelConfig; -import org.thingsboard.server.common.data.ai.model.chat.AnthropicChatModelConfig; -import org.thingsboard.server.common.data.ai.model.chat.AzureOpenAiChatModelConfig; -import org.thingsboard.server.common.data.ai.model.chat.GitHubModelsChatModelConfig; -import org.thingsboard.server.common.data.ai.model.chat.GoogleAiGeminiChatModelConfig; -import org.thingsboard.server.common.data.ai.model.chat.GoogleVertexAiGeminiChatModelConfig; -import org.thingsboard.server.common.data.ai.model.chat.MistralAiChatModelConfig; -import org.thingsboard.server.common.data.ai.model.chat.OllamaChatModelConfig; -import org.thingsboard.server.common.data.ai.model.chat.OpenAiChatModelConfig; import java.util.ArrayList; import java.util.List; @@ -58,19 +48,7 @@ public record TbChatRequest( @Schema( requiredMode = Schema.RequiredMode.REQUIRED, accessMode = Schema.AccessMode.READ_WRITE, - description = "Configuration of the AI chat model that should execute the request", - discriminatorProperty = "provider", - discriminatorMapping = { - @DiscriminatorMapping(value = "OPENAI", schema = OpenAiChatModelConfig.class), - @DiscriminatorMapping(value = "AZURE_OPENAI", schema = AzureOpenAiChatModelConfig.class), - @DiscriminatorMapping(value = "GOOGLE_AI_GEMINI", schema = GoogleAiGeminiChatModelConfig.class), - @DiscriminatorMapping(value = "GOOGLE_VERTEX_AI_GEMINI", schema = GoogleVertexAiGeminiChatModelConfig.class), - @DiscriminatorMapping(value = "MISTRAL_AI", schema = MistralAiChatModelConfig.class), - @DiscriminatorMapping(value = "ANTHROPIC", schema = AnthropicChatModelConfig.class), - @DiscriminatorMapping(value = "AMAZON_BEDROCK", schema = AmazonBedrockChatModelConfig.class), - @DiscriminatorMapping(value = "GITHUB_MODELS", schema = GitHubModelsChatModelConfig.class), - @DiscriminatorMapping(value = "OLLAMA", schema = OllamaChatModelConfig.class) - } + description = "Configuration of the AI chat model that should execute the request" ) @NotNull @Valid AiChatModelConfig chatModelConfig diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/ai/model/chat/AiChatModelConfig.java b/common/data/src/main/java/org/thingsboard/server/common/data/ai/model/chat/AiChatModelConfig.java index 1d3d03b021..5f7772ed8b 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/ai/model/chat/AiChatModelConfig.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/ai/model/chat/AiChatModelConfig.java @@ -17,11 +17,9 @@ package org.thingsboard.server.common.data.ai.model.chat; import com.fasterxml.jackson.annotation.JsonProperty; import dev.langchain4j.model.chat.ChatModel; -import io.swagger.v3.oas.annotations.media.Schema; import org.thingsboard.server.common.data.ai.model.AiModelConfig; import org.thingsboard.server.common.data.ai.model.AiModelType; -@Schema public sealed interface AiChatModelConfig> extends AiModelConfig permits OpenAiChatModelConfig, AzureOpenAiChatModelConfig, GoogleAiGeminiChatModelConfig, diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ArgumentsBasedCalculatedFieldConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ArgumentsBasedCalculatedFieldConfiguration.java index b9a52a1ded..852eefc4a4 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ArgumentsBasedCalculatedFieldConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ArgumentsBasedCalculatedFieldConfiguration.java @@ -27,7 +27,6 @@ import java.util.Set; import static java.util.stream.Collectors.toSet; -@Schema(allOf = CalculatedFieldConfiguration.class) public interface ArgumentsBasedCalculatedFieldConfiguration extends CalculatedFieldConfiguration { @Valid diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/BaseCalculatedFieldConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/BaseCalculatedFieldConfiguration.java index a60a98dcf1..0ba9db43cb 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/BaseCalculatedFieldConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/BaseCalculatedFieldConfiguration.java @@ -21,7 +21,7 @@ import lombok.Data; import java.util.Map; -@Schema(allOf = CalculatedFieldConfiguration.class) +@Schema @Data public abstract class BaseCalculatedFieldConfiguration implements ExpressionBasedCalculatedFieldConfiguration { diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ExpressionBasedCalculatedFieldConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ExpressionBasedCalculatedFieldConfiguration.java index 5887441c42..5b25d7ca11 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ExpressionBasedCalculatedFieldConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ExpressionBasedCalculatedFieldConfiguration.java @@ -15,9 +15,6 @@ */ package org.thingsboard.server.common.data.cf.configuration; -import io.swagger.v3.oas.annotations.media.Schema; - -@Schema(allOf = CalculatedFieldConfiguration.class) public interface ExpressionBasedCalculatedFieldConfiguration extends ArgumentsBasedCalculatedFieldConfiguration { String getExpression(); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/exception/ThingsboardErrorCode.java b/common/data/src/main/java/org/thingsboard/server/common/data/exception/ThingsboardErrorCode.java index 40b6a1aa17..9750e5edf3 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/exception/ThingsboardErrorCode.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/exception/ThingsboardErrorCode.java @@ -16,9 +16,7 @@ package org.thingsboard.server.common.data.exception; import com.fasterxml.jackson.annotation.JsonValue; -import io.swagger.v3.oas.annotations.media.Schema; -@Schema public enum ThingsboardErrorCode { GENERAL(2), diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/sms/config/SmppSmsProviderConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/sms/config/SmppSmsProviderConfiguration.java index 1b7c75f69f..e35f8da2e8 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/sms/config/SmppSmsProviderConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/sms/config/SmppSmsProviderConfiguration.java @@ -90,7 +90,7 @@ public class SmppSmsProviderConfiguration implements SmsProviderConfiguration { @Schema(description = "Address range", requiredMode = Schema.RequiredMode.NOT_REQUIRED) private String addressRange; - @Schema(allowableValues = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "13", "14"}, + @Schema(minimum = "0", maximum = "14", description = "0 - SMSC Default Alphabet (ASCII for short and long code and to GSM for toll-free, used as default)\n" + "1 - IA5 (ASCII for short and long code, Latin 9 for toll-free (ISO-8859-9))\n" + "2 - Octet Unspecified (8-bit binary)\n" + @@ -111,7 +111,6 @@ public class SmppSmsProviderConfiguration implements SmsProviderConfiguration { return SmsProviderType.SMPP; } - @Schema(enumAsRef = true) public enum SmppBindType { TX, RX, TRX } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/EntityExportData.java b/common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/EntityExportData.java index 3b8dcba162..8b600eb8e2 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/EntityExportData.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/EntityExportData.java @@ -75,6 +75,7 @@ public class EntityExportData> { @JsonProperty(index = 2) @JsonTbEntity + @Schema(implementation = ExportableEntity.class) private E entity; @JsonProperty(index = 1) @Schema diff --git a/common/transport/http/src/main/java/org/thingsboard/server/transport/http/DeviceApiController.java b/common/transport/http/src/main/java/org/thingsboard/server/transport/http/DeviceApiController.java index a6a8608672..9a7cfe43ff 100644 --- a/common/transport/http/src/main/java/org/thingsboard/server/transport/http/DeviceApiController.java +++ b/common/transport/http/src/main/java/org/thingsboard/server/transport/http/DeviceApiController.java @@ -20,11 +20,9 @@ import com.google.gson.JsonParseException; import com.google.gson.JsonParser; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -48,7 +46,6 @@ import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.DeviceTransportType; import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.TbTransportService; -import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.ota.OtaPackageType; import org.thingsboard.server.common.data.rpc.RpcStatus;