Browse Source

added appropriate swagger annotations for correct open-api json

pull/14929/head
dashevchenko 6 months ago
parent
commit
db14860e72
  1. 126
      application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java
  2. 1
      application/src/main/java/org/thingsboard/server/controller/TwoFactorAuthConfigController.java
  3. 9
      application/src/main/java/org/thingsboard/server/controller/UserController.java
  4. 2
      application/src/main/java/org/thingsboard/server/controller/WidgetTypeController.java
  5. 3
      common/data/src/main/java/org/thingsboard/server/common/data/ApiUsageStateValue.java
  6. 2
      common/data/src/main/java/org/thingsboard/server/common/data/AttributeScope.java
  7. 3
      common/data/src/main/java/org/thingsboard/server/common/data/CoapDeviceType.java
  8. 3
      common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfileProvisionType.java
  9. 3
      common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfileType.java
  10. 3
      common/data/src/main/java/org/thingsboard/server/common/data/DeviceTransportType.java
  11. 2
      common/data/src/main/java/org/thingsboard/server/common/data/EntityType.java
  12. 3
      common/data/src/main/java/org/thingsboard/server/common/data/ResourceSubType.java
  13. 2
      common/data/src/main/java/org/thingsboard/server/common/data/ResourceType.java
  14. 3
      common/data/src/main/java/org/thingsboard/server/common/data/TenantProfileType.java
  15. 3
      common/data/src/main/java/org/thingsboard/server/common/data/TransportPayloadType.java
  16. 4
      common/data/src/main/java/org/thingsboard/server/common/data/User.java
  17. 24
      common/data/src/main/java/org/thingsboard/server/common/data/ai/dto/TbChatRequest.java
  18. 12
      common/data/src/main/java/org/thingsboard/server/common/data/ai/dto/TbChatResponse.java
  19. 37
      common/data/src/main/java/org/thingsboard/server/common/data/ai/model/AiModelConfig.java
  20. 11
      common/data/src/main/java/org/thingsboard/server/common/data/ai/provider/OllamaProviderConfig.java
  21. 4
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmComment.java
  22. 3
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmCommentType.java
  23. 3
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmSearchStatus.java
  24. 3
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmSeverity.java
  25. 3
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmStatus.java
  26. 3
      common/data/src/main/java/org/thingsboard/server/common/data/cf/CalculatedFieldType.java
  27. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/DefaultDeviceConfiguration.java
  28. 11
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/DeviceConfiguration.java
  29. 13
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/DeviceTransportConfiguration.java
  30. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/PowerMode.java
  31. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/PowerSavingConfiguration.java
  32. 12
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionSpec.java
  33. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionSpecType.java
  34. 12
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmSchedule.java
  35. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmScheduleType.java
  36. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/CoapDeviceProfileTransportConfiguration.java
  37. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/DefaultDeviceProfileConfiguration.java
  38. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/DefaultDeviceProfileTransportConfiguration.java
  39. 10
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/DeviceProfileConfiguration.java
  40. 14
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/DeviceProfileTransportConfiguration.java
  41. 5
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/DurationAlarmConditionSpec.java
  42. 13
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/Lwm2mDeviceProfileTransportConfiguration.java
  43. 10
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/MqttDeviceProfileTransportConfiguration.java
  44. 4
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/RepeatingAlarmConditionSpec.java
  45. 3
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/SimpleAlarmConditionSpec.java
  46. 5
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/SnmpDeviceProfileTransportConfiguration.java
  47. 13
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/TransportPayloadTypeConfiguration.java
  48. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/ObjectAttributes.java
  49. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/OtherConfiguration.java
  50. 8
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/TelemetryMappingConfiguration.java
  51. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/TelemetryObserveStrategy.java
  52. 14
      common/data/src/main/java/org/thingsboard/server/common/data/event/EventFilter.java
  53. 2
      common/data/src/main/java/org/thingsboard/server/common/data/event/EventType.java
  54. 2
      common/data/src/main/java/org/thingsboard/server/common/data/housekeeper/HousekeeperTaskType.java
  55. 21
      common/data/src/main/java/org/thingsboard/server/common/data/job/JobResult.java
  56. 3
      common/data/src/main/java/org/thingsboard/server/common/data/job/JobStatus.java
  57. 2
      common/data/src/main/java/org/thingsboard/server/common/data/job/JobType.java
  58. 2
      common/data/src/main/java/org/thingsboard/server/common/data/kv/DataType.java
  59. 3
      common/data/src/main/java/org/thingsboard/server/common/data/kv/IntervalType.java
  60. 2
      common/data/src/main/java/org/thingsboard/server/common/data/limit/LimitedApi.java
  61. 3
      common/data/src/main/java/org/thingsboard/server/common/data/mail/MailOauth2Provider.java
  62. 3
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/app/MobileAppStatus.java
  63. 3
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/DefaultPageId.java
  64. 13
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/MobilePage.java
  65. 3
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/MobilePageType.java
  66. 4
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/qrCodeSettings/BadgePosition.java
  67. 2
      common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationDeliveryMethod.java
  68. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationStatus.java
  69. 2
      common/data/src/main/java/org/thingsboard/server/common/data/notification/NotificationType.java
  70. 2
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/ResourcesShortageTrigger.java
  71. 9
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/AlarmAssignmentNotificationRuleTriggerConfig.java
  72. 9
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/AlarmCommentNotificationRuleTriggerConfig.java
  73. 10
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/AlarmNotificationRuleTriggerConfig.java
  74. 6
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/ApiUsageLimitNotificationRuleTriggerConfig.java
  75. 8
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/DeviceActivityNotificationRuleTriggerConfig.java
  76. 5
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/EdgeCommunicationFailureNotificationRuleTriggerConfig.java
  77. 7
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/EdgeConnectionNotificationRuleTriggerConfig.java
  78. 5
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/EntitiesLimitNotificationRuleTriggerConfig.java
  79. 5
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/EntityActionNotificationRuleTriggerConfig.java
  80. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/NewPlatformVersionNotificationRuleTriggerConfig.java
  81. 24
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/NotificationRuleTriggerConfig.java
  82. 2
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/NotificationRuleTriggerType.java
  83. 5
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/RateLimitsNotificationRuleTriggerConfig.java
  84. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/ResourcesShortageNotificationRuleTriggerConfig.java
  85. 8
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/RuleEngineComponentLifecycleEventNotificationRuleTriggerConfig.java
  86. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/TaskProcessingFailureNotificationRuleTriggerConfig.java
  87. 2
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/NotificationTargetType.java
  88. 2
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/platform/UsersFilterType.java
  89. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/targets/slack/SlackConversationType.java
  90. 15
      common/data/src/main/java/org/thingsboard/server/common/data/notification/template/DeliveryMethodNotificationTemplate.java
  91. 3
      common/data/src/main/java/org/thingsboard/server/common/data/notification/template/EmailDeliveryMethodNotificationTemplate.java
  92. 12
      common/data/src/main/java/org/thingsboard/server/common/data/notification/template/MicrosoftTeamsDeliveryMethodNotificationTemplate.java
  93. 4
      common/data/src/main/java/org/thingsboard/server/common/data/notification/template/MobileAppDeliveryMethodNotificationTemplate.java
  94. 2
      common/data/src/main/java/org/thingsboard/server/common/data/notification/template/SlackDeliveryMethodNotificationTemplate.java
  95. 2
      common/data/src/main/java/org/thingsboard/server/common/data/notification/template/SmsDeliveryMethodNotificationTemplate.java
  96. 4
      common/data/src/main/java/org/thingsboard/server/common/data/notification/template/WebDeliveryMethodNotificationTemplate.java
  97. 3
      common/data/src/main/java/org/thingsboard/server/common/data/oauth2/MapperType.java
  98. 3
      common/data/src/main/java/org/thingsboard/server/common/data/oauth2/PlatformType.java
  99. 3
      common/data/src/main/java/org/thingsboard/server/common/data/oauth2/SchemeType.java
  100. 3
      common/data/src/main/java/org/thingsboard/server/common/data/oauth2/TenantNameStrategyType.java

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

@ -322,7 +322,7 @@ public class SwaggerConfiguration {
}
private OpenApiCustomizer customOpenApiCustomizer() {
var loginForm = new SecurityRequirement().addList("HTTP login form", Arrays.asList(
var loginForm = new SecurityRequirement().addList("http_login_form", Arrays.asList(
Authority.SYS_ADMIN.name(),
Authority.TENANT_ADMIN.name(),
Authority.CUSTOMER_USER.name()
@ -350,11 +350,83 @@ 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();
// Fix all schemas: if they have additionalProperties but no type, set type to object
schemas.forEach((schemaName, schema) -> {
if (schema.getAdditionalProperties() != null && schema.getType() == null) {
schema.setType("object");
log.debug("Added type 'object' to schema: {}", schemaName);
}
});
// Fix polymorphic maps: replace oneOf in additionalProperties with base type reference
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);
}
}
}
}
});
}
});
}
var sortedSchemas = new TreeMap<>(openAPI.getComponents().getSchemas());
openAPI.getComponents().setSchemas(new LinkedHashMap<>(sortedSchemas));
};
}
// 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;
}
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));
}
return false;
})
.map(Map.Entry::getKey)
.findFirst()
.orElse(null);
}
private Tag tagsCustomization(Map.Entry<String, PathItem> entry) {
var tagItem = tagItemFromPathItem(entry.getValue());
@ -449,29 +521,37 @@ public class SwaggerConfiguration {
private static ApiResponses loginErrorResponses() {
ApiResponses apiResponses = new ApiResponses();
apiResponses.addApiResponse("401", errorResponse("Unauthorized",
Map.of(
"bad-credentials", errorExample("Bad credentials",
ThingsboardErrorResponse.of("Invalid username or password", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED)),
"token-expired", errorExample("JWT token expired",
ThingsboardErrorResponse.of("Token has expired", ThingsboardErrorCode.JWT_TOKEN_EXPIRED, HttpStatus.UNAUTHORIZED)),
"account-disabled", errorExample("Disabled account",
ThingsboardErrorResponse.of("User account is not active", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED)),
"account-locked", errorExample("Locked account",
ThingsboardErrorResponse.of("User account is locked due to security policy", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED)),
"authentication-failed", errorExample("General authentication error",
ThingsboardErrorResponse.of("Authentication failed", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED))
)
));
var credentialsExpiredSchema = new Schema<ThingsboardCredentialsExpiredResponse>();
credentialsExpiredSchema.$ref("#/components/schemas/ThingsboardCredentialsExpiredResponse");
apiResponses.addApiResponse("401 ", errorResponse("Unauthorized (**Expired credentials**)",
Map.of(
"credentials-expired", errorExample("Expired credentials",
ThingsboardCredentialsExpiredResponse.of("User password expired!", StringUtils.randomAlphanumeric(30)))
),
credentialsExpiredSchema
// Combine all 401 examples into a single map
Map<String, Example> unauthorizedExamples = new LinkedHashMap<>();
unauthorizedExamples.put("bad-credentials", errorExample("Bad credentials",
ThingsboardErrorResponse.of("Invalid username or password", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED)));
unauthorizedExamples.put("token-expired", errorExample("JWT token expired",
ThingsboardErrorResponse.of("Token has expired", ThingsboardErrorCode.JWT_TOKEN_EXPIRED, HttpStatus.UNAUTHORIZED)));
unauthorizedExamples.put("account-disabled", errorExample("Disabled account",
ThingsboardErrorResponse.of("User account is not active", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED)));
unauthorizedExamples.put("account-locked", errorExample("Locked account",
ThingsboardErrorResponse.of("User account is locked due to security policy", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED)));
unauthorizedExamples.put("authentication-failed", errorExample("General authentication error",
ThingsboardErrorResponse.of("Authentication failed", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED)));
unauthorizedExamples.put("credentials-expired", errorExample("Expired credentials",
ThingsboardCredentialsExpiredResponse.of("User password expired!", StringUtils.randomAlphanumeric(30))));
// Create a schema that can represent both response types using oneOf
Schema<? extends ThingsboardErrorResponse> unauthorizedSchema = new Schema<>();
unauthorizedSchema.oneOf(List.of(
new Schema<ThingsboardErrorResponse>().$ref("#/components/schemas/ThingsboardErrorResponse"),
new Schema<ThingsboardCredentialsExpiredResponse>().$ref("#/components/schemas/ThingsboardCredentialsExpiredResponse")
));
// Add single 401 response with all examples
apiResponses.addApiResponse("401", errorResponse("Unauthorized", unauthorizedExamples, unauthorizedSchema));
return apiResponses;
}

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

@ -266,6 +266,7 @@ public class TwoFactorAuthConfigController extends BaseController {
@Data
@Schema
public static class TwoFaAccountConfigUpdateRequest {
private boolean useByDefault;
}

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

@ -16,6 +16,7 @@
package org.thingsboard.server.controller;
import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.servlet.http.HttpServletRequest;
@ -461,10 +462,7 @@ public class UserController extends BaseController {
return userSettingsService.saveUserSettings(currentUser.getTenantId(), userSettings).getSettings();
}
@ApiOperation(value = "Update user settings (saveUserSettings)",
notes = "Update user settings for authorized user. Only specified json elements will be updated." +
"Example: you have such settings: {A:5, B:{C:10, D:20}}. Updating it with {B:{C:10, D:30}} will result in" +
"{A:5, B:{C:10, D:30}}. The same could be achieved by putting {B.D:30}")
@Hidden
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
@PutMapping(value = "/user/settings")
public void putUserSettings(@RequestBody JsonNode settings) throws ThingsboardException {
@ -472,8 +470,7 @@ public class UserController extends BaseController {
userSettingsService.updateUserSettings(currentUser.getTenantId(), currentUser.getId(), UserSettingsType.GENERAL, settings);
}
@ApiOperation(value = "Get user settings (getUserSettings)",
notes = "Fetch the User settings based on authorized user. ")
@Hidden
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
@GetMapping(value = "/user/settings")
public JsonNode getUserSettings() throws ThingsboardException {

2
application/src/main/java/org/thingsboard/server/controller/WidgetTypeController.java

@ -248,7 +248,7 @@ public class WidgetTypeController extends AutoCommitController {
@GetMapping(value = "/widgetsBundles/{widgetsBundleId}/widgetTypes")
public List<WidgetType> getBundleWidgetTypesV2(
@Parameter(description = "Widget Bundle Id", required = true)
@RequestParam("widgetsBundleId") String strWidgetsBundleId) throws ThingsboardException {
@PathVariable("widgetsBundleId") String strWidgetsBundleId) throws ThingsboardException {
return getBundleWidgetTypes(strWidgetsBundleId);
}

3
common/data/src/main/java/org/thingsboard/server/common/data/ApiUsageStateValue.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum ApiUsageStateValue {
ENABLED, WARNING, DISABLED;

2
common/data/src/main/java/org/thingsboard/server/common/data/AttributeScope.java

@ -15,12 +15,14 @@
*/
package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
@Schema(enumAsRef = true)
public enum AttributeScope {
CLIENT_SCOPE(1),

3
common/data/src/main/java/org/thingsboard/server/common/data/CoapDeviceType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum CoapDeviceType {
DEFAULT,
EFENTO

3
common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfileProvisionType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum DeviceProfileProvisionType {
DISABLED,
ALLOW_CREATE_NEW_DEVICES,

3
common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfileType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum DeviceProfileType {
DEFAULT
}

3
common/data/src/main/java/org/thingsboard/server/common/data/DeviceTransportType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum DeviceTransportType {
DEFAULT,
MQTT,

2
common/data/src/main/java/org/thingsboard/server/common/data/EntityType.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
@ -22,6 +23,7 @@ import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
@Schema(enumAsRef = true)
public enum EntityType {
TENANT(1),
CUSTOMER(2),

3
common/data/src/main/java/org/thingsboard/server/common/data/ResourceSubType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum ResourceSubType {
IMAGE,
SCADA_SYMBOL,

2
common/data/src/main/java/org/thingsboard/server/common/data/ResourceType.java

@ -15,9 +15,11 @@
*/
package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Schema(enumAsRef = true)
@RequiredArgsConstructor
public enum ResourceType {
LWM2M_MODEL("application/xml", false, false),

3
common/data/src/main/java/org/thingsboard/server/common/data/TenantProfileType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum TenantProfileType {
DEFAULT
}

3
common/data/src/main/java/org/thingsboard/server/common/data/TransportPayloadType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum TransportPayloadType {
JSON,
PROTOBUF

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

@ -91,7 +91,7 @@ public class User extends BaseDataWithAdditionalInfo<UserId> implements HasName,
return super.getCreatedTime();
}
@Schema(description = "JSON object with the Tenant Id.", accessMode = Schema.AccessMode.READ_ONLY)
@Schema(description = "JSON object with the Tenant Id.")
public TenantId getTenantId() {
return tenantId;
}
@ -100,7 +100,7 @@ public class User extends BaseDataWithAdditionalInfo<UserId> implements HasName,
this.tenantId = tenantId;
}
@Schema(description = "JSON object with the Customer Id.", accessMode = Schema.AccessMode.READ_ONLY)
@Schema(description = "JSON object with the Customer Id.")
public CustomerId getCustomerId() {
return customerId;
}

24
common/data/src/main/java/org/thingsboard/server/common/data/ai/dto/TbChatRequest.java

@ -20,10 +20,20 @@ import dev.langchain4j.data.message.Content;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.request.ChatRequest;
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import org.thingsboard.server.common.data.ai.model.chat.AiChatModelConfig;
import org.thingsboard.server.common.data.ai.model.chat.AmazonBedrockChatModelConfig;
import org.thingsboard.server.common.data.ai.model.chat.AnthropicChatModelConfig;
import org.thingsboard.server.common.data.ai.model.chat.AzureOpenAiChatModelConfig;
import org.thingsboard.server.common.data.ai.model.chat.GitHubModelsChatModelConfig;
import org.thingsboard.server.common.data.ai.model.chat.GoogleAiGeminiChatModelConfig;
import org.thingsboard.server.common.data.ai.model.chat.GoogleVertexAiGeminiChatModelConfig;
import org.thingsboard.server.common.data.ai.model.chat.MistralAiChatModelConfig;
import org.thingsboard.server.common.data.ai.model.chat.OllamaChatModelConfig;
import org.thingsboard.server.common.data.ai.model.chat.OpenAiChatModelConfig;
import java.util.ArrayList;
import java.util.List;
@ -48,7 +58,19 @@ public record TbChatRequest(
@Schema(
requiredMode = Schema.RequiredMode.REQUIRED,
accessMode = Schema.AccessMode.READ_WRITE,
description = "Configuration of the AI chat model that should execute the request"
description = "Configuration of the AI chat model that should execute the request",
discriminatorProperty = "modelType",
discriminatorMapping = {
@DiscriminatorMapping(value = "OPENAI", schema = OpenAiChatModelConfig.class),
@DiscriminatorMapping(value = "AZURE_OPENAI", schema = AzureOpenAiChatModelConfig.class),
@DiscriminatorMapping(value = "GOOGLE_AI", schema = GoogleAiGeminiChatModelConfig.class),
@DiscriminatorMapping(value = "VERTEX_AI", schema = GoogleVertexAiGeminiChatModelConfig.class),
@DiscriminatorMapping(value = "MISTRAL", schema = MistralAiChatModelConfig.class),
@DiscriminatorMapping(value = "ANTHROPIC", schema = AnthropicChatModelConfig.class),
@DiscriminatorMapping(value = "BEDROCK", schema = AmazonBedrockChatModelConfig.class),
@DiscriminatorMapping(value = "GITHUB", schema = GitHubModelsChatModelConfig.class),
@DiscriminatorMapping(value = "OLLAMA", schema = OllamaChatModelConfig.class)
}
)
@NotNull @Valid
AiChatModelConfig<?> chatModelConfig

12
common/data/src/main/java/org/thingsboard/server/common/data/ai/dto/TbChatResponse.java

@ -17,8 +17,17 @@ package org.thingsboard.server.common.data.ai.dto;
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;
@Schema(
description = "Response from chat API",
discriminatorProperty = "status",
discriminatorMapping = {
@DiscriminatorMapping(value = "SUCCESS", schema = TbChatResponse.Success.class),
@DiscriminatorMapping(value = "FAILURE", schema = TbChatResponse.Failure.class)
}
)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
property = "status",
@ -33,7 +42,8 @@ public sealed interface TbChatResponse permits TbChatResponse.Success, TbChatRes
@Schema(
description = "Indicates whether the request was successful or not",
example = "SUCCESS"
example = "SUCCESS",
requiredMode = Schema.RequiredMode.REQUIRED
)
String getStatus();

37
common/data/src/main/java/org/thingsboard/server/common/data/ai/model/AiModelConfig.java

@ -17,6 +17,8 @@ package org.thingsboard.server.common.data.ai.model;
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.ai.model.chat.AmazonBedrockChatModelConfig;
import org.thingsboard.server.common.data.ai.model.chat.AnthropicChatModelConfig;
import org.thingsboard.server.common.data.ai.model.chat.AzureOpenAiChatModelConfig;
@ -55,10 +57,45 @@ import org.thingsboard.server.common.data.ai.provider.OpenAiProviderConfig;
@JsonSubTypes.Type(value = GitHubModelsChatModelConfig.class, name = "GITHUB_MODELS"),
@JsonSubTypes.Type(value = OllamaChatModelConfig.class, name = "OLLAMA")
})
@Schema(
name = "AiModelConfig",
description = "Root configuration for AI models",
discriminatorProperty = "provider",
discriminatorMapping = {
@DiscriminatorMapping(value = "OPENAI", schema = OpenAiChatModelConfig.class),
@DiscriminatorMapping(value = "AZURE_OPENAI", schema = AzureOpenAiChatModelConfig.class),
@DiscriminatorMapping(value = "GOOGLE_AI_GEMINI", schema = GoogleAiGeminiChatModelConfig.class),
@DiscriminatorMapping(value = "GOOGLE_VERTEX_AI_GEMINI", schema = GoogleVertexAiGeminiChatModelConfig.class),
@DiscriminatorMapping(value = "MISTRAL_AI", schema = MistralAiChatModelConfig.class),
@DiscriminatorMapping(value = "ANTHROPIC", schema = AnthropicChatModelConfig.class),
@DiscriminatorMapping(value = "AMAZON_BEDROCK", schema = AmazonBedrockChatModelConfig.class),
@DiscriminatorMapping(value = "GITHUB_MODELS", schema = GitHubModelsChatModelConfig.class),
@DiscriminatorMapping(value = "OLLAMA", schema = OllamaChatModelConfig.class)
}
)
public interface AiModelConfig {
@Schema(
description = "AI Provider",
requiredMode = Schema.RequiredMode.REQUIRED
)
AiProvider provider();
@Schema(
description = "Provider-specific configuration details",
discriminatorProperty = "provider",
discriminatorMapping = {
@DiscriminatorMapping(value = "OPENAI", schema = OpenAiProviderConfig.class),
@DiscriminatorMapping(value = "AZURE_OPENAI", schema = AzureOpenAiProviderConfig.class),
@DiscriminatorMapping(value = "GOOGLE_AI_GEMINI", schema = GoogleAiGeminiProviderConfig.class),
@DiscriminatorMapping(value = "GOOGLE_VERTEX_AI_GEMINI", schema = GoogleVertexAiGeminiProviderConfig.class),
@DiscriminatorMapping(value = "MISTRAL_AI", schema = MistralAiProviderConfig.class),
@DiscriminatorMapping(value = "ANTHROPIC", schema = AnthropicProviderConfig.class),
@DiscriminatorMapping(value = "AMAZON_BEDROCK", schema = AmazonBedrockProviderConfig.class),
@DiscriminatorMapping(value = "GITHUB_MODELS", schema = GitHubModelsProviderConfig.class),
@DiscriminatorMapping(value = "OLLAMA", schema = OllamaProviderConfig.class)
}
)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXTERNAL_PROPERTY,

11
common/data/src/main/java/org/thingsboard/server/common/data/ai/provider/OllamaProviderConfig.java

@ -17,6 +17,8 @@ package org.thingsboard.server.common.data.ai.provider;
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 jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
@ -25,6 +27,15 @@ public record OllamaProviderConfig(
@NotNull @Valid OllamaAuth auth
) implements AiProviderConfig {
@Schema(
description = "Ollama authentication schemes",
discriminatorProperty = "type",
discriminatorMapping = {
@DiscriminatorMapping(value = "NONE", schema = OllamaAuth.None.class),
@DiscriminatorMapping(value = "BASIC", schema = OllamaAuth.Basic.class),
@DiscriminatorMapping(value = "TOKEN", schema = OllamaAuth.Token.class)
}
)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,

4
common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmComment.java

@ -47,7 +47,7 @@ public class AlarmComment extends BaseData<AlarmCommentId> implements HasName {
private UserId userId;
@Schema(description = "Defines origination of comment. System type means comment was created by TB. OTHER type means comment was created by user.", example = "SYSTEM/OTHER", accessMode = Schema.AccessMode.READ_ONLY)
private AlarmCommentType type;
@Schema(description = "JSON object with text of comment.")
@Schema(description = "JSON object with text of comment.", type = "object")
@NoXss
@Length(fieldName = "comment", max = 10000)
@EqualsAndHashCode.Include
@ -56,7 +56,7 @@ public class AlarmComment extends BaseData<AlarmCommentId> implements HasName {
@Schema(description = "JSON object with the alarm comment Id. " +
"Specify this field to update the alarm comment. " +
"Referencing non-existing alarm Id will cause error. " +
"Omit this field to create new alarm.", accessMode = Schema.AccessMode.READ_ONLY)
"Omit this field to create new alarm.")
@Override
public AlarmCommentId getId() {
return super.getId();

3
common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmCommentType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.alarm;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum AlarmCommentType {
SYSTEM, OTHER;

3
common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmSearchStatus.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.alarm;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum AlarmSearchStatus {
ANY,

3
common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmSeverity.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.alarm;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum AlarmSeverity {
CRITICAL, MAJOR, MINOR, WARNING, INDETERMINATE;

3
common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmStatus.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.alarm;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum AlarmStatus {
ACTIVE_UNACK, ACTIVE_ACK, CLEARED_UNACK, CLEARED_ACK;

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

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

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

@ -19,12 +19,13 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.DeviceProfileType;
@Schema
@Schema(description = "Default device configuration", allOf = DeviceConfiguration.class)
@Data
public class DefaultDeviceConfiguration implements DeviceConfiguration {
private static final long serialVersionUID = -2225378639573611325L;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Device profile type")
@Override
public DeviceProfileType getType() {
return DeviceProfileType.DEFAULT;

11
common/data/src/main/java/org/thingsboard/server/common/data/device/data/DeviceConfiguration.java

@ -19,12 +19,19 @@ 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.DeviceProfileType;
import java.io.Serializable;
@Schema
@Schema(
description = "Device configuration",
discriminatorProperty = "type",
discriminatorMapping = {
@DiscriminatorMapping(value = "DEFAULT", schema = DefaultDeviceConfiguration.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
@ -34,7 +41,7 @@ import java.io.Serializable;
@JsonSubTypes.Type(value = DefaultDeviceConfiguration.class, name = "DEFAULT")})
public interface DeviceConfiguration extends Serializable {
@JsonIgnore
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Device profile type")
DeviceProfileType getType();
}

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

@ -19,12 +19,23 @@ 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.DeviceTransportType;
import java.io.Serializable;
@Schema
@Schema(
description = "Configuration for device transport",
discriminatorProperty = "type",
discriminatorMapping = {
@DiscriminatorMapping(value = "DEFAULT", schema = DefaultDeviceTransportConfiguration.class),
@DiscriminatorMapping(value = "MQTT", schema = MqttDeviceTransportConfiguration.class),
@DiscriminatorMapping(value = "COAP", schema = CoapDeviceTransportConfiguration.class),
@DiscriminatorMapping(value = "LWM2M", schema = Lwm2mDeviceTransportConfiguration.class),
@DiscriminatorMapping(value = "SNMP", schema = SnmpDeviceTransportConfiguration.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,

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

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.device.data;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum PowerMode {
PSM, DRX, E_DRX
}

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

@ -15,11 +15,13 @@
*/
package org.thingsboard.server.common.data.device.data;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
@Data
@Schema
public class PowerSavingConfiguration implements Serializable {
private static final long serialVersionUID = 2905389805488525362L;

12
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionSpec.java

@ -19,9 +19,20 @@ 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 java.io.Serializable;
@Schema(
description = "Specification for alarm conditions",
discriminatorProperty = "type",
discriminatorMapping = {
@DiscriminatorMapping(value = "SIMPLE", schema = SimpleAlarmConditionSpec.class),
@DiscriminatorMapping(value = "DURATION", schema = DurationAlarmConditionSpec.class),
@DiscriminatorMapping(value = "REPEATING", schema = RepeatingAlarmConditionSpec.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
@ -33,6 +44,7 @@ import java.io.Serializable;
@JsonSubTypes.Type(value = RepeatingAlarmConditionSpec.class, name = "REPEATING")})
public interface AlarmConditionSpec extends Serializable {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@JsonIgnore
AlarmConditionSpecType getType();

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

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.device.profile;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum AlarmConditionSpecType {
SIMPLE,

12
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmSchedule.java

@ -18,10 +18,21 @@ package org.thingsboard.server.common.data.device.profile;
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.query.DynamicValue;
import java.io.Serializable;
@Schema(
description = "Configuration for alarm schedule",
discriminatorProperty = "type",
discriminatorMapping = {
@DiscriminatorMapping(value = "ANY_TIME", schema = AnyTimeSchedule.class),
@DiscriminatorMapping(value = "SPECIFIC_TIME", schema = SpecificTimeSchedule.class),
@DiscriminatorMapping(value = "CUSTOM", schema = CustomTimeSchedule.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
@ -33,6 +44,7 @@ import java.io.Serializable;
@JsonSubTypes.Type(value = CustomTimeSchedule.class, name = "CUSTOM")})
public interface AlarmSchedule extends Serializable {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the alarm schedule")
AlarmScheduleType getType();
DynamicValue<String> getDynamicValue();

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

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.device.profile;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum AlarmScheduleType {
ANY_TIME,

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

@ -15,16 +15,19 @@
*/
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.DeviceTransportType;
import org.thingsboard.server.common.data.device.data.PowerSavingConfiguration;
@Schema
@Data
public class CoapDeviceProfileTransportConfiguration implements DeviceProfileTransportConfiguration {
private CoapDeviceTypeConfiguration coapDeviceTypeConfiguration;
private PowerSavingConfiguration clientSettings;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the device transport")
@Override
public DeviceTransportType getType() {
return DeviceTransportType.COAP;

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

@ -15,12 +15,15 @@
*/
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.DeviceProfileType;
@Schema(description = "Default device profile configuration", allOf = DeviceProfileConfiguration.class)
@Data
public class DefaultDeviceProfileConfiguration implements DeviceProfileConfiguration {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Device profile type")
@Override
public DeviceProfileType getType() {
return DeviceProfileType.DEFAULT;

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

@ -15,12 +15,15 @@
*/
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.DeviceTransportType;
@Schema
@Data
public class DefaultDeviceProfileTransportConfiguration implements DeviceProfileTransportConfiguration {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the device transport")
@Override
public DeviceTransportType getType() {
return DeviceTransportType.DEFAULT;

10
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/DeviceProfileConfiguration.java

@ -19,10 +19,19 @@ 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.DeviceProfileType;
import java.io.Serializable;
@Schema(
description = "Device profile configuration",
discriminatorProperty = "type",
discriminatorMapping = {
@DiscriminatorMapping(value = "DEFAULT", schema = DefaultDeviceProfileConfiguration.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
@ -32,6 +41,7 @@ import java.io.Serializable;
@JsonSubTypes.Type(value = DefaultDeviceProfileConfiguration.class, name = "DEFAULT")})
public interface DeviceProfileConfiguration extends Serializable {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Device profile type")
@JsonIgnore
DeviceProfileType getType();

14
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/DeviceProfileTransportConfiguration.java

@ -19,10 +19,23 @@ 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.DeviceTransportType;
import java.io.Serializable;
@Schema(
description = "Configuration for device profile transport",
discriminatorProperty = "type",
discriminatorMapping = {
@DiscriminatorMapping(value = "DEFAULT", schema = DefaultDeviceProfileTransportConfiguration.class),
@DiscriminatorMapping(value = "MQTT", schema = MqttDeviceProfileTransportConfiguration.class),
@DiscriminatorMapping(value = "LWM2M", schema = Lwm2mDeviceProfileTransportConfiguration.class),
@DiscriminatorMapping(value = "COAP", schema = CoapDeviceProfileTransportConfiguration.class),
@DiscriminatorMapping(value = "SNMP", schema = SnmpDeviceProfileTransportConfiguration.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
@ -37,6 +50,7 @@ import java.io.Serializable;
})
public interface DeviceProfileTransportConfiguration extends Serializable {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@JsonIgnore
DeviceTransportType getType();

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

@ -16,19 +16,24 @@
package org.thingsboard.server.common.data.device.profile;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.query.FilterPredicateValue;
import java.util.concurrent.TimeUnit;
@Schema(description = "Duration Alarm Condition Specification")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class DurationAlarmConditionSpec implements AlarmConditionSpec {
@Schema(description = "Duration time unit")
private TimeUnit unit;
@Schema(description = "Duration predicate")
private FilterPredicateValue<Long> predicate;
@Override
@Schema(description = "Type of the Alarm Condition Specification", requiredMode = Schema.RequiredMode.REQUIRED)
public AlarmConditionSpecType getType() {
return AlarmConditionSpecType.DURATION;
}

13
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/Lwm2mDeviceProfileTransportConfiguration.java

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.common.data.device.profile;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.DeviceTransportType;
import org.thingsboard.server.common.data.device.data.PowerMode;
@ -22,20 +24,25 @@ import org.thingsboard.server.common.data.device.profile.lwm2m.OtherConfiguratio
import org.thingsboard.server.common.data.device.profile.lwm2m.TelemetryMappingConfiguration;
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MBootstrapServerCredential;
import static org.eclipse.leshan.core.LwM2m.Version.V1_0;
import static org.thingsboard.server.common.data.device.profile.lwm2m.TelemetryObserveStrategy.SINGLE;
import java.util.Collections;
import java.util.List;
import static org.eclipse.leshan.core.LwM2m.Version.V1_0;
import static org.thingsboard.server.common.data.device.profile.lwm2m.TelemetryObserveStrategy.SINGLE;
@Data
@Schema
public class Lwm2mDeviceProfileTransportConfiguration implements DeviceProfileTransportConfiguration {
private static final long serialVersionUID = 6257277825459600068L;
@Schema(description = "Configuration for mapping LwM2M resources to telemetry and attributes")
private TelemetryMappingConfiguration observeAttr;
@Schema(description = "Flag indicating whether LwM2M bootstrap server update is enabled")
private boolean bootstrapServerUpdateEnable;
@ArraySchema(schema = @Schema(implementation = LwM2MBootstrapServerCredential.class))
private List<LwM2MBootstrapServerCredential> bootstrap;
@Schema(description = "Other LwM2M client settings")
private OtherConfiguration clientLwM2mSettings;
public Lwm2mDeviceProfileTransportConfiguration() {

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

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.common.data.device.profile;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.DeviceTransportType;
import org.thingsboard.server.common.data.StringUtils;
@ -26,18 +28,26 @@ import java.util.Set;
@Data
public class MqttDeviceProfileTransportConfiguration implements DeviceProfileTransportConfiguration {
@Schema
@NoXss
private String deviceTelemetryTopic = MqttTopics.DEVICE_TELEMETRY_TOPIC;
@Schema
@NoXss
private String deviceAttributesTopic = MqttTopics.DEVICE_ATTRIBUTES_TOPIC;
@Schema
@NoXss
private String deviceAttributesSubscribeTopic = MqttTopics.DEVICE_ATTRIBUTES_TOPIC;
@Schema
private TransportPayloadTypeConfiguration transportPayloadTypeConfiguration;
@Schema
private boolean sparkplug;
@ArraySchema(schema = @Schema(implementation = String.class))
private Set<String> sparkplugAttributesMetricNames;
@Schema
private boolean sendAckOnValidationException;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the device transport")
@Override
public DeviceTransportType getType() {
return DeviceTransportType.MQTT;

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

@ -16,16 +16,20 @@
package org.thingsboard.server.common.data.device.profile;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.query.FilterPredicateValue;
@Schema
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class RepeatingAlarmConditionSpec implements AlarmConditionSpec {
@Schema(description = "Repeating predicate")
private FilterPredicateValue<Integer> predicate;
@Override
@Schema(description = "Type of the Alarm Condition Specification", requiredMode = Schema.RequiredMode.REQUIRED)
public AlarmConditionSpecType getType() {
return AlarmConditionSpecType.REPEATING;
}

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

@ -16,12 +16,15 @@
package org.thingsboard.server.common.data.device.profile;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class SimpleAlarmConditionSpec implements AlarmConditionSpec {
@Override
@Schema(description = "Type of the Alarm Condition Specification", requiredMode = Schema.RequiredMode.REQUIRED)
public AlarmConditionSpecType getType() {
return AlarmConditionSpecType.SIMPLE;
}

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

@ -16,18 +16,23 @@
package org.thingsboard.server.common.data.device.profile;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.thingsboard.server.common.data.DeviceTransportType;
import org.thingsboard.server.common.data.transport.snmp.config.SnmpCommunicationConfig;
import java.util.List;
@Schema
@Data
public class SnmpDeviceProfileTransportConfiguration implements DeviceProfileTransportConfiguration {
private Integer timeoutMs;
private Integer retries;
@ArraySchema(schema = @Schema(implementation = SnmpCommunicationConfig.class))
private List<SnmpCommunicationConfig> communicationConfigs;
@Schema(requiredMode = Schema.RequiredMode.REQUIRED, description = "Type of the device transport")
@Override
public DeviceTransportType getType() {
return DeviceTransportType.SNMP;

13
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/TransportPayloadTypeConfiguration.java

@ -19,10 +19,20 @@ 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.TransportPayloadType;
import java.io.Serializable;
@Schema(
description = "Configuration for transport payload type",
discriminatorProperty = "transportPayloadType",
discriminatorMapping = {
@DiscriminatorMapping(value = "JSON", schema = JsonTransportPayloadConfiguration.class),
@DiscriminatorMapping(value = "PROTOBUF", schema = ProtoTransportPayloadConfiguration.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
@ -34,6 +44,9 @@ import java.io.Serializable;
public interface TransportPayloadTypeConfiguration extends Serializable {
@JsonIgnore
@Schema(
description = "Transport payload type", requiredMode = Schema.RequiredMode.REQUIRED
)
TransportPayloadType getTransportPayloadType();
}

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

@ -16,11 +16,13 @@
package org.thingsboard.server.common.data.device.profile.lwm2m;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.eclipse.leshan.core.LwM2m;
import java.io.Serializable;
@Schema
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ObjectAttributes implements Serializable {

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

@ -16,6 +16,7 @@
package org.thingsboard.server.common.data.device.profile.lwm2m;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -23,6 +24,7 @@ import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.device.data.PowerMode;
import org.thingsboard.server.common.data.device.data.PowerSavingConfiguration;
@Schema
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor

8
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/TelemetryMappingConfiguration.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.device.profile.lwm2m;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -27,15 +28,22 @@ import java.util.Set;
@Data
@NoArgsConstructor
@Schema
public class TelemetryMappingConfiguration implements Serializable {
private static final long serialVersionUID = -7594999741305410419L;
@Schema(description = "Map of LwM2M resource paths to telemetry key names")
private Map<String, String> keyName;
@Schema(description = "Set of resources to observe")
private Set<String> observe;
@Schema(description = "Set of attribute keys")
private Set<String> attribute;
@Schema(description = "Set of telemetry keys")
private Set<String> telemetry;
@Schema(description = "Map of resource paths to specific LwM2M object attributes")
private Map<String, ObjectAttributes> attributeLwm2m;
@Schema(description = "Observation strategy for telemetry")
private TelemetryObserveStrategy observeStrategy;
@JsonCreator

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

@ -15,8 +15,10 @@
*/
package org.thingsboard.server.common.data.device.profile.lwm2m;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
@Schema(enumAsRef = true)
public enum TelemetryObserveStrategy {
SINGLE("One resource equals one single observe request", 0),

14
common/data/src/main/java/org/thingsboard/server/common/data/event/EventFilter.java

@ -17,9 +17,21 @@ package org.thingsboard.server.common.data.event;
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;
@Schema
@Schema(
description = "Filter for various event types",
discriminatorProperty = "eventType",
discriminatorMapping = {
@DiscriminatorMapping(value = "DEBUG_RULE_NODE", schema = RuleNodeDebugEventFilter.class),
@DiscriminatorMapping(value = "DEBUG_RULE_CHAIN", schema = RuleChainDebugEventFilter.class),
@DiscriminatorMapping(value = "ERROR", schema = ErrorEventFilter.class),
@DiscriminatorMapping(value = "LC_EVENT", schema = LifeCycleEventFilter.class),
@DiscriminatorMapping(value = "STATS", schema = StatisticsEventFilter.class),
@DiscriminatorMapping(value = "DEBUG_CALCULATED_FIELD", schema = CalculatedFieldDebugEventFilter.class)
}
)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,

2
common/data/src/main/java/org/thingsboard/server/common/data/event/EventType.java

@ -15,8 +15,10 @@
*/
package org.thingsboard.server.common.data.event;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
@Schema(enumAsRef = true)
public enum EventType {
ERROR("error_event", "ERROR"),
LC_EVENT("lc_event", "LC_EVENT"),

2
common/data/src/main/java/org/thingsboard/server/common/data/housekeeper/HousekeeperTaskType.java

@ -15,9 +15,11 @@
*/
package org.thingsboard.server.common.data.housekeeper;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Schema(enumAsRef = true)
@RequiredArgsConstructor
@Getter
public enum HousekeeperTaskType {

21
common/data/src/main/java/org/thingsboard/server/common/data/job/JobResult.java

@ -20,6 +20,8 @@ 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 lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.job.task.TaskResult;
@ -28,6 +30,13 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Schema(
description = "Job execution result",
discriminatorProperty = "jobType",
discriminatorMapping = {
@DiscriminatorMapping(value = "DUMMY", schema = DummyJobResult.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "jobType")
@JsonSubTypes({
@ -37,15 +46,24 @@ import java.util.List;
@NoArgsConstructor
public abstract class JobResult implements Serializable {
@Schema(description = "Count of successfully completed tasks")
private int successfulCount;
@Schema(description = "Count of failed tasks")
private int failedCount;
@Schema(description = "Count of discarded tasks")
private int discardedCount;
private Integer totalCount = null; // set when all tasks are submitted
@Schema(description = "Total number of tasks, set when all tasks are submitted", nullable = true)
private Integer totalCount = null;
@Schema(description = "List of task results, preserving only first 100 errors")
private List<TaskResult> results = new ArrayList<>();
@Schema(description = "General error message if the job failed")
private String generalError;
@Schema(description = "Timestamp of the job start, in milliseconds")
private long startTs;
@Schema(description = "Timestamp of the job finish, in milliseconds")
private long finishTs;
@Schema(description = "Timestamp of the job cancellation, in milliseconds")
private long cancellationTs;
@JsonIgnore
@ -72,6 +90,7 @@ public abstract class JobResult implements Serializable {
}
}
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@JsonIgnore
public abstract JobType getJobType();

3
common/data/src/main/java/org/thingsboard/server/common/data/job/JobStatus.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.job;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum JobStatus {
QUEUED,

2
common/data/src/main/java/org/thingsboard/server/common/data/job/JobType.java

@ -15,9 +15,11 @@
*/
package org.thingsboard.server.common.data.job;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Schema(enumAsRef = true)
@RequiredArgsConstructor
@Getter
public enum JobType {

2
common/data/src/main/java/org/thingsboard/server/common/data/kv/DataType.java

@ -15,8 +15,10 @@
*/
package org.thingsboard.server.common.data.kv;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
@Schema(enumAsRef = true)
public enum DataType {
BOOLEAN(0),

3
common/data/src/main/java/org/thingsboard/server/common/data/kv/IntervalType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.kv;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum IntervalType {
MILLISECONDS, WEEK/*Sunday-Saturday*/, WEEK_ISO/*Monday-Sunday*/, MONTH, QUARTER

2
common/data/src/main/java/org/thingsboard/server/common/data/limit/LimitedApi.java

@ -15,12 +15,14 @@
*/
package org.thingsboard.server.common.data.limit;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
import java.util.Optional;
import java.util.function.Function;
@Schema(enumAsRef = true)
@Getter
public enum LimitedApi {

3
common/data/src/main/java/org/thingsboard/server/common/data/mail/MailOauth2Provider.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.mail;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum MailOauth2Provider {
GOOGLE("Google"), OFFICE_365("Office 365"), SENDGRID("SendGrid"), CUSTOM("Custom");

3
common/data/src/main/java/org/thingsboard/server/common/data/mobile/app/MobileAppStatus.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.mobile.app;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum MobileAppStatus {
DRAFT,

3
common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/DefaultPageId.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.mobile.layout;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum DefaultPageId {
HOME,

13
common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/MobilePage.java

@ -19,10 +19,22 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonView;
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
import io.swagger.v3.oas.annotations.media.Schema;
import org.thingsboard.server.common.data.Views;
import java.io.Serializable;
@Schema(
description = "Configuration for a mobile page",
discriminatorProperty = "type",
discriminatorMapping = {
@DiscriminatorMapping(value = "DEFAULT", schema = DefaultMobilePage.class),
@DiscriminatorMapping(value = "DASHBOARD", schema = DashboardPage.class),
@DiscriminatorMapping(value = "WEB_VIEW", schema = WebViewPage.class),
@DiscriminatorMapping(value = "CUSTOM", schema = CustomMobilePage.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
@ -36,6 +48,7 @@ import java.io.Serializable;
})
public interface MobilePage extends Serializable {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@JsonView(Views.Private.class)
MobilePageType getType();

3
common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/MobilePageType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.mobile.layout;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum MobilePageType {
DEFAULT,

4
common/data/src/main/java/org/thingsboard/server/common/data/mobile/qrCodeSettings/BadgePosition.java

@ -15,6 +15,10 @@
*/
package org.thingsboard.server.common.data.mobile.qrCodeSettings;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum BadgePosition {
RIGHT,

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

@ -15,9 +15,11 @@
*/
package org.thingsboard.server.common.data.notification;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Schema(enumAsRef = true)
@RequiredArgsConstructor
public enum NotificationDeliveryMethod {

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

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.notification;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum NotificationStatus {
SENT,
READ

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

@ -15,10 +15,12 @@
*/
package org.thingsboard.server.common.data.notification;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Schema(enumAsRef = true)
@AllArgsConstructor
@NoArgsConstructor
public enum NotificationType {

2
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/ResourcesShortageTrigger.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Data;
import org.thingsboard.server.common.data.id.EntityId;
@ -66,6 +67,7 @@ public class ResourcesShortageTrigger implements NotificationRuleTrigger {
return NotificationRuleTriggerType.RESOURCES_SHORTAGE;
}
@Schema(enumAsRef = true)
public enum Resource {
CPU, RAM, STORAGE
}

9
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/AlarmAssignmentNotificationRuleTriggerConfig.java

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -29,19 +31,26 @@ import java.util.Set;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema
public class AlarmAssignmentNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@ArraySchema(schema = @Schema(implementation = String.class))
private Set<String> alarmTypes;
@ArraySchema(schema = @Schema(implementation = AlarmSeverity.class))
private Set<AlarmSeverity> alarmSeverities;
@ArraySchema(schema = @Schema(implementation = AlarmSearchStatus.class))
private Set<AlarmSearchStatus> alarmStatuses;
@NotEmpty
@ArraySchema(schema = @Schema(implementation = Action.class))
private Set<Action> notifyOn;
@Override
@Schema(description = "Type of the notification rule trigger")
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.ALARM_ASSIGNMENT;
}
@Schema(enumAsRef = true)
public enum Action {
ASSIGNED, UNASSIGNED
}

9
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/AlarmCommentNotificationRuleTriggerConfig.java

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -28,15 +30,22 @@ import java.util.Set;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema
public class AlarmCommentNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@ArraySchema(schema = @Schema(implementation = String.class))
private Set<String> alarmTypes;
@ArraySchema(schema = @Schema(implementation = AlarmSeverity.class))
private Set<AlarmSeverity> alarmSeverities;
@ArraySchema(schema = @Schema(implementation = AlarmSearchStatus.class))
private Set<AlarmSearchStatus> alarmStatuses;
@Schema
private boolean onlyUserComments;
@Schema
private boolean notifyOnCommentUpdate;
@Override
@Schema(description = "Type of the notification rule trigger")
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.ALARM_COMMENT;
}

10
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/AlarmNotificationRuleTriggerConfig.java

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -30,16 +32,21 @@ import java.util.Set;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema
public class AlarmNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@ArraySchema(schema = @Schema(implementation = String.class))
private Set<String> alarmTypes;
@ArraySchema(schema = @Schema(implementation = AlarmSeverity.class))
private Set<AlarmSeverity> alarmSeverities;
@NotEmpty
@ArraySchema(schema = @Schema(implementation = AlarmAction.class))
private Set<AlarmAction> notifyOn;
@Schema
private ClearRule clearRule;
@Override
@Schema(description = "Type of the notification rule trigger")
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.ALARM;
}
@ -49,6 +56,7 @@ public class AlarmNotificationRuleTriggerConfig implements NotificationRuleTrigg
private Set<AlarmSearchStatus> alarmStatuses;
}
@Schema(enumAsRef = true)
public enum AlarmAction {
CREATED, SEVERITY_CHANGED, ACKNOWLEDGED, CLEARED
}

6
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/ApiUsageLimitNotificationRuleTriggerConfig.java

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -28,12 +30,16 @@ import java.util.Set;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema
public class ApiUsageLimitNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@ArraySchema(schema = @Schema(implementation = ApiFeature.class))
private Set<ApiFeature> apiFeatures;
@ArraySchema(schema = @Schema(implementation = ApiUsageStateValue.class))
private Set<ApiUsageStateValue> notifyOn;
@Override
@Schema(description = "Type of the notification rule trigger")
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.API_USAGE_LIMIT;
}

8
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/DeviceActivityNotificationRuleTriggerConfig.java

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -28,18 +30,24 @@ import java.util.UUID;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema
public class DeviceActivityNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@ArraySchema(schema = @Schema(implementation = UUID.class))
private Set<UUID> devices;
@ArraySchema(schema = @Schema(implementation = UUID.class))
private Set<UUID> deviceProfiles; // set either devices or profiles
@NotEmpty
@ArraySchema(schema = @Schema(implementation = DeviceEvent.class))
private Set<DeviceEvent> notifyOn;
@Override
@Schema(description = "Type of the notification rule trigger")
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.DEVICE_ACTIVITY;
}
@Schema(enumAsRef = true)
public enum DeviceEvent {
ACTIVE, INACTIVE
}

5
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/EdgeCommunicationFailureNotificationRuleTriggerConfig.java

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -27,11 +29,14 @@ import java.util.UUID;
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema
public class EdgeCommunicationFailureNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@ArraySchema(schema = @Schema(implementation = UUID.class))
private Set<UUID> edges; // if empty - all edges
@Override
@Schema(description = "Type of the notification rule trigger")
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.EDGE_COMMUNICATION_FAILURE;
}

7
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/EdgeConnectionNotificationRuleTriggerConfig.java

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -27,16 +29,21 @@ import java.util.UUID;
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema
public class EdgeConnectionNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@ArraySchema(schema = @Schema(implementation = UUID.class))
private Set<UUID> edges; // if empty - all edges
@ArraySchema(schema = @Schema(implementation = EdgeConnectivityEvent.class))
private Set<EdgeConnectivityEvent> notifyOn;
@Override
@Schema(description = "Type of the notification rule trigger")
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.EDGE_CONNECTION;
}
@Schema(enumAsRef = true)
public enum EdgeConnectivityEvent {
CONNECTED, DISCONNECTED
}

5
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/EntitiesLimitNotificationRuleTriggerConfig.java

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Max;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -28,13 +30,16 @@ import java.util.Set;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema
public class EntitiesLimitNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@ArraySchema(schema = @Schema(implementation = EntityType.class))
private Set<EntityType> entityTypes;
@Max(1)
private float threshold; // in percents,
@Override
@Schema(description = "Type of the notification rule trigger")
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.ENTITIES_LIMIT;
}

5
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/EntityActionNotificationRuleTriggerConfig.java

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -27,14 +29,17 @@ import java.util.Set;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema
public class EntityActionNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@ArraySchema(schema = @Schema(implementation = EntityType.class))
private Set<EntityType> entityTypes; // maybe add name filter ?
private boolean created;
private boolean updated;
private boolean deleted;
@Override
@Schema(description = "Type of the notification rule trigger")
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.ENTITY_ACTION;
}

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/NewPlatformVersionNotificationRuleTriggerConfig.java

@ -15,12 +15,15 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema
public class NewPlatformVersionNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@Override
@Schema(description = "Type of the notification rule trigger")
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.NEW_PLATFORM_VERSION;
}

24
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/NotificationRuleTriggerConfig.java

@ -20,9 +20,32 @@ 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 java.io.Serializable;
@Schema(
name = "NotificationRuleTriggerConfig",
description = "Configuration for notification rule trigger",
discriminatorProperty = "triggerType",
discriminatorMapping = {
@DiscriminatorMapping(value = "ALARM", schema = AlarmNotificationRuleTriggerConfig.class),
@DiscriminatorMapping(value = "DEVICE_ACTIVITY", schema = DeviceActivityNotificationRuleTriggerConfig.class),
@DiscriminatorMapping(value = "ENTITY_ACTION", schema = EntityActionNotificationRuleTriggerConfig.class),
@DiscriminatorMapping(value = "ALARM_COMMENT", schema = AlarmCommentNotificationRuleTriggerConfig.class),
@DiscriminatorMapping(value = "RULE_ENGINE_COMPONENT_LIFECYCLE_EVENT", schema = RuleEngineComponentLifecycleEventNotificationRuleTriggerConfig.class),
@DiscriminatorMapping(value = "ALARM_ASSIGNMENT", schema = AlarmAssignmentNotificationRuleTriggerConfig.class),
@DiscriminatorMapping(value = "NEW_PLATFORM_VERSION", schema = NewPlatformVersionNotificationRuleTriggerConfig.class),
@DiscriminatorMapping(value = "ENTITIES_LIMIT", schema = EntitiesLimitNotificationRuleTriggerConfig.class),
@DiscriminatorMapping(value = "API_USAGE_LIMIT", schema = ApiUsageLimitNotificationRuleTriggerConfig.class),
@DiscriminatorMapping(value = "RATE_LIMITS", schema = RateLimitsNotificationRuleTriggerConfig.class),
@DiscriminatorMapping(value = "EDGE_CONNECTION", schema = EdgeConnectionNotificationRuleTriggerConfig.class),
@DiscriminatorMapping(value = "EDGE_COMMUNICATION_FAILURE", schema = EdgeCommunicationFailureNotificationRuleTriggerConfig.class),
@DiscriminatorMapping(value = "TASK_PROCESSING_FAILURE", schema = TaskProcessingFailureNotificationRuleTriggerConfig.class),
@DiscriminatorMapping(value = "RESOURCES_SHORTAGE", schema = ResourcesShortageNotificationRuleTriggerConfig.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "triggerType")
@JsonSubTypes({
@ -43,6 +66,7 @@ import java.io.Serializable;
})
public interface NotificationRuleTriggerConfig extends Serializable {
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
NotificationRuleTriggerType getTriggerType();
@JsonIgnore

2
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/NotificationRuleTriggerType.java

@ -15,9 +15,11 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
@Getter
@Schema(enumAsRef = true)
public enum NotificationRuleTriggerType {
ENTITY_ACTION,

5
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/RateLimitsNotificationRuleTriggerConfig.java

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -28,11 +30,14 @@ import java.util.stream.Collectors;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema
public class RateLimitsNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@ArraySchema(schema = @Schema(implementation = LimitedApi.class))
private Set<LimitedApi> apis;
@Override
@Schema(description = "Type of the notification rule trigger")
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.RATE_LIMITS;
}

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/ResourcesShortageNotificationRuleTriggerConfig.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Max;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -27,6 +28,7 @@ import java.io.Serial;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema
public class ResourcesShortageNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@Serial
@ -40,6 +42,7 @@ public class ResourcesShortageNotificationRuleTriggerConfig implements Notificat
private float storageThreshold; // in percents
@Override
@Schema(description = "Type of the notification rule trigger")
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.RESOURCES_SHORTAGE;
}

8
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/RuleEngineComponentLifecycleEventNotificationRuleTriggerConfig.java

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -28,18 +30,22 @@ import java.util.UUID;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema
public class RuleEngineComponentLifecycleEventNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@ArraySchema(schema = @Schema(implementation = UUID.class))
private Set<UUID> ruleChains; // if empty - all rule chains
@ArraySchema(schema = @Schema(implementation = ComponentLifecycleEvent.class))
private Set<ComponentLifecycleEvent> ruleChainEvents; // available options: STARTED, UPDATED, STOPPED. if empty - all events
private boolean onlyRuleChainLifecycleFailures;
private boolean trackRuleNodeEvents;
@ArraySchema(schema = @Schema(implementation = ComponentLifecycleEvent.class))
private Set<ComponentLifecycleEvent> ruleNodeEvents; // available options: STARTED, UPDATED, STOPPED. if empty - all events
private boolean onlyRuleNodeLifecycleFailures;
@Override
@Schema(description = "Type of the notification rule trigger")
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.RULE_ENGINE_COMPONENT_LIFECYCLE_EVENT;
}

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/TaskProcessingFailureNotificationRuleTriggerConfig.java

@ -15,14 +15,17 @@
*/
package org.thingsboard.server.common.data.notification.rule.trigger.config;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
@Schema
public class TaskProcessingFailureNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@Override
@Schema(description = "Type of the notification rule trigger", requiredMode = Schema.RequiredMode.REQUIRED)
public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.TASK_PROCESSING_FAILURE;
}

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

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.notification.targets;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.thingsboard.server.common.data.notification.NotificationDeliveryMethod;
@ -22,6 +23,7 @@ import org.thingsboard.server.common.data.notification.NotificationDeliveryMetho
import java.util.Arrays;
import java.util.Set;
@Schema(enumAsRef = true)
@RequiredArgsConstructor
public enum NotificationTargetType {

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

@ -15,10 +15,12 @@
*/
package org.thingsboard.server.common.data.notification.targets.platform;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Schema(enumAsRef = true)
@AllArgsConstructor
@NoArgsConstructor
@Getter

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

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.notification.targets.slack;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum SlackConversationType {
DIRECT,
PUBLIC_CHANNEL,

15
common/data/src/main/java/org/thingsboard/server/common/data/notification/template/DeliveryMethodNotificationTemplate.java

@ -20,6 +20,8 @@ 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 jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -27,6 +29,18 @@ import org.thingsboard.server.common.data.notification.NotificationDeliveryMetho
import java.util.List;
@Schema(
description = "Base template for different delivery methods",
discriminatorProperty = "method",
discriminatorMapping = {
@DiscriminatorMapping(value = "WEB", schema = WebDeliveryMethodNotificationTemplate.class),
@DiscriminatorMapping(value = "EMAIL", schema = EmailDeliveryMethodNotificationTemplate.class),
@DiscriminatorMapping(value = "SMS", schema = SmsDeliveryMethodNotificationTemplate.class),
@DiscriminatorMapping(value = "SLACK", schema = SlackDeliveryMethodNotificationTemplate.class),
@DiscriminatorMapping(value = "MICROSOFT_TEAMS", schema = MicrosoftTeamsDeliveryMethodNotificationTemplate.class),
@DiscriminatorMapping(value = "MOBILE_APP", schema = MobileAppDeliveryMethodNotificationTemplate.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "method")
@JsonSubTypes({
@ -50,6 +64,7 @@ public abstract class DeliveryMethodNotificationTemplate {
this.body = other.body;
}
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@JsonIgnore
public abstract NotificationDeliveryMethod getMethod();

3
common/data/src/main/java/org/thingsboard/server/common/data/notification/template/EmailDeliveryMethodNotificationTemplate.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.notification.template;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -30,6 +31,7 @@ import java.util.List;
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Schema
public class EmailDeliveryMethodNotificationTemplate extends DeliveryMethodNotificationTemplate implements HasSubject {
@NoXss(fieldName = "email subject")
@ -47,6 +49,7 @@ public class EmailDeliveryMethodNotificationTemplate extends DeliveryMethodNotif
this.subject = other.subject;
}
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public NotificationDeliveryMethod getMethod() {
return NotificationDeliveryMethod.EMAIL;

12
common/data/src/main/java/org/thingsboard/server/common/data/notification/template/MicrosoftTeamsDeliveryMethodNotificationTemplate.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.notification.template;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@ -30,8 +31,17 @@ import java.util.UUID;
@ToString(callSuper = true)
public class MicrosoftTeamsDeliveryMethodNotificationTemplate extends DeliveryMethodNotificationTemplate implements HasSubject {
@Schema(
description = "The header or title shown at the top of the Teams message card.",
example = "System Alert: High CPU Usage"
)
private String subject;
@Schema(
description = "The hex color code for the accent bar on the left side of the Teams card.",
example = "0078D7"
)
private String themeColor;
@Schema(description = "Configuration for an optional call-to-action button within the Teams message.")
private Button button;
private final List<TemplatableValue> templatableValues = List.of(
@ -50,6 +60,7 @@ public class MicrosoftTeamsDeliveryMethodNotificationTemplate extends DeliveryMe
this.button = other.button != null ? new Button(other.button) : null;
}
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public NotificationDeliveryMethod getMethod() {
return NotificationDeliveryMethod.MICROSOFT_TEAMS;
@ -82,6 +93,7 @@ public class MicrosoftTeamsDeliveryMethodNotificationTemplate extends DeliveryMe
this.setEntityIdInState = other.setEntityIdInState;
}
@Schema(enumAsRef = true)
public enum LinkType {
LINK, DASHBOARD
}

4
common/data/src/main/java/org/thingsboard/server/common/data/notification/template/MobileAppDeliveryMethodNotificationTemplate.java

@ -16,6 +16,7 @@
package org.thingsboard.server.common.data.notification.template;
import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -31,8 +32,10 @@ import java.util.List;
@ToString(callSuper = true)
public class MobileAppDeliveryMethodNotificationTemplate extends DeliveryMethodNotificationTemplate implements HasSubject {
@Schema(description = "Subject line for the mobile notification", example = "New Message Received")
@NotEmpty
private String subject;
@Schema(description = "Additional JSON configuration for web buttons/actions", type = "object")
private JsonNode additionalConfig;
private final List<TemplatableValue> templatableValues = List.of(
@ -46,6 +49,7 @@ public class MobileAppDeliveryMethodNotificationTemplate extends DeliveryMethodN
this.additionalConfig = other.additionalConfig;
}
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public NotificationDeliveryMethod getMethod() {
return NotificationDeliveryMethod.MOBILE_APP;

2
common/data/src/main/java/org/thingsboard/server/common/data/notification/template/SlackDeliveryMethodNotificationTemplate.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.notification.template;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@ -44,6 +45,7 @@ public class SlackDeliveryMethodNotificationTemplate extends DeliveryMethodNotif
return super.getBody();
}
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public NotificationDeliveryMethod getMethod() {
return NotificationDeliveryMethod.SLACK;

2
common/data/src/main/java/org/thingsboard/server/common/data/notification/template/SmsDeliveryMethodNotificationTemplate.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.common.data.notification.template;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@ -46,6 +47,7 @@ public class SmsDeliveryMethodNotificationTemplate extends DeliveryMethodNotific
return super.getBody();
}
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public NotificationDeliveryMethod getMethod() {
return NotificationDeliveryMethod.SMS;

4
common/data/src/main/java/org/thingsboard/server/common/data/notification/template/WebDeliveryMethodNotificationTemplate.java

@ -19,6 +19,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.TextNode;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -37,10 +38,12 @@ import java.util.Optional;
@ToString(callSuper = true)
public class WebDeliveryMethodNotificationTemplate extends DeliveryMethodNotificationTemplate implements HasSubject {
@Schema(description = "Subject line for the web notification", example = "New Message Received")
@NoXss(fieldName = "web notification subject")
@Length(fieldName = "web notification subject", max = 150, message = "cannot be longer than 150 chars")
@NotEmpty
private String subject;
@Schema(description = "Additional JSON configuration for web buttons/actions")
private JsonNode additionalConfig;
private final List<TemplatableValue> templatableValues = List.of(
@ -103,6 +106,7 @@ public class WebDeliveryMethodNotificationTemplate extends DeliveryMethodNotific
.map(config -> (ObjectNode) config);
}
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
@Override
public NotificationDeliveryMethod getMethod() {
return NotificationDeliveryMethod.WEB;

3
common/data/src/main/java/org/thingsboard/server/common/data/oauth2/MapperType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.oauth2;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum MapperType {
BASIC, CUSTOM, GITHUB, APPLE;
}

3
common/data/src/main/java/org/thingsboard/server/common/data/oauth2/PlatformType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.oauth2;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum PlatformType {
WEB, ANDROID, IOS
}

3
common/data/src/main/java/org/thingsboard/server/common/data/oauth2/SchemeType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.oauth2;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum SchemeType {
HTTP, HTTPS, MIXED;
}

3
common/data/src/main/java/org/thingsboard/server/common/data/oauth2/TenantNameStrategyType.java

@ -15,6 +15,9 @@
*/
package org.thingsboard.server.common.data.oauth2;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(enumAsRef = true)
public enum TenantNameStrategyType {
DOMAIN, EMAIL, CUSTOM;
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save