From e695ce32837487ea9796e02c49c525d0ecc9ac14 Mon Sep 17 00:00:00 2001 From: Dmytro Skarzhynets Date: Fri, 16 May 2025 15:26:43 +0300 Subject: [PATCH] AI rule node: make name of the AI settings unique within the scope of the tenant --- application/src/main/data/upgrade/basic/schema_update.sql | 3 ++- .../org/thingsboard/server/common/data/ai/AiSettings.java | 2 +- .../thingsboard/server/dao/ai/AiSettingsServiceImpl.java | 8 +++++++- dao/src/main/resources/sql/schema-entities.sql | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/application/src/main/data/upgrade/basic/schema_update.sql b/application/src/main/data/upgrade/basic/schema_update.sql index 8bd41a9208..f25ca02939 100644 --- a/application/src/main/data/upgrade/basic/schema_update.sql +++ b/application/src/main/data/upgrade/basic/schema_update.sql @@ -22,5 +22,6 @@ CREATE TABLE ai_settings ( name VARCHAR(255) NOT NULL, provider VARCHAR(255) NOT NULL, model VARCHAR(255) NOT NULL, - api_key VARCHAR(1000) NOT NULL + api_key VARCHAR(1000) NOT NULL, + CONSTRAINT ai_settings_name_unq_key UNIQUE (tenant_id, name) ); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/ai/AiSettings.java b/common/data/src/main/java/org/thingsboard/server/common/data/ai/AiSettings.java index 64a2231ef7..162828da8d 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/ai/AiSettings.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/ai/AiSettings.java @@ -58,7 +58,7 @@ public final class AiSettings extends BaseData implements HasTenan @Schema( requiredMode = Schema.RequiredMode.REQUIRED, accessMode = Schema.AccessMode.READ_WRITE, - description = "Human-readable name of the AI settings", + description = "Human-readable name of the AI settings; must be unique within the scope of the tenant", example = "Default AI Settings" ) String name; diff --git a/dao/src/main/java/org/thingsboard/server/dao/ai/AiSettingsServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/ai/AiSettingsServiceImpl.java index 35710819a6..ca23b6bc56 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/ai/AiSettingsServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/ai/AiSettingsServiceImpl.java @@ -28,6 +28,7 @@ import org.thingsboard.server.common.data.page.PageLink; import java.util.Optional; +import static org.thingsboard.server.dao.entity.AbstractEntityService.checkConstraintViolation; import static org.thingsboard.server.dao.service.Validator.validatePageLink; @Service @@ -38,7 +39,12 @@ class AiSettingsServiceImpl implements AiSettingsService { @Override public AiSettings save(AiSettings aiSettings) { - return aiSettingsDao.saveAndFlush(aiSettings.getTenantId(), aiSettings); + try { + return aiSettingsDao.saveAndFlush(aiSettings.getTenantId(), aiSettings); + } catch (Exception e) { + checkConstraintViolation(e, "ai_settings_name_unq_key", "AI settings record with such name already exists!"); + throw e; + } } @Override diff --git a/dao/src/main/resources/sql/schema-entities.sql b/dao/src/main/resources/sql/schema-entities.sql index aaff15b2d4..9d5ae69c95 100644 --- a/dao/src/main/resources/sql/schema-entities.sql +++ b/dao/src/main/resources/sql/schema-entities.sql @@ -957,5 +957,6 @@ CREATE TABLE IF NOT EXISTS ai_settings ( name VARCHAR(255) NOT NULL, provider VARCHAR(255) NOT NULL, model VARCHAR(255) NOT NULL, - api_key VARCHAR(1000) NOT NULL + api_key VARCHAR(1000) NOT NULL, + CONSTRAINT ai_settings_name_unq_key UNIQUE (tenant_id, name) );