From f12ded5f9b21f2aa5f15860c8697cdfd13494b9f Mon Sep 17 00:00:00 2001 From: Andrii Landiak Date: Fri, 30 May 2025 11:57:05 +0300 Subject: [PATCH 1/2] Fix getTenantId for AbstractOAuth2ClientMapper --- .../oauth2/AbstractOAuth2ClientMapper.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/AbstractOAuth2ClientMapper.java b/application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/AbstractOAuth2ClientMapper.java index 522255e012..d1c485fb7d 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/AbstractOAuth2ClientMapper.java +++ b/application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/AbstractOAuth2ClientMapper.java @@ -34,9 +34,10 @@ import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.IdBased; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.oauth2.OAuth2MapperConfig; import org.thingsboard.server.common.data.oauth2.OAuth2Client; +import org.thingsboard.server.common.data.oauth2.OAuth2MapperConfig; import org.thingsboard.server.common.data.page.PageData; +import org.thingsboard.server.common.data.page.PageDataIterable; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.UserCredentials; @@ -52,13 +53,13 @@ import org.thingsboard.server.service.install.InstallScripts; import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.model.UserPrincipal; -import java.util.List; import java.util.Optional; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @Slf4j public abstract class AbstractOAuth2ClientMapper { + private static final int DASHBOARDS_REQUEST_LIMIT = 10; @Autowired @@ -174,16 +175,16 @@ public abstract class AbstractOAuth2ClientMapper { } private TenantId getTenantId(String tenantName) throws Exception { - List tenants = tenantService.findTenants(new PageLink(1, 0, tenantName)).getData(); - Tenant tenant; - if (tenants == null || tenants.isEmpty()) { - tenant = new Tenant(); - tenant.setTitle(tenantName); - tenant = tbTenantService.save(tenant); - } else { - tenant = tenants.get(0); + PageDataIterable tenantIterator = new PageDataIterable<>(tenantService::findTenants, 1024); + for (Tenant tenant : tenantIterator) { + if (tenant.getTitle().equals(tenantName)) { + return tenant.getId(); + } } - return tenant.getTenantId(); + Tenant tenant = new Tenant(); + tenant.setTitle(tenantName); + tenant = tbTenantService.save(tenant); + return tenant.getId(); } private CustomerId getCustomerId(TenantId tenantId, String customerName) { @@ -220,4 +221,5 @@ public abstract class AbstractOAuth2ClientMapper { } while (dashboardsPage.hasNext()); return Optional.empty(); } + } From 5fb317c57d361c6670bc9e94824292ec2279c3b7 Mon Sep 17 00:00:00 2001 From: Andrii Landiak Date: Fri, 30 May 2025 12:24:17 +0300 Subject: [PATCH 2/2] Introduce findTenantByName --- .../oauth2/AbstractOAuth2ClientMapper.java | 26 +++++-------------- .../server/dao/tenant/TenantService.java | 3 +++ .../server/dao/sql/tenant/JpaTenantDao.java | 10 ++++--- .../dao/sql/tenant/TenantRepository.java | 5 +++- .../server/dao/tenant/TenantDao.java | 14 ++-------- .../server/dao/tenant/TenantServiceImpl.java | 6 +++++ 6 files changed, 28 insertions(+), 36 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/AbstractOAuth2ClientMapper.java b/application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/AbstractOAuth2ClientMapper.java index d1c485fb7d..e397a6f1a2 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/AbstractOAuth2ClientMapper.java +++ b/application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/AbstractOAuth2ClientMapper.java @@ -20,7 +20,6 @@ import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -37,7 +36,6 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.oauth2.OAuth2Client; import org.thingsboard.server.common.data.oauth2.OAuth2MapperConfig; import org.thingsboard.server.common.data.page.PageData; -import org.thingsboard.server.common.data.page.PageDataIterable; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.UserCredentials; @@ -49,7 +47,6 @@ import org.thingsboard.server.dao.tenant.TenantService; import org.thingsboard.server.dao.user.UserService; import org.thingsboard.server.service.entitiy.tenant.TbTenantService; import org.thingsboard.server.service.entitiy.user.TbUserService; -import org.thingsboard.server.service.install.InstallScripts; import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.model.UserPrincipal; @@ -80,18 +77,12 @@ public abstract class AbstractOAuth2ClientMapper { @Autowired private DashboardService dashboardService; - @Autowired - private InstallScripts installScripts; - @Autowired private TbUserService tbUserService; @Autowired protected TbTenantProfileCache tenantProfileCache; - @Autowired - private ApplicationEventPublisher eventPublisher; - @Value("${edges.enabled}") @Getter private boolean edgesEnabled; @@ -121,8 +112,7 @@ public abstract class AbstractOAuth2ClientMapper { } else { user.setAuthority(Authority.CUSTOMER_USER); } - TenantId tenantId = oauth2User.getTenantId() != null ? - oauth2User.getTenantId() : getTenantId(oauth2User.getTenantName()); + TenantId tenantId = oauth2User.getTenantId() != null ? oauth2User.getTenantId() : getTenantId(oauth2User.getTenantName()); user.setTenantId(tenantId); CustomerId customerId = oauth2User.getCustomerId() != null ? oauth2User.getCustomerId() : getCustomerId(user.getTenantId(), oauth2User.getCustomerName()); @@ -174,15 +164,13 @@ public abstract class AbstractOAuth2ClientMapper { } } - private TenantId getTenantId(String tenantName) throws Exception { - PageDataIterable tenantIterator = new PageDataIterable<>(tenantService::findTenants, 1024); - for (Tenant tenant : tenantIterator) { - if (tenant.getTitle().equals(tenantName)) { - return tenant.getId(); - } + private TenantId getTenantId(String name) throws Exception { + Tenant tenant = tenantService.findTenantByName(name); + if (tenant != null) { + return tenant.getId(); } - Tenant tenant = new Tenant(); - tenant.setTitle(tenantName); + tenant = new Tenant(); + tenant.setTitle(name); tenant = tbTenantService.save(tenant); return tenant.getId(); } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantService.java index a7a774b83a..d70bcef209 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/tenant/TenantService.java @@ -49,7 +49,10 @@ public interface TenantService extends EntityDaoService { List findTenantIdsByTenantProfileId(TenantProfileId tenantProfileId); + Tenant findTenantByName(String name); + void deleteTenants(); PageData findTenantsIds(PageLink pageLink); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java index d031dbb8ee..c125de60a7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java @@ -38,10 +38,6 @@ import java.util.List; import java.util.UUID; import java.util.stream.Collectors; - -/** - * Created by Valerii Sosliuk on 4/30/2017. - */ @Component @SqlDao public class JpaTenantDao extends JpaAbstractDao implements TenantDao { @@ -97,8 +93,14 @@ public class JpaTenantDao extends JpaAbstractDao implement .collect(Collectors.toList()); } + @Override + public Tenant findTenantByName(TenantId tenantId, String name) { + return DaoUtil.getData(tenantRepository.findTenantByTitle(name)); + } + @Override public List findNextBatch(UUID id, int batchSize) { return tenantRepository.findNextBatch(id, Limit.of(batchSize)); } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java index bafa9a6fe6..491257b318 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java @@ -48,7 +48,7 @@ public interface TenantRepository extends JpaRepository { "LEFT JOIN TenantProfileEntity p on p.id = t.tenantProfileId " + "WHERE (:textSearch IS NULL OR ilike(t.title, CONCAT('%', :textSearch, '%')) = true)") Page findTenantInfosNextPage(@Param("textSearch") String textSearch, - Pageable pageable); + Pageable pageable); @Query("SELECT t.id FROM TenantEntity t") Page findTenantsIds(Pageable pageable); @@ -59,4 +59,7 @@ public interface TenantRepository extends JpaRepository { @Query("SELECT new org.thingsboard.server.common.data.edqs.fields.TenantFields(t.id, t.createdTime, t.title, t.version," + "t.additionalInfo, t.country, t.state, t.city, t.address, t.address2, t.zip, t.phone, t.email, t.region) FROM TenantEntity t WHERE t.id > :id ORDER BY t.id") List findNextBatch(@Param("id") UUID id, Limit limit); + + TenantEntity findTenantByTitle(String name); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantDao.java b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantDao.java index 2a8269b15d..8ff3999c4e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantDao.java @@ -30,20 +30,8 @@ public interface TenantDao extends Dao { TenantInfo findTenantInfoById(TenantId tenantId, UUID id); - /** - * Save or update tenant object - * - * @param tenant the tenant object - * @return saved tenant object - */ Tenant save(TenantId tenantId, Tenant tenant); - /** - * Find tenants by page link. - * - * @param pageLink the page link - * @return the list of tenant objects - */ PageData findTenants(TenantId tenantId, PageLink pageLink); PageData findTenantInfos(TenantId tenantId, PageLink pageLink); @@ -52,4 +40,6 @@ public interface TenantDao extends Dao { List findTenantIdsByTenantProfileId(TenantProfileId tenantProfileId); + Tenant findTenantByName(TenantId tenantId, String name); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java index 02bfe5defb..b9d09e55ba 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java @@ -206,6 +206,12 @@ public class TenantServiceImpl extends AbstractCachedEntityService