Browse Source

fixed some TB models for correct open-api json schema

pull/14929/head
dashevchenko 4 months ago
parent
commit
bbdad8a0ff
  1. 148
      application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java
  2. 9
      application/src/main/java/org/thingsboard/server/controller/AiModelController.java
  3. 11
      application/src/main/java/org/thingsboard/server/controller/EntitiesVersionControlController.java
  4. 6
      application/src/main/java/org/thingsboard/server/controller/EventController.java
  5. 37
      application/src/main/java/org/thingsboard/server/controller/TelemetryController.java
  6. 61
      application/src/main/java/org/thingsboard/server/controller/TwoFactorAuthConfigController.java
  7. 4
      common/data/src/main/java/org/thingsboard/server/common/data/TbResource.java
  8. 14
      common/data/src/main/java/org/thingsboard/server/common/data/TbResourceInfo.java
  9. 2
      common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedField.java
  10. 2
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/Argument.java
  11. 3
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ArgumentType.java
  12. 2
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/BaseCalculatedFieldConfiguration.java
  13. 26
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/CalculatedFieldConfiguration.java
  14. 2
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ReferencedEntityKey.java
  15. 6
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ScriptCalculatedFieldConfiguration.java
  16. 6
      common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/SimpleCalculatedFieldConfiguration.java
  17. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/CoapDeviceTransportConfiguration.java
  18. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/DefaultDeviceTransportConfiguration.java
  19. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/DeviceTransportConfiguration.java
  20. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/Lwm2mDeviceTransportConfiguration.java
  21. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/MqttDeviceTransportConfiguration.java
  22. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/SnmpDeviceTransportConfiguration.java
  23. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/CoapDeviceProfileTransportConfiguration.java
  24. 4
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/DefaultCoapDeviceTypeConfiguration.java
  25. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/EfentoCoapDeviceTypeConfiguration.java
  26. 5
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/JsonTransportPayloadConfiguration.java
  27. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/MqttDeviceProfileTransportConfiguration.java
  28. 5
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/ProtoTransportPayloadConfiguration.java
  29. 1
      common/data/src/main/java/org/thingsboard/server/common/data/id/NotificationTargetId.java
  30. 1
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/AbstractMobilePage.java
  31. 2
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/CustomMobilePage.java
  32. 2
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/DashboardPage.java
  33. 2
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/DefaultMobilePage.java
  34. 4
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/MobileLayoutConfig.java
  35. 2
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/WebViewPage.java
  36. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/MobileAppNotificationDeliveryMethodConfig.java
  37. 10
      common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/NotificationDeliveryMethodConfig.java
  38. 2
      common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/NotificationSettings.java
  39. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/SlackNotificationDeliveryMethodConfig.java
  40. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/MicrosoftTeamsNotificationTargetConfig.java
  41. 2
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/NotificationTarget.java
  42. 11
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/NotificationTargetConfig.java
  43. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/AffectedTenantAdministratorsFilter.java
  44. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/AffectedUserFilter.java
  45. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/AllUsersFilter.java
  46. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/CustomerUsersFilter.java
  47. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/OriginatorEntityOwnerUsersFilter.java
  48. 4
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/PlatformUsersNotificationTargetConfig.java
  49. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/SystemAdministratorsFilter.java
  50. 6
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/TenantAdministratorsFilter.java
  51. 5
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UserListFilter.java
  52. 16
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UsersFilter.java
  53. 2
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/slack/SlackConversation.java
  54. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/slack/SlackNotificationTargetConfig.java
  55. 2
      common/data/src/main/java/org/thingsboard/server/common/data/query/BooleanFilterPredicate.java
  56. 4
      common/data/src/main/java/org/thingsboard/server/common/data/query/ComplexFilterPredicate.java
  57. 2
      common/data/src/main/java/org/thingsboard/server/common/data/query/DynamicValue.java
  58. 2
      common/data/src/main/java/org/thingsboard/server/common/data/query/FilterPredicateValue.java
  59. 2
      common/data/src/main/java/org/thingsboard/server/common/data/query/NumericFilterPredicate.java
  60. 2
      common/data/src/main/java/org/thingsboard/server/common/data/query/StringFilterPredicate.java
  61. 4
      common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/PlatformTwoFaSettings.java
  62. 3
      common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/account/BackupCodeTwoFaAccountConfig.java
  63. 3
      common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/account/EmailTwoFaAccountConfig.java
  64. 2
      common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/account/OtpBasedTwoFaAccountConfig.java
  65. 3
      common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/account/SmsTwoFaAccountConfig.java
  66. 3
      common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/account/TotpTwoFaAccountConfig.java
  67. 3
      common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/provider/BackupCodeTwoFaProviderConfig.java
  68. 3
      common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/provider/EmailTwoFaProviderConfig.java
  69. 2
      common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/provider/OtpBasedTwoFaProviderConfig.java
  70. 3
      common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/provider/SmsTwoFaProviderConfig.java
  71. 3
      common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/provider/TotpTwoFaProviderConfig.java
  72. 16
      common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/provider/TwoFaProviderConfig.java
  73. 2
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/DeviceExportData.java
  74. 2
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/EntityExportData.java
  75. 2
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/OtaPackageExportData.java
  76. 2
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/RuleChainExportData.java
  77. 2
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/WidgetTypeExportData.java
  78. 5
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/WidgetsBundleExportData.java
  79. 4
      common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/EntityDataDiff.java
  80. 3
      common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/create/ComplexVersionCreateRequest.java
  81. 3
      common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/create/SingleEntityVersionCreateRequest.java
  82. 2
      common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/create/VersionCreateConfig.java
  83. 2
      common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/load/EntityTypeVersionLoadConfig.java
  84. 3
      common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/load/EntityTypeVersionLoadRequest.java
  85. 3
      common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/load/SingleEntityVersionLoadRequest.java
  86. 2
      common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/load/VersionLoadConfig.java

148
application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java

@ -351,7 +351,6 @@ public class SwaggerConfiguration {
sortedPaths.setExtensions(paths.getExtensions());
openAPI.setPaths(sortedPaths);
// Fix schemas with additionalProperties to ensure they have type: object
if (openAPI.getComponents() != null && openAPI.getComponents().getSchemas() != null) {
Map<String, Schema> schemas = openAPI.getComponents().getSchemas();
@ -363,58 +362,14 @@ public class SwaggerConfiguration {
}
});
// Fix polymorphic maps: replace oneOf in additionalProperties with base type reference
// Fix polymorphic properties: replace inline oneOf with base type $ref
schemas.values().forEach(schema -> {
if (schema.getProperties() != null) {
schema.getProperties().forEach((propName, propSchema) -> {
if (propSchema instanceof Schema) {
Schema<?> prop = (Schema<?>) propSchema;
// Check if additionalProperties has oneOf (polymorphic map values)
if (prop.getAdditionalProperties() instanceof Schema) {
Schema<?> additionalProps = (Schema<?>) prop.getAdditionalProperties();
if (additionalProps.getOneOf() != null && !additionalProps.getOneOf().isEmpty()) {
// Find the base type from discriminator mappings
String baseType = findBaseTypeForOneOf(schemas, additionalProps.getOneOf());
if (baseType != null) {
// Replace oneOf with direct reference to base type
Schema<?> refSchema = new Schema<>();
refSchema.set$ref("#/components/schemas/" + baseType);
prop.setAdditionalProperties(refSchema);
log.debug("Replaced oneOf with $ref to {} in property {}", baseType, propName);
}
}
}
}
});
}
});
schemas.values().forEach(schema -> {
if (schema.getProperties() != null) {
schema.getProperties().forEach((propName, propSchema) -> {
if (propSchema instanceof Schema) {
Schema<?> prop = (Schema<?>) propSchema;
// If property has oneOf, try to find the base discriminated type
if (prop.getOneOf() != null && !prop.getOneOf().isEmpty()) {
String baseType = findBaseTypeForOneOf(schemas, prop.getOneOf());
if (baseType != null) {
// Replace oneOf with reference to base type
Schema<?> refSchema = new Schema<>();
refSchema.set$ref("#/components/schemas/" + baseType);
if (prop.getDescription() != null) {
refSchema.setDescription(prop.getDescription());
}
schema.getProperties().put(propName, refSchema);
log.debug("Replaced oneOf with $ref to {} in property {}", baseType, propName);
}
}
}
});
replaceInlineOneOfProperties(schema, schemas);
if (schema.getAllOf() != null) {
List<Schema> allOf = schema.getAllOf();
for (Schema allOfElement : allOf) {
replaceInlineOneOfProperties(allOfElement, schemas);
}
}
});
}
@ -424,35 +379,86 @@ public class SwaggerConfiguration {
};
}
// Add this helper method
private String findBaseTypeForOneOf(Map<String, Schema> schemas, List<Schema> oneOfSchemas) {
if (oneOfSchemas.isEmpty()) {
return null;
}
// Extract the first subtype name from oneOf
String firstRef = oneOfSchemas.get(0).get$ref();
if (firstRef == null) {
return null;
for (Schema oneOfSchema : oneOfSchemas) {
String ref = oneOfSchema.get$ref();
if (ref == null) {
continue;
}
String refName = ref.substring(ref.lastIndexOf('/') + 1);
// Check if this entry is itself a base type with discriminator
Schema<?> candidate = schemas.get(refName);
if (candidate != null && candidate.getDiscriminator() != null
&& candidate.getDiscriminator().getMapping() != null) {
return refName;
}
// Check if this subtype is in another schema's discriminator mapping
String baseType = schemas.entrySet().stream()
.filter(entry -> {
Schema<?> schema = entry.getValue();
if (schema.getDiscriminator() != null && schema.getDiscriminator().getMapping() != null) {
return schema.getDiscriminator().getMapping().values().stream()
.anyMatch(r -> r.endsWith("/" + refName));
}
return false;
})
.map(Map.Entry::getKey)
.findFirst()
.orElse(null);
if (baseType != null) {
return baseType;
}
}
return null;
}
String subtypeName = firstRef.substring(firstRef.lastIndexOf('/') + 1);
// Find which schema has this subtype in its discriminator mapping
return schemas.entrySet().stream()
.filter(entry -> {
Schema<?> schema = entry.getValue();
if (schema.getDiscriminator() != null && schema.getDiscriminator().getMapping() != null) {
return schema.getDiscriminator().getMapping().values().stream()
.anyMatch(ref -> ref.endsWith("/" + subtypeName));
@SuppressWarnings("unchecked")
private void replaceInlineOneOfProperties(Schema<?> schema, Map<String, Schema> allSchemas) {
if (schema == null || schema.getProperties() == null) {
return;
}
schema.getProperties().forEach((propName, propSchema) -> {
if (propSchema instanceof Schema) {
Schema<?> prop = (Schema<?>) propSchema;
// Check if additionalProperties has oneOf (polymorphic map values)
if (prop.getAdditionalProperties() instanceof Schema) {
Schema<?> additionalProps = (Schema<?>) prop.getAdditionalProperties();
if (additionalProps.getOneOf() != null && !additionalProps.getOneOf().isEmpty()) {
String baseType = findBaseTypeForOneOf(allSchemas, additionalProps.getOneOf());
if (baseType != null) {
Schema<?> refSchema = new Schema<>();
refSchema.set$ref("#/components/schemas/" + baseType);
prop.setAdditionalProperties(refSchema);
log.debug("Replaced oneOf in additionalProperties with $ref to {} in property {}", baseType, propName);
}
}
return false;
})
.map(Map.Entry::getKey)
.findFirst()
.orElse(null);
}
}
// If property has oneOf, try to find the base discriminated type
if (prop.getOneOf() != null && !prop.getOneOf().isEmpty()) {
String baseType = findBaseTypeForOneOf(allSchemas, prop.getOneOf());
if (baseType != null) {
Schema<?> refSchema = new Schema<>();
refSchema.set$ref("#/components/schemas/" + baseType);
if (prop.getDescription() != null) {
refSchema.setDescription(prop.getDescription());
}
schema.getProperties().put(propName, refSchema);
log.debug("Replaced oneOf with $ref to {} in property {}", baseType, propName);
}
}
}
});
}
private Tag tagsCustomization(Map.Entry<String, PathItem> entry) {
var tagItem = tagItemFromPathItem(entry.getValue());

9
application/src/main/java/org/thingsboard/server/controller/AiModelController.java

@ -18,7 +18,10 @@ package org.thingsboard.server.controller;
import com.google.common.util.concurrent.ListenableFuture;
import dev.langchain4j.model.chat.request.ChatRequest;
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 jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
@ -39,6 +42,7 @@ import org.thingsboard.server.common.data.ai.model.chat.AiChatModelConfig;
import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.data.id.AiModelId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.security.model.mfa.account.AccountTwoFaSettings;
import org.thingsboard.server.config.annotations.ApiOperation;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.ai.AiChatModelService;
@ -162,6 +166,11 @@ class AiModelController extends BaseController {
TENANT_AUTHORITY_PARAGRAPH
)
@PreAuthorize("hasAuthority('TENANT_ADMIN')")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = TbChatResponse.class)))
})
@PostMapping("/chat")
public DeferredResult<TbChatResponse> sendChatRequest(@Valid @RequestBody TbChatRequest tbChatRequest) {
ChatRequest langChainChatRequest = tbChatRequest.toLangChainChatRequest();

11
application/src/main/java/org/thingsboard/server/controller/EntitiesVersionControlController.java

@ -19,6 +19,7 @@ import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
@ -159,7 +160,10 @@ public class EntitiesVersionControlController extends BaseController {
"status of operation via `getVersionCreateRequestStatus`.\n" +
TENANT_AUTHORITY_PARAGRAPH)
@PostMapping("/version")
public DeferredResult<UUID> saveEntitiesVersion(@RequestBody VersionCreateRequest request) throws Exception {
public DeferredResult<UUID> saveEntitiesVersion(@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "A JSON value representing the version create request.",
required = true, content = @Content(mediaType = "application/json",
schema = @Schema(implementation = VersionCreateRequest.class)))
@RequestBody VersionCreateRequest request) throws Exception {
SecurityUser user = getCurrentUser();
accessControlService.checkPermission(getCurrentUser(), Resource.VERSION_CONTROL, Operation.WRITE);
return wrapFuture(versionControlService.saveEntitiesVersion(user, request));
@ -427,7 +431,10 @@ public class EntitiesVersionControlController extends BaseController {
"via `getVersionLoadRequestStatus`." +
TENANT_AUTHORITY_PARAGRAPH)
@PostMapping("/entity")
public UUID loadEntitiesVersion(@RequestBody VersionLoadRequest request) throws Exception {
public UUID loadEntitiesVersion(@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "A JSON value representing the version load request.",
required = true, content = @Content(mediaType = "application/json",
schema = @Schema(implementation = VersionLoadRequest.class)))
@RequestBody VersionLoadRequest request) throws Exception {
SecurityUser user = getCurrentUser();
accessControlService.checkPermission(user, Resource.VERSION_CONTROL, Operation.WRITE);
return versionControlService.loadEntitiesVersion(user, request);

6
application/src/main/java/org/thingsboard/server/controller/EventController.java

@ -16,6 +16,7 @@
package org.thingsboard.server.controller;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
@ -213,6 +214,7 @@ public class EventController extends BaseController {
@Parameter(description = PAGE_NUMBER_DESCRIPTION, required = true)
@RequestParam int page,
@Parameter(description = "A JSON value representing the event filter.", required = true)
@io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = @Content(schema = @Schema(implementation = EventFilter.class)))
@RequestBody EventFilter eventFilter,
@Parameter(description = EVENT_TEXT_SEARCH_DESCRIPTION)
@RequestParam(required = false) String textSearch,
@ -247,7 +249,9 @@ public class EventController extends BaseController {
@RequestParam(required = false) Long startTime,
@Parameter(description = EVENT_END_TIME_DESCRIPTION)
@RequestParam(required = false) Long endTime,
@Parameter(description = EVENT_FILTER_DEFINITION)
@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "A JSON value representing the event filter.",
required = true, content = @Content(mediaType = "application/json",
schema = @Schema(implementation = EventFilter.class)))
@RequestBody EventFilter eventFilter) throws ThingsboardException {
checkParameter("EntityId", strEntityId);
checkParameter("EntityType", strEntityType);

37
application/src/main/java/org/thingsboard/server/controller/TelemetryController.java

@ -26,6 +26,8 @@ import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.ArraySchema;
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;
@ -170,7 +172,10 @@ public class TelemetryController extends BaseController {
"\n\n * SERVER_SCOPE - supported for all entity types;" +
"\n * CLIENT_SCOPE - supported for devices;" +
"\n * SHARED_SCOPE - supported for devices. "
+ "\n\n" + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH)
+ "\n\n" + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH,
responses = @ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
array = @ArraySchema(schema = @Schema(type = "string")))))
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
@RequestMapping(value = "/{entityType}/{entityId}/keys/attributes", method = RequestMethod.GET)
@ResponseBody
@ -185,7 +190,10 @@ public class TelemetryController extends BaseController {
"\n\n * SERVER_SCOPE - supported for all entity types;" +
"\n * CLIENT_SCOPE - supported for devices;" +
"\n * SHARED_SCOPE - supported for devices. "
+ "\n\n" + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH)
+ "\n\n" + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH,
responses = @ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
array = @ArraySchema(schema = @Schema(type = "string")))))
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
@RequestMapping(value = "/{entityType}/{entityId}/keys/attributes/{scope}", method = RequestMethod.GET)
@ResponseBody
@ -203,7 +211,10 @@ public class TelemetryController extends BaseController {
+ MARKDOWN_CODE_BLOCK_START
+ ATTRIBUTE_DATA_EXAMPLE
+ MARKDOWN_CODE_BLOCK_END
+ "\n\n " + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH)
+ "\n\n " + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH,
responses = @ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
array = @ArraySchema(schema = @Schema(implementation = AttributeData.class)))))
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
@RequestMapping(value = "/{entityType}/{entityId}/values/attributes", method = RequestMethod.GET)
@ResponseBody
@ -225,7 +236,10 @@ public class TelemetryController extends BaseController {
+ MARKDOWN_CODE_BLOCK_START
+ ATTRIBUTE_DATA_EXAMPLE
+ MARKDOWN_CODE_BLOCK_END
+ "\n\n " + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH)
+ "\n\n " + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH,
responses = @ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
array = @ArraySchema(schema = @Schema(implementation = AttributeData.class)))))
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
@RequestMapping(value = "/{entityType}/{entityId}/values/attributes/{scope}", method = RequestMethod.GET)
@ResponseBody
@ -241,7 +255,10 @@ public class TelemetryController extends BaseController {
@ApiOperation(value = "Get time series keys (getTimeseriesKeys)",
notes = "Returns a set of unique time series key names for the selected entity. " +
"\n\n" + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH)
"\n\n" + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH,
responses = @ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
array = @ArraySchema(schema = @Schema(type = "string")))))
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
@RequestMapping(value = "/{entityType}/{entityId}/keys/timeseries", method = RequestMethod.GET)
@ResponseBody
@ -263,7 +280,10 @@ public class TelemetryController extends BaseController {
+ MARKDOWN_CODE_BLOCK_START
+ LATEST_TS_STRICT_DATA_EXAMPLE
+ MARKDOWN_CODE_BLOCK_END
+ "\n\n " + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH)
+ "\n\n " + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH,
responses = @ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
schema = @Schema(type = "object", additionalPropertiesSchema = TsData[].class))))
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
@GetMapping(value = "/{entityType}/{entityId}/values/timeseries")
public DeferredResult<ResponseEntity> getLatestTimeseries(
@ -310,7 +330,10 @@ public class TelemetryController extends BaseController {
+ MARKDOWN_CODE_BLOCK_START
+ TS_STRICT_DATA_EXAMPLE
+ MARKDOWN_CODE_BLOCK_END
+ "\n\n" + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH)
+ "\n\n" + INVALID_ENTITY_ID_OR_ENTITY_TYPE_DESCRIPTION + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH,
responses = @ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
schema = @Schema(type = "object", additionalPropertiesSchema = TsData[].class))))
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
@GetMapping(value = "/{entityType}/{entityId}/values/timeseries/history")
public DeferredResult<ResponseEntity> getTimeseriesHistory(

61
application/src/main/java/org/thingsboard/server/controller/TwoFactorAuthConfigController.java

@ -16,7 +16,11 @@
package org.thingsboard.server.controller;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.ArraySchema;
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 jakarta.validation.Valid;
import lombok.Data;
import lombok.RequiredArgsConstructor;
@ -66,6 +70,11 @@ public class TwoFactorAuthConfigController extends BaseController {
" \"SMS\": {\n \"providerType\": \"SMS\",\n \"useByDefault\": false,\n \"phoneNumber\": \"+380501253652\"\n }\n" +
" }\n}\n```" +
ControllerConstants.AVAILABLE_FOR_ANY_AUTHORIZED_USER)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = AccountTwoFaSettings.class)))
})
@GetMapping("/account/settings")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
public AccountTwoFaSettings getAccountTwoFaSettings() throws ThingsboardException {
@ -98,6 +107,11 @@ public class TwoFactorAuthConfigController extends BaseController {
"}\n```" + NEW_LINE +
"Will throw an error (Bad Request) if the provider is not configured for usage. " +
ControllerConstants.AVAILABLE_FOR_ANY_AUTHORIZED_USER)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = TwoFaAccountConfig.class)))
})
@PostMapping("/account/config/generate")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
public TwoFaAccountConfig generateTwoFaAccountConfig(@Parameter(description = "2FA provider type to generate new account config for", schema = @Schema(defaultValue = "TOTP", requiredMode = Schema.RequiredMode.REQUIRED))
@ -128,7 +142,10 @@ public class TwoFactorAuthConfigController extends BaseController {
ControllerConstants.AVAILABLE_FOR_ANY_AUTHORIZED_USER)
@PostMapping("/account/config/submit")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
public void submitTwoFaAccountConfig(@Valid @RequestBody TwoFaAccountConfig accountConfig) throws Exception {
public void submitTwoFaAccountConfig(@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "2FA account config to submit for verification",
required = true, content = @Content(mediaType = "application/json",
schema = @Schema(implementation = TwoFaAccountConfig.class)))
@Valid @RequestBody TwoFaAccountConfig accountConfig) throws Exception {
SecurityUser user = getCurrentUser();
twoFactorAuthService.prepareVerificationCode(user, accountConfig, false);
}
@ -138,9 +155,17 @@ public class TwoFactorAuthConfigController extends BaseController {
"Returns whole account's 2FA settings object.\n" +
"Will throw an error (Bad Request) if the provider is not configured for usage. " +
ControllerConstants.AVAILABLE_FOR_ANY_AUTHORIZED_USER)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = AccountTwoFaSettings.class)))
})
@PostMapping("/account/config")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
public AccountTwoFaSettings verifyAndSaveTwoFaAccountConfig(@Valid @RequestBody TwoFaAccountConfig accountConfig,
public AccountTwoFaSettings verifyAndSaveTwoFaAccountConfig(@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "2FA account config to submit for verification",
required = true, content = @Content(mediaType = "application/json",
schema = @Schema(implementation = TwoFaAccountConfig.class)))
@Valid @RequestBody TwoFaAccountConfig accountConfig,
@RequestParam(required = false) String verificationCode) throws Exception {
SecurityUser user = getCurrentUser();
if (twoFaConfigManager.getTwoFaAccountConfig(user.getTenantId(), user.getId(), accountConfig.getProviderType()).isPresent()) {
@ -166,9 +191,17 @@ public class TwoFactorAuthConfigController extends BaseController {
"```\n{\n \"useByDefault\": true\n}\n```\n" +
"Returns whole account's 2FA settings object.\n" +
ControllerConstants.AVAILABLE_FOR_ANY_AUTHORIZED_USER)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = AccountTwoFaSettings.class)))
})
@PutMapping("/account/config")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
public AccountTwoFaSettings updateTwoFaAccountConfig(@RequestParam TwoFaProviderType providerType,
@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "2FA account config update request",
required = true, content = @Content(mediaType = "application/json",
schema = @Schema(implementation = TwoFaAccountConfigUpdateRequest.class)))
@RequestBody TwoFaAccountConfigUpdateRequest updateRequest) throws ThingsboardException {
SecurityUser user = getCurrentUser();
@ -182,6 +215,11 @@ public class TwoFactorAuthConfigController extends BaseController {
"Delete 2FA config for a given 2FA provider type. \n" +
"Returns whole account's 2FA settings object.\n" +
ControllerConstants.AVAILABLE_FOR_ANY_AUTHORIZED_USER)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = AccountTwoFaSettings.class)))
})
@DeleteMapping("/account/config")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
public AccountTwoFaSettings deleteTwoFaAccountConfig(@RequestParam TwoFaProviderType providerType) throws ThingsboardException {
@ -196,6 +234,11 @@ public class TwoFactorAuthConfigController extends BaseController {
"```\n[\n \"TOTP\",\n \"EMAIL\",\n \"SMS\"\n]\n```" +
ControllerConstants.AVAILABLE_FOR_ANY_AUTHORIZED_USER
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
array = @ArraySchema(schema = @Schema(implementation = TwoFaProviderType.class))))
})
@GetMapping("/providers")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
public List<TwoFaProviderType> getAvailableTwoFaProviders() throws ThingsboardException {
@ -210,6 +253,11 @@ public class TwoFactorAuthConfigController extends BaseController {
notes = "Get platform settings for 2FA. The settings are described for savePlatformTwoFaSettings API method. " +
"If 2FA is not configured, then an empty response will be returned." +
ControllerConstants.SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = PlatformTwoFaSettings.class)))
})
@GetMapping("/settings")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN')")
public PlatformTwoFaSettings getPlatformTwoFaSettings() throws ThingsboardException {
@ -257,9 +305,16 @@ public class TwoFactorAuthConfigController extends BaseController {
" \"totalAllowedTimeForVerification\": 600\n" +
"}\n```" +
ControllerConstants.SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = PlatformTwoFaSettings.class)))
})
@PostMapping("/settings")
@PreAuthorize("hasAnyAuthority('SYS_ADMIN')")
public PlatformTwoFaSettings savePlatformTwoFaSettings(@Parameter(description = "Settings value", required = true)
public PlatformTwoFaSettings savePlatformTwoFaSettings(@io.swagger.v3.oas.annotations.parameters.RequestBody(description = "Platform 2FA settings",
required = true, content = @Content(mediaType = "application/json",
schema = @Schema(implementation = PlatformTwoFaSettings.class)))
@RequestBody PlatformTwoFaSettings twoFaSettings) throws ThingsboardException {
return twoFaConfigManager.savePlatformTwoFaSettings(getTenantId(), twoFaSettings);
}

4
common/data/src/main/java/org/thingsboard/server/common/data/TbResource.java

@ -28,6 +28,7 @@ import java.io.Serial;
import java.util.Base64;
import java.util.Optional;
@Schema
@Slf4j
@Data
@EqualsAndHashCode(callSuper = true)
@ -36,8 +37,10 @@ public class TbResource extends TbResourceInfo {
@Serial
private static final long serialVersionUID = 7379609705527272306L;
@JsonIgnore
private byte[] data;
@JsonIgnore
private byte[] preview;
public TbResource() {
@ -73,6 +76,7 @@ public class TbResource extends TbResourceInfo {
.orElse(null);
}
@Schema(description = "Resource preview data.", accessMode = Schema.AccessMode.READ_WRITE)
@JsonGetter("preview")
public String getEncodedPreview() {
return Optional.ofNullable(preview)

14
common/data/src/main/java/org/thingsboard/server/common/data/TbResourceInfo.java

@ -38,21 +38,23 @@ public class TbResourceInfo extends BaseData<TbResourceId> implements HasName, H
private static final long serialVersionUID = 7282664529021651736L;
@Schema(description = "JSON object with Tenant Id. Tenant Id of the resource can't be changed.", accessMode = Schema.AccessMode.READ_ONLY)
@Schema(description = "JSON object with Tenant Id. Tenant Id of the resource can't be changed.")
private TenantId tenantId;
@NoXss
@Length(fieldName = "title")
@Schema(description = "Resource title.", example = "BinaryAppDataContainer id=19 v1.0")
private String title;
@Schema(description = "Resource type.", example = "LWM2M_MODEL", accessMode = Schema.AccessMode.READ_ONLY)
@Schema(description = "Resource type.", example = "LWM2M_MODEL")
private ResourceType resourceType;
@Schema(description = "Resource sub type.", example = "IOT_SVG", accessMode = Schema.AccessMode.READ_ONLY)
@Schema(description = "Resource sub type.", example = "IOT_SVG")
private ResourceSubType resourceSubType;
@NoXss
@Length(fieldName = "resourceKey")
@Schema(description = "Resource key.", example = "19_1.0", accessMode = Schema.AccessMode.READ_ONLY)
@Schema(description = "Resource key.", example = "19_1.0")
private String resourceKey;
@Schema(description = "Whether the resource is public.", example = "false")
private boolean isPublic;
@Schema(description = "Public resource key.")
private String publicResourceKey;
@Schema(description = "Resource search text.", example = "19_1.0:binaryappdatacontainer", accessMode = Schema.AccessMode.READ_ONLY)
private String searchText;
@ -61,10 +63,12 @@ public class TbResourceInfo extends BaseData<TbResourceId> implements HasName, H
private String etag;
@NoXss
@Length(fieldName = "file name")
@Schema(description = "Resource file name.", example = "19.xml", accessMode = Schema.AccessMode.READ_ONLY)
@Schema(description = "Resource file name.", example = "19.xml")
private String fileName;
@Schema(description = "Resource descriptor.")
private JsonNode descriptor;
@Schema(description = "External resource Id used for import/export.")
private TbResourceId externalId;
public TbResourceInfo() {

2
common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedField.java

@ -63,7 +63,7 @@ public class CalculatedField extends BaseData<CalculatedFieldId> implements HasN
private DebugSettings debugSettings;
@Schema(description = "Version of calculated field configuration.", example = "0")
private int configurationVersion;
@Schema(implementation = SimpleCalculatedFieldConfiguration.class)
@Schema(implementation = CalculatedFieldConfiguration.class)
private CalculatedFieldConfiguration configuration;
@Getter
@Setter

2
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/Argument.java

@ -16,10 +16,12 @@
package org.thingsboard.server.common.data.cf.configuration;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.lang.Nullable;
import org.thingsboard.server.common.data.id.EntityId;
@Schema
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Argument {

3
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ArgumentType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.cf.configuration;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum ArgumentType {
TS_LATEST, ATTRIBUTE, TS_ROLLING

2
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/BaseCalculatedFieldConfiguration.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.cf.configuration;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.cf.CalculatedFieldLink;
import org.thingsboard.server.common.data.id.CalculatedFieldId;
@ -27,6 +28,7 @@ import java.util.Objects;
import java.util.stream.Collectors;
@Data
@Schema
public abstract class BaseCalculatedFieldConfiguration implements CalculatedFieldConfiguration {
protected Map<String, Argument> arguments;

26
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/CalculatedFieldConfiguration.java

@ -19,6 +19,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
import io.swagger.v3.oas.annotations.media.Schema;
import org.thingsboard.server.common.data.cf.CalculatedFieldLink;
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
import org.thingsboard.server.common.data.id.CalculatedFieldId;
@ -28,6 +30,14 @@ import org.thingsboard.server.common.data.id.TenantId;
import java.util.List;
import java.util.Map;
@Schema(
description = "Configuration for calculated fields",
discriminatorProperty = "type",
discriminatorMapping = {
@DiscriminatorMapping(value = "SIMPLE", schema = SimpleCalculatedFieldConfiguration.class),
@DiscriminatorMapping(value = "SCRIPT", schema = ScriptCalculatedFieldConfiguration.class)
}
)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
@ -40,15 +50,31 @@ import java.util.Map;
@JsonIgnoreProperties(ignoreUnknown = true)
public interface CalculatedFieldConfiguration {
@Schema(
description = "Type of calculated field configuration",
requiredMode = Schema.RequiredMode.REQUIRED
)
@JsonIgnore
CalculatedFieldType getType();
@Schema(
description = "Arguments/parameters for the calculated field",
example = "{\"param1\": {\"type\": \"STRING\", \"value\": \"example\"}}"
)
Map<String, Argument> getArguments();
@Schema(
description = "Expression or formula for calculating the field value",
requiredMode = Schema.RequiredMode.REQUIRED,
example = "value1 + value2"
)
String getExpression();
void setExpression(String expression);
@Schema(
description = "Output configuration for the calculated field result"
)
Output getOutput();
@JsonIgnore

2
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ReferencedEntityKey.java

@ -16,10 +16,12 @@
package org.thingsboard.server.common.data.cf.configuration;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.thingsboard.server.common.data.AttributeScope;
@Schema
@Data
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)

6
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/ScriptCalculatedFieldConfiguration.java

@ -15,14 +15,20 @@
*/
package org.thingsboard.server.common.data.cf.configuration;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
@Data
@Schema
@EqualsAndHashCode(callSuper = true)
public class ScriptCalculatedFieldConfiguration extends BaseCalculatedFieldConfiguration implements CalculatedFieldConfiguration {
@Schema(
description = "Type of calculated field configuration",
requiredMode = Schema.RequiredMode.REQUIRED
)
@Override
public CalculatedFieldType getType() {
return CalculatedFieldType.SCRIPT;

6
common/data/src/main/java/org/thingsboard/server/common/data/cf/configuration/SimpleCalculatedFieldConfiguration.java

@ -15,16 +15,22 @@
*/
package org.thingsboard.server.common.data.cf.configuration;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
@Data
@Schema
@EqualsAndHashCode(callSuper = true)
public class SimpleCalculatedFieldConfiguration extends BaseCalculatedFieldConfiguration implements CalculatedFieldConfiguration {
private boolean useLatestTs;
@Schema(
description = "Type of calculated field configuration",
requiredMode = Schema.RequiredMode.REQUIRED
)
@Override
public CalculatedFieldType getType() {
return CalculatedFieldType.SIMPLE;

3
common/data/src/main/java/org/thingsboard/server/common/data/device/data/CoapDeviceTransportConfiguration.java

@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.device.data;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.DeviceTransportType;
@ -25,6 +26,7 @@ import java.util.HashMap;
import java.util.Map;
@Data
@Schema
public class CoapDeviceTransportConfiguration extends PowerSavingConfiguration implements DeviceTransportConfiguration {
private static final long serialVersionUID = 6061442236008925609L;
@ -42,6 +44,7 @@ public class CoapDeviceTransportConfiguration extends PowerSavingConfiguration i
this.properties.put(name, value);
}
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public DeviceTransportType getType() {
return DeviceTransportType.COAP;

3
common/data/src/main/java/org/thingsboard/server/common/data/device/data/DefaultDeviceTransportConfiguration.java

@ -15,12 +15,15 @@
*/
package org.thingsboard.server.common.data.device.data;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.DeviceTransportType;
@Schema
@Data
public class DefaultDeviceTransportConfiguration implements DeviceTransportConfiguration {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public DeviceTransportType getType() {
return DeviceTransportType.DEFAULT;

2
common/data/src/main/java/org/thingsboard/server/common/data/device/data/DeviceTransportConfiguration.java

@ -48,6 +48,8 @@ import java.io.Serializable;
@JsonSubTypes.Type(value = Lwm2mDeviceTransportConfiguration.class, name = "LWM2M"),
@JsonSubTypes.Type(value = SnmpDeviceTransportConfiguration.class, name = "SNMP")})
public interface DeviceTransportConfiguration extends Serializable {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@JsonIgnore
DeviceTransportType getType();

3
common/data/src/main/java/org/thingsboard/server/common/data/device/data/Lwm2mDeviceTransportConfiguration.java

@ -18,12 +18,14 @@ package org.thingsboard.server.common.data.device.data;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.DeviceTransportType;
import java.util.HashMap;
import java.util.Map;
@Schema
@Data
public class Lwm2mDeviceTransportConfiguration extends PowerSavingConfiguration implements DeviceTransportConfiguration {
@ -40,6 +42,7 @@ public class Lwm2mDeviceTransportConfiguration extends PowerSavingConfiguration
this.properties.put(name, value);
}
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public DeviceTransportType getType() {
return DeviceTransportType.LWM2M;

3
common/data/src/main/java/org/thingsboard/server/common/data/device/data/MqttDeviceTransportConfiguration.java

@ -18,12 +18,14 @@ package org.thingsboard.server.common.data.device.data;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.DeviceTransportType;
import java.util.HashMap;
import java.util.Map;
@Schema
@Data
public class MqttDeviceTransportConfiguration implements DeviceTransportConfiguration {
@ -40,6 +42,7 @@ public class MqttDeviceTransportConfiguration implements DeviceTransportConfigur
this.properties.put(name, value);
}
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public DeviceTransportType getType() {
return DeviceTransportType.MQTT;

3
common/data/src/main/java/org/thingsboard/server/common/data/device/data/SnmpDeviceTransportConfiguration.java

@ -16,6 +16,7 @@
package org.thingsboard.server.common.data.device.data;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;
import org.thingsboard.server.common.data.DeviceTransportType;
@ -24,6 +25,7 @@ import org.thingsboard.server.common.data.transport.snmp.AuthenticationProtocol;
import org.thingsboard.server.common.data.transport.snmp.PrivacyProtocol;
import org.thingsboard.server.common.data.transport.snmp.SnmpProtocolVersion;
@Schema
@Data
@ToString(of = {"host", "port", "protocolVersion"})
public class SnmpDeviceTransportConfiguration implements DeviceTransportConfiguration {
@ -55,6 +57,7 @@ public class SnmpDeviceTransportConfiguration implements DeviceTransportConfigur
this.community = "public";
}
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public DeviceTransportType getType() {
return DeviceTransportType.SNMP;

2
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/CoapDeviceProfileTransportConfiguration.java

@ -24,7 +24,7 @@ import org.thingsboard.server.common.data.device.data.PowerSavingConfiguration;
@Data
public class CoapDeviceProfileTransportConfiguration implements DeviceProfileTransportConfiguration {
@Schema
@Schema(implementation = CoapDeviceTypeConfiguration.class)
private CoapDeviceTypeConfiguration coapDeviceTypeConfiguration;
@Schema
private PowerSavingConfiguration clientSettings;

4
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/DefaultCoapDeviceTypeConfiguration.java

@ -15,17 +15,21 @@
*/
package org.thingsboard.server.common.data.device.profile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.CoapDeviceType;
@Data
@Schema
public class DefaultCoapDeviceTypeConfiguration implements CoapDeviceTypeConfiguration {
private static final long serialVersionUID = -4287100699186773773L;
@Schema
private TransportPayloadTypeConfiguration transportPayloadTypeConfiguration;
@Override
@Schema(description = "CoAP device type", requiredMode = Schema.RequiredMode.REQUIRED)
public CoapDeviceType getCoapDeviceType() {
return CoapDeviceType.DEFAULT;
}

3
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/EfentoCoapDeviceTypeConfiguration.java

@ -15,15 +15,18 @@
*/
package org.thingsboard.server.common.data.device.profile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.CoapDeviceType;
@Data
@Schema
public class EfentoCoapDeviceTypeConfiguration implements CoapDeviceTypeConfiguration {
private static final long serialVersionUID = -8523081152598707064L;
@Override
@Schema(description = "CoAP device type", requiredMode = Schema.RequiredMode.REQUIRED)
public CoapDeviceType getCoapDeviceType() {
return CoapDeviceType.EFENTO;
}

5
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/JsonTransportPayloadConfiguration.java

@ -15,12 +15,17 @@
*/
package org.thingsboard.server.common.data.device.profile;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.TransportPayloadType;
@Data
@Schema
public class JsonTransportPayloadConfiguration implements TransportPayloadTypeConfiguration {
@Schema(
description = "Transport payload type", requiredMode = Schema.RequiredMode.REQUIRED
)
@Override
public TransportPayloadType getTransportPayloadType() {
return TransportPayloadType.JSON;

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/MqttDeviceProfileTransportConfiguration.java

@ -25,6 +25,7 @@ import org.thingsboard.server.common.data.validation.NoXss;
import java.util.Objects;
import java.util.Set;
@Schema
@Data
public class MqttDeviceProfileTransportConfiguration implements DeviceProfileTransportConfiguration {

5
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/ProtoTransportPayloadConfiguration.java

@ -18,12 +18,14 @@ package org.thingsboard.server.common.data.device.profile;
import com.google.protobuf.Descriptors;
import com.google.protobuf.DynamicMessage;
import com.squareup.wire.schema.Location;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.common.data.DynamicProtoUtils;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.TransportPayloadType;
@Schema
@Slf4j
@Data
public class ProtoTransportPayloadConfiguration implements TransportPayloadTypeConfiguration {
@ -43,6 +45,9 @@ public class ProtoTransportPayloadConfiguration implements TransportPayloadTypeC
private boolean enableCompatibilityWithJsonPayloadFormat;
private boolean useJsonPayloadFormatForDefaultDownlinkTopics;
@Schema(
description = "Transport payload type", requiredMode = Schema.RequiredMode.REQUIRED
)
@Override
public TransportPayloadType getTransportPayloadType() {
return TransportPayloadType.PROTOBUF;

1
common/data/src/main/java/org/thingsboard/server/common/data/id/NotificationTargetId.java

@ -22,6 +22,7 @@ import org.thingsboard.server.common.data.EntityType;
import java.util.UUID;
@Schema
public class NotificationTargetId extends UUIDBased implements EntityId {
@JsonCreator

1
common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/AbstractMobilePage.java

@ -20,6 +20,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.Views;
@Schema
@Data
public abstract class AbstractMobilePage implements MobilePage {

2
common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/CustomMobilePage.java

@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.Views;
@Schema
@Data
@Builder
@NoArgsConstructor
@ -35,6 +36,7 @@ public class CustomMobilePage extends AbstractMobilePage {
@JsonView(Views.Public.class)
private String path;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public MobilePageType getType() {
return MobilePageType.CUSTOM;

2
common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/DashboardPage.java

@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.Views;
@Schema
@Data
@Builder
@NoArgsConstructor
@ -35,6 +36,7 @@ public class DashboardPage extends AbstractMobilePage {
@JsonView(Views.Public.class)
private String dashboardId;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public MobilePageType getType() {
return MobilePageType.DASHBOARD;

2
common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/DefaultMobilePage.java

@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.Views;
@Schema
@Data
@Builder
@NoArgsConstructor
@ -35,6 +36,7 @@ public class DefaultMobilePage extends AbstractMobilePage {
@JsonView(Views.Public.class)
private DefaultPageId id;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public MobilePageType getType() {
return MobilePageType.DEFAULT;

4
common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/MobileLayoutConfig.java

@ -16,6 +16,7 @@
package org.thingsboard.server.common.data.mobile.layout;
import com.fasterxml.jackson.annotation.JsonView;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
@ -28,6 +29,7 @@ import org.thingsboard.server.common.data.Views;
import java.util.ArrayList;
import java.util.List;
@Schema
@Data
@Builder
@NoArgsConstructor
@ -35,7 +37,7 @@ import java.util.List;
@EqualsAndHashCode
public class MobileLayoutConfig {
@Schema(description = "List of pages")
@ArraySchema(schema = @Schema(implementation = MobilePage.class))
@JsonView(Views.Public.class)
@Valid
private List<MobilePage> pages = new ArrayList<>();

2
common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/WebViewPage.java

@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.Views;
@Schema
@Data
@Builder
@NoArgsConstructor
@ -35,6 +36,7 @@ public class WebViewPage extends AbstractMobilePage {
@JsonView(Views.Public.class)
private String url;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public MobilePageType getType() {
return MobilePageType.WEB_VIEW;

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/MobileAppNotificationDeliveryMethodConfig.java

@ -15,10 +15,12 @@
*/
package org.thingsboard.server.common.data.notification.settings;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import org.thingsboard.server.common.data.notification.NotificationDeliveryMethod;
@Schema
@Data
public class MobileAppNotificationDeliveryMethodConfig implements NotificationDeliveryMethodConfig {
@ -26,6 +28,7 @@ public class MobileAppNotificationDeliveryMethodConfig implements NotificationDe
@NotEmpty
private String firebaseServiceAccountCredentials;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the notification delivery method")
@Override
public NotificationDeliveryMethod getMethod() {
return NotificationDeliveryMethod.MOBILE_APP;

10
common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/NotificationDeliveryMethodConfig.java

@ -20,10 +20,19 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
import io.swagger.v3.oas.annotations.media.Schema;
import org.thingsboard.server.common.data.notification.NotificationDeliveryMethod;
import java.io.Serializable;
@Schema(
discriminatorProperty = "method",
discriminatorMapping = {
@DiscriminatorMapping(value = "SLACK", schema = SlackNotificationDeliveryMethodConfig.class),
@DiscriminatorMapping(value = "MOBILE_APP", schema = MobileAppNotificationDeliveryMethodConfig.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "method")
@JsonSubTypes({
@ -32,6 +41,7 @@ import java.io.Serializable;
})
public interface NotificationDeliveryMethodConfig extends Serializable {
@Schema(description = "Notification delivery method", requiredMode = Schema.RequiredMode.REQUIRED)
@JsonIgnore
NotificationDeliveryMethod getMethod();

2
common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/NotificationSettings.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.notification.settings;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@ -23,6 +24,7 @@ import org.thingsboard.server.common.data.notification.NotificationDeliveryMetho
import java.io.Serializable;
import java.util.Map;
@Schema
@Data
public class NotificationSettings implements Serializable {

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/settings/SlackNotificationDeliveryMethodConfig.java

@ -15,16 +15,19 @@
*/
package org.thingsboard.server.common.data.notification.settings;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import org.thingsboard.server.common.data.notification.NotificationDeliveryMethod;
@Schema
@Data
public class SlackNotificationDeliveryMethodConfig implements NotificationDeliveryMethodConfig {
@NotEmpty
private String botToken;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the notification delivery method")
@Override
public NotificationDeliveryMethod getMethod() {
return NotificationDeliveryMethod.SLACK;

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/MicrosoftTeamsNotificationTargetConfig.java

@ -15,11 +15,13 @@
*/
package org.thingsboard.server.common.data.notification.targets;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public class MicrosoftTeamsNotificationTargetConfig extends NotificationTargetConfig implements NotificationRecipient {
@ -30,6 +32,7 @@ public class MicrosoftTeamsNotificationTargetConfig extends NotificationTargetCo
private String channelName;
private Boolean useOldApi = Boolean.TRUE;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the notification target")
@Override
public NotificationTargetType getType() {
return NotificationTargetType.MICROSOFT_TEAMS;

2
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/NotificationTarget.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.notification.targets;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
@ -29,6 +30,7 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.validation.Length;
import org.thingsboard.server.common.data.validation.NoXss;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public class NotificationTarget extends BaseData<NotificationTargetId> implements HasTenantId, HasName, ExportableEntity<NotificationTargetId> {

11
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/NotificationTargetConfig.java

@ -20,12 +20,22 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.notification.targets.platform.PlatformUsersNotificationTargetConfig;
import org.thingsboard.server.common.data.notification.targets.slack.SlackNotificationTargetConfig;
import org.thingsboard.server.common.data.validation.Length;
import org.thingsboard.server.common.data.validation.NoXss;
@Schema(
discriminatorProperty = "type",
discriminatorMapping = {
@DiscriminatorMapping(value = "PLATFORM_USERS", schema = PlatformUsersNotificationTargetConfig.class),
@DiscriminatorMapping(value = "SLACK", schema = SlackNotificationTargetConfig.class),
@DiscriminatorMapping(value = "MICROSOFT_TEAMS", schema = MicrosoftTeamsNotificationTargetConfig.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
@ -40,6 +50,7 @@ public abstract class NotificationTargetConfig {
@Length(max = 500, message = "cannot be longer than 500 chars")
private String description;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the notification target")
@JsonIgnore
public abstract NotificationTargetType getType();

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/AffectedTenantAdministratorsFilter.java

@ -15,11 +15,14 @@
*/
package org.thingsboard.server.common.data.notification.targets.platform;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema
@Data
public class AffectedTenantAdministratorsFilter implements UsersFilter {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the users filter")
@Override
public UsersFilterType getType() {
return UsersFilterType.AFFECTED_TENANT_ADMINISTRATORS;

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/AffectedUserFilter.java

@ -15,11 +15,14 @@
*/
package org.thingsboard.server.common.data.notification.targets.platform;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema
@Data
public class AffectedUserFilter implements UsersFilter {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the users filter")
@Override
public UsersFilterType getType() {
return UsersFilterType.AFFECTED_USER;

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/AllUsersFilter.java

@ -15,11 +15,14 @@
*/
package org.thingsboard.server.common.data.notification.targets.platform;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema
@Data
public class AllUsersFilter implements UsersFilter {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the users filter")
@Override
public UsersFilterType getType() {
return UsersFilterType.ALL_USERS;

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/CustomerUsersFilter.java

@ -15,17 +15,20 @@
*/
package org.thingsboard.server.common.data.notification.targets.platform;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.UUID;
@Schema
@Data
public class CustomerUsersFilter implements UsersFilter {
@NotNull
private UUID customerId;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the users filter")
@Override
public UsersFilterType getType() {
return UsersFilterType.CUSTOMER_USERS;

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/OriginatorEntityOwnerUsersFilter.java

@ -15,11 +15,14 @@
*/
package org.thingsboard.server.common.data.notification.targets.platform;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema
@Data
public class OriginatorEntityOwnerUsersFilter implements UsersFilter {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the users filter")
@Override
public UsersFilterType getType() {
return UsersFilterType.ORIGINATOR_ENTITY_OWNER_USERS;

4
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/PlatformUsersNotificationTargetConfig.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.notification.targets.platform;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@ -22,14 +23,17 @@ import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.notification.targets.NotificationTargetConfig;
import org.thingsboard.server.common.data.notification.targets.NotificationTargetType;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public class PlatformUsersNotificationTargetConfig extends NotificationTargetConfig {
@Schema(implementation = UsersFilter.class)
@NotNull
@Valid
private UsersFilter usersFilter;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the notification target")
@Override
public NotificationTargetType getType() {
return NotificationTargetType.PLATFORM_USERS;

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/SystemAdministratorsFilter.java

@ -15,11 +15,14 @@
*/
package org.thingsboard.server.common.data.notification.targets.platform;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema
@Data
public class SystemAdministratorsFilter implements UsersFilter {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the users filter")
@Override
public UsersFilterType getType() {
return UsersFilterType.SYSTEM_ADMINISTRATORS;

6
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/TenantAdministratorsFilter.java

@ -15,17 +15,23 @@
*/
package org.thingsboard.server.common.data.notification.targets.platform;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Set;
import java.util.UUID;
@Schema
@Data
public class TenantAdministratorsFilter implements UsersFilter {
@ArraySchema(schema = @Schema(implementation = UUID.class))
private Set<UUID> tenantsIds;
@ArraySchema(schema = @Schema(implementation = UUID.class))
private Set<UUID> tenantProfilesIds;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the users filter")
@Override
public UsersFilterType getType() {
return UsersFilterType.TENANT_ADMINISTRATORS;

5
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UserListFilter.java

@ -15,18 +15,23 @@
*/
package org.thingsboard.server.common.data.notification.targets.platform;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import java.util.List;
import java.util.UUID;
@Schema
@Data
public class UserListFilter implements UsersFilter {
@ArraySchema(schema = @Schema(implementation = UUID.class))
@NotEmpty
private List<UUID> usersIds;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the users filter")
@Override
public UsersFilterType getType() {
return UsersFilterType.USER_LIST;

16
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UsersFilter.java

@ -20,7 +20,22 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(
discriminatorProperty = "type",
discriminatorMapping = {
@DiscriminatorMapping(value = "USER_LIST", schema = UserListFilter.class),
@DiscriminatorMapping(value = "CUSTOMER_USERS", schema = CustomerUsersFilter.class),
@DiscriminatorMapping(value = "TENANT_ADMINISTRATORS", schema = TenantAdministratorsFilter.class),
@DiscriminatorMapping(value = "AFFECTED_TENANT_ADMINISTRATORS", schema = AffectedTenantAdministratorsFilter.class),
@DiscriminatorMapping(value = "SYSTEM_ADMINISTRATORS", schema = SystemAdministratorsFilter.class),
@DiscriminatorMapping(value = "ALL_USERS", schema = AllUsersFilter.class),
@DiscriminatorMapping(value = "ORIGINATOR_ENTITY_OWNER_USERS", schema = OriginatorEntityOwnerUsersFilter.class),
@DiscriminatorMapping(value = "AFFECTED_USER", schema = AffectedUserFilter.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
@ -35,6 +50,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
})
public interface UsersFilter {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the users filter")
@JsonIgnore
UsersFilterType getType();

2
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/slack/SlackConversation.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.notification.targets.slack;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
@ -28,6 +29,7 @@ import org.thingsboard.server.common.data.notification.targets.NotificationRecip
import static org.apache.commons.lang3.StringUtils.isEmpty;
@Schema
@Data
@NoArgsConstructor
@AllArgsConstructor

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/slack/SlackNotificationTargetConfig.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.notification.targets.slack;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@ -22,6 +23,7 @@ import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.notification.targets.NotificationTargetConfig;
import org.thingsboard.server.common.data.notification.targets.NotificationTargetType;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public class SlackNotificationTargetConfig extends NotificationTargetConfig {
@ -31,6 +33,7 @@ public class SlackNotificationTargetConfig extends NotificationTargetConfig {
@Valid
private SlackConversation conversation;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the notification target")
@Override
public NotificationTargetType getType() {
return NotificationTargetType.SLACK;

2
common/data/src/main/java/org/thingsboard/server/common/data/query/BooleanFilterPredicate.java

@ -18,12 +18,14 @@ package org.thingsboard.server.common.data.query;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema
@Data
public class BooleanFilterPredicate implements SimpleKeyFilterPredicate<Boolean> {
private BooleanOperation operation;
private FilterPredicateValue<Boolean> value;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public FilterPredicateType getType() {
return FilterPredicateType.BOOLEAN;

4
common/data/src/main/java/org/thingsboard/server/common/data/query/ComplexFilterPredicate.java

@ -15,17 +15,21 @@
*/
package org.thingsboard.server.common.data.query;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
@Schema
public class ComplexFilterPredicate implements KeyFilterPredicate {
private ComplexOperation operation;
@ArraySchema(schema = @Schema(ref = "#/components/schemas/KeyFilterPredicate"))
private List<KeyFilterPredicate> predicates;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public FilterPredicateType getType() {
return FilterPredicateType.COMPLEX;

2
common/data/src/main/java/org/thingsboard/server/common/data/query/DynamicValue.java

@ -15,12 +15,14 @@
*/
package org.thingsboard.server.common.data.query;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.thingsboard.server.common.data.validation.NoXss;
import java.io.Serializable;
@Schema
@Data
@RequiredArgsConstructor
public class DynamicValue<T> implements Serializable {

2
common/data/src/main/java/org/thingsboard/server/common/data/query/FilterPredicateValue.java

@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.query;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import lombok.Data;
import lombok.Getter;
@ -25,6 +26,7 @@ import org.thingsboard.server.common.data.validation.NoXss;
import java.io.Serializable;
@Schema
@Data
public class FilterPredicateValue<T> implements Serializable {

2
common/data/src/main/java/org/thingsboard/server/common/data/query/NumericFilterPredicate.java

@ -18,12 +18,14 @@ package org.thingsboard.server.common.data.query;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema
@Data
public class NumericFilterPredicate implements SimpleKeyFilterPredicate<Double> {
private NumericOperation operation;
private FilterPredicateValue<Double> value;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public FilterPredicateType getType() {
return FilterPredicateType.NUMERIC;

2
common/data/src/main/java/org/thingsboard/server/common/data/query/StringFilterPredicate.java

@ -20,6 +20,7 @@ import jakarta.validation.Valid;
import lombok.Data;
@Data
@Schema
public class StringFilterPredicate implements SimpleKeyFilterPredicate<String> {
private StringOperation operation;
@ -27,6 +28,7 @@ public class StringFilterPredicate implements SimpleKeyFilterPredicate<String> {
private FilterPredicateValue<String> value;
private boolean ignoreCase;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public FilterPredicateType getType() {
return FilterPredicateType.STRING;

4
common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/PlatformTwoFaSettings.java

@ -16,6 +16,8 @@
package org.thingsboard.server.common.data.security.model.mfa;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
@ -28,9 +30,11 @@ import java.util.List;
import java.util.Optional;
@Data
@Schema(description = "Platform Two-Factor Authentication settings")
@JsonIgnoreProperties(ignoreUnknown = true)
public class PlatformTwoFaSettings {
@ArraySchema(schema = @Schema(implementation = TwoFaProviderConfig.class))
@Valid
@NotNull
private List<TwoFaProviderConfig> providers;

3
common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/account/BackupCodeTwoFaAccountConfig.java

@ -16,6 +16,7 @@
package org.thingsboard.server.common.data.security.model.mfa.account;
import com.fasterxml.jackson.annotation.JsonGetter;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -23,6 +24,7 @@ import org.thingsboard.server.common.data.security.model.mfa.provider.TwoFaProvi
import java.util.Set;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public class BackupCodeTwoFaAccountConfig extends TwoFaAccountConfig {
@ -30,6 +32,7 @@ public class BackupCodeTwoFaAccountConfig extends TwoFaAccountConfig {
@NotEmpty
private Set<String> codes;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Two-Factor Authentication provider type")
@Override
public TwoFaProviderType getProviderType() {
return TwoFaProviderType.BACKUP_CODE;

3
common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/account/EmailTwoFaAccountConfig.java

@ -15,12 +15,14 @@
*/
package org.thingsboard.server.common.data.security.model.mfa.account;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.security.model.mfa.provider.TwoFaProviderType;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public class EmailTwoFaAccountConfig extends OtpBasedTwoFaAccountConfig {
@ -29,6 +31,7 @@ public class EmailTwoFaAccountConfig extends OtpBasedTwoFaAccountConfig {
@Email
private String email;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Two-Factor Authentication provider type")
@Override
public TwoFaProviderType getProviderType() {
return TwoFaProviderType.EMAIL;

2
common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/account/OtpBasedTwoFaAccountConfig.java

@ -15,9 +15,11 @@
*/
package org.thingsboard.server.common.data.security.model.mfa.account;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public abstract class OtpBasedTwoFaAccountConfig extends TwoFaAccountConfig {

3
common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/account/SmsTwoFaAccountConfig.java

@ -15,12 +15,14 @@
*/
package org.thingsboard.server.common.data.security.model.mfa.account;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.security.model.mfa.provider.TwoFaProviderType;
@Schema
@EqualsAndHashCode(callSuper = true)
@Data
public class SmsTwoFaAccountConfig extends OtpBasedTwoFaAccountConfig {
@ -29,6 +31,7 @@ public class SmsTwoFaAccountConfig extends OtpBasedTwoFaAccountConfig {
@Pattern(regexp = "^\\+[1-9]\\d{1,14}$", message = "is not of E.164 format")
private String phoneNumber;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Two-Factor Authentication provider type")
@Override
public TwoFaProviderType getProviderType() {
return TwoFaProviderType.SMS;

3
common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/account/TotpTwoFaAccountConfig.java

@ -15,12 +15,14 @@
*/
package org.thingsboard.server.common.data.security.model.mfa.account;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.security.model.mfa.provider.TwoFaProviderType;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public class TotpTwoFaAccountConfig extends TwoFaAccountConfig {
@ -29,6 +31,7 @@ public class TotpTwoFaAccountConfig extends TwoFaAccountConfig {
@Pattern(regexp = "otpauth://totp/(\\S+?):(\\S+?)\\?issuer=(\\S+?)&secret=(\\w+?)", message = "is invalid")
private String authUrl;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Two-Factor Authentication provider type")
@Override
public TwoFaProviderType getProviderType() {
return TwoFaProviderType.TOTP;

3
common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/provider/BackupCodeTwoFaProviderConfig.java

@ -15,16 +15,19 @@
*/
package org.thingsboard.server.common.data.security.model.mfa.provider;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import lombok.Data;
@Data
@Schema
public class BackupCodeTwoFaProviderConfig implements TwoFaProviderConfig {
@Min(value = 1, message = "must be greater than 0")
private int codesQuantity;
@Override
@Schema(description = "Two-Factor Authentication provider type", requiredMode = Schema.RequiredMode.REQUIRED)
public TwoFaProviderType getProviderType() {
return TwoFaProviderType.BACKUP_CODE;
}

3
common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/provider/EmailTwoFaProviderConfig.java

@ -15,14 +15,17 @@
*/
package org.thingsboard.server.common.data.security.model.mfa.provider;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@Schema
@EqualsAndHashCode(callSuper = true)
public class EmailTwoFaProviderConfig extends OtpBasedTwoFaProviderConfig {
@Override
@Schema(description = "Two-Factor Authentication provider type", requiredMode = Schema.RequiredMode.REQUIRED)
public TwoFaProviderType getProviderType() {
return TwoFaProviderType.EMAIL;
}

2
common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/provider/OtpBasedTwoFaProviderConfig.java

@ -15,10 +15,12 @@
*/
package org.thingsboard.server.common.data.security.model.mfa.provider;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import lombok.Data;
@Data
@Schema
public abstract class OtpBasedTwoFaProviderConfig implements TwoFaProviderConfig {
@Min(value = 1, message = "is required")

3
common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/provider/SmsTwoFaProviderConfig.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.security.model.mfa.provider;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
@ -22,6 +23,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
@Schema
public class SmsTwoFaProviderConfig extends OtpBasedTwoFaProviderConfig {
@NotBlank(message = "is required")
@ -29,6 +31,7 @@ public class SmsTwoFaProviderConfig extends OtpBasedTwoFaProviderConfig {
private String smsVerificationMessageTemplate;
@Override
@Schema(description = "Two-Factor Authentication provider type", requiredMode = Schema.RequiredMode.REQUIRED)
public TwoFaProviderType getProviderType() {
return TwoFaProviderType.SMS;
}

3
common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/provider/TotpTwoFaProviderConfig.java

@ -15,16 +15,19 @@
*/
package org.thingsboard.server.common.data.security.model.mfa.provider;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
@Schema
public class TotpTwoFaProviderConfig implements TwoFaProviderConfig {
@NotBlank
private String issuerName;
@Override
@Schema(description = "Two-Factor Authentication provider type", requiredMode = Schema.RequiredMode.REQUIRED)
public TwoFaProviderType getProviderType() {
return TwoFaProviderType.TOTP;
}

16
common/data/src/main/java/org/thingsboard/server/common/data/security/model/mfa/provider/TwoFaProviderConfig.java

@ -20,7 +20,19 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(
description = "Two-factor authentication provider configuration",
discriminatorProperty = "providerType",
discriminatorMapping = {
@DiscriminatorMapping(value = "TOTP", schema = TotpTwoFaProviderConfig.class),
@DiscriminatorMapping(value = "SMS", schema = SmsTwoFaProviderConfig.class),
@DiscriminatorMapping(value = "EMAIL", schema = EmailTwoFaProviderConfig.class),
@DiscriminatorMapping(value = "BACKUP_CODE", schema = BackupCodeTwoFaProviderConfig.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
@ -33,6 +45,10 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
})
public interface TwoFaProviderConfig {
@Schema(
description = "Type of two-factor authentication provider",
requiredMode = Schema.RequiredMode.REQUIRED
)
@JsonIgnore
TwoFaProviderType getProviderType();

2
common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/DeviceExportData.java

@ -18,12 +18,14 @@ package org.thingsboard.server.common.data.sync.ie;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.security.DeviceCredentials;
@Schema
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Data

2
common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/EntityExportData.java

@ -75,7 +75,7 @@ public class EntityExportData<E extends ExportableEntity<? extends EntityId>> {
@JsonProperty(index = 2)
@JsonTbEntity
@Schema
@Schema(implementation = ExportableEntity.class)
private E entity;
@JsonProperty(index = 1)
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)

2
common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/OtaPackageExportData.java

@ -16,9 +16,11 @@
package org.thingsboard.server.common.data.sync.ie;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.OtaPackage;
@Schema
@EqualsAndHashCode(callSuper = true)
public class OtaPackageExportData extends EntityExportData<OtaPackage> {

2
common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/RuleChainExportData.java

@ -17,12 +17,14 @@ package org.thingsboard.server.common.data.sync.ie;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainMetaData;
@Schema
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Data

2
common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/WidgetTypeExportData.java

@ -15,10 +15,12 @@
*/
package org.thingsboard.server.common.data.sync.ie;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public class WidgetTypeExportData extends EntityExportData<WidgetTypeDetails> {

5
common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/WidgetsBundleExportData.java

@ -16,7 +16,10 @@
package org.thingsboard.server.common.data.sync.ie;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.widget.WidgetsBundle;
@ -24,10 +27,12 @@ import org.thingsboard.server.common.data.widget.WidgetsBundle;
import java.util.ArrayList;
import java.util.List;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public class WidgetsBundleExportData extends EntityExportData<WidgetsBundle> {
@ArraySchema(schema = @Schema(description = "List of widgets in the bundle", implementation = JsonNode.class))
@JsonProperty(index = 3)
private List<ObjectNode> widgets;

4
common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/EntityDataDiff.java

@ -15,13 +15,17 @@
*/
package org.thingsboard.server.common.data.sync.vc;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.thingsboard.server.common.data.sync.ie.EntityExportData;
@Schema
@Data
@AllArgsConstructor
public class EntityDataDiff {
@Schema(implementation = EntityExportData.class)
private EntityExportData<?> currentVersion;
@Schema(implementation = EntityExportData.class)
private EntityExportData<?> otherVersion;
}

3
common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/create/ComplexVersionCreateRequest.java

@ -15,12 +15,14 @@
*/
package org.thingsboard.server.common.data.sync.vc.request.create;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.EntityType;
import java.util.Map;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public class ComplexVersionCreateRequest extends VersionCreateRequest {
@ -29,6 +31,7 @@ public class ComplexVersionCreateRequest extends VersionCreateRequest {
private SyncStrategy syncStrategy;
private Map<EntityType, EntityTypeVersionCreateConfig> entityTypes;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the version to create")
@Override
public VersionCreateRequestType getType() {
return VersionCreateRequestType.COMPLEX;

3
common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/create/SingleEntityVersionCreateRequest.java

@ -15,10 +15,12 @@
*/
package org.thingsboard.server.common.data.sync.vc.request.create;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.EntityId;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public class SingleEntityVersionCreateRequest extends VersionCreateRequest {
@ -26,6 +28,7 @@ public class SingleEntityVersionCreateRequest extends VersionCreateRequest {
private EntityId entityId;
private VersionCreateConfig config;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the version to create")
@Override
public VersionCreateRequestType getType() {
return VersionCreateRequestType.SINGLE_ENTITY;

2
common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/create/VersionCreateConfig.java

@ -15,11 +15,13 @@
*/
package org.thingsboard.server.common.data.sync.vc.request.create;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Schema
@Data
public class VersionCreateConfig implements Serializable {

2
common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/load/EntityTypeVersionLoadConfig.java

@ -15,10 +15,12 @@
*/
package org.thingsboard.server.common.data.sync.vc.request.load;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@Schema
@EqualsAndHashCode(callSuper = true)
public class EntityTypeVersionLoadConfig extends VersionLoadConfig {

3
common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/load/EntityTypeVersionLoadRequest.java

@ -15,12 +15,14 @@
*/
package org.thingsboard.server.common.data.sync.vc.request.load;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.EntityType;
import java.util.Map;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public class EntityTypeVersionLoadRequest extends VersionLoadRequest {
@ -28,6 +30,7 @@ public class EntityTypeVersionLoadRequest extends VersionLoadRequest {
private Map<EntityType, EntityTypeVersionLoadConfig> entityTypes;
private boolean rollbackOnError;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public VersionLoadRequestType getType() {
return VersionLoadRequestType.ENTITY_TYPE;

3
common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/load/SingleEntityVersionLoadRequest.java

@ -15,10 +15,12 @@
*/
package org.thingsboard.server.common.data.sync.vc.request.load;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.EntityId;
@Schema
@Data
@EqualsAndHashCode(callSuper = true)
public class SingleEntityVersionLoadRequest extends VersionLoadRequest {
@ -27,6 +29,7 @@ public class SingleEntityVersionLoadRequest extends VersionLoadRequest {
private VersionLoadConfig config;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public VersionLoadRequestType getType() {
return VersionLoadRequestType.SINGLE_ENTITY;

2
common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/load/VersionLoadConfig.java

@ -15,9 +15,11 @@
*/
package org.thingsboard.server.common.data.sync.vc.request.load;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema
public class VersionLoadConfig {
private boolean loadRelations;

Loading…
Cancel
Save