Commit a1d9ce6e45a709104328cc4724590c872e18749c
1 parent
4eccf7f9
created validateNumberOfEntitiesPerTenant
Showing
22 changed files
with
68 additions
and
80 deletions
... | ... | @@ -23,6 +23,7 @@ import org.thingsboard.server.common.data.id.TenantId; |
23 | 23 | import org.thingsboard.server.common.data.page.PageData; |
24 | 24 | import org.thingsboard.server.common.data.page.PageLink; |
25 | 25 | import org.thingsboard.server.dao.Dao; |
26 | +import org.thingsboard.server.dao.TenantEntityDao; | |
26 | 27 | |
27 | 28 | import java.util.List; |
28 | 29 | import java.util.Optional; |
... | ... | @@ -32,7 +33,7 @@ import java.util.UUID; |
32 | 33 | * The Interface AssetDao. |
33 | 34 | * |
34 | 35 | */ |
35 | -public interface AssetDao extends Dao<Asset> { | |
36 | +public interface AssetDao extends Dao<Asset>, TenantEntityDao { | |
36 | 37 | |
37 | 38 | /** |
38 | 39 | * Find asset info by id. |
... | ... | @@ -166,6 +167,4 @@ public interface AssetDao extends Dao<Asset> { |
166 | 167 | */ |
167 | 168 | ListenableFuture<List<EntitySubtype>> findTenantAssetTypesAsync(UUID tenantId); |
168 | 169 | |
169 | - Long countAssetsByTenantId(TenantId tenantId); | |
170 | - | |
171 | 170 | } | ... | ... |
... | ... | @@ -330,12 +330,7 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ |
330 | 330 | DefaultTenantProfileConfiguration profileConfiguration = |
331 | 331 | (DefaultTenantProfileConfiguration)tenantProfileCache.get(tenantId).getProfileData().getConfiguration(); |
332 | 332 | long maxAssets = profileConfiguration.getMaxAssets(); |
333 | - if (maxAssets > 0) { | |
334 | - long currentAssetsCount = assetDao.countAssetsByTenantId(tenantId); | |
335 | - if (currentAssetsCount >= maxAssets) { | |
336 | - throw new DataValidationException("Can't create assets more then " + maxAssets); | |
337 | - } | |
338 | - } | |
333 | + validateNumberOfEntitiesPerTenant(tenantId, assetDao, maxAssets, EntityType.ASSET); | |
339 | 334 | } |
340 | 335 | |
341 | 336 | @Override | ... | ... |
... | ... | @@ -20,6 +20,7 @@ import org.thingsboard.server.common.data.id.TenantId; |
20 | 20 | import org.thingsboard.server.common.data.page.PageData; |
21 | 21 | import org.thingsboard.server.common.data.page.PageLink; |
22 | 22 | import org.thingsboard.server.dao.Dao; |
23 | +import org.thingsboard.server.dao.TenantEntityDao; | |
23 | 24 | |
24 | 25 | import java.util.Optional; |
25 | 26 | import java.util.UUID; |
... | ... | @@ -27,7 +28,7 @@ import java.util.UUID; |
27 | 28 | /** |
28 | 29 | * The Interface CustomerDao. |
29 | 30 | */ |
30 | -public interface CustomerDao extends Dao<Customer> { | |
31 | +public interface CustomerDao extends Dao<Customer>, TenantEntityDao { | |
31 | 32 | |
32 | 33 | /** |
33 | 34 | * Save or update customer object |
... | ... | @@ -55,6 +56,4 @@ public interface CustomerDao extends Dao<Customer> { |
55 | 56 | */ |
56 | 57 | Optional<Customer> findCustomersByTenantIdAndTitle(UUID tenantId, String title); |
57 | 58 | |
58 | - Long countCustomersByTenantId(TenantId tenantId); | |
59 | - | |
60 | 59 | } | ... | ... |
... | ... | @@ -24,6 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; |
24 | 24 | import org.springframework.context.annotation.Lazy; |
25 | 25 | import org.springframework.stereotype.Service; |
26 | 26 | import org.thingsboard.server.common.data.Customer; |
27 | +import org.thingsboard.server.common.data.EntityType; | |
27 | 28 | import org.thingsboard.server.common.data.Tenant; |
28 | 29 | import org.thingsboard.server.common.data.id.CustomerId; |
29 | 30 | import org.thingsboard.server.common.data.id.TenantId; |
... | ... | @@ -172,12 +173,8 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom |
172 | 173 | DefaultTenantProfileConfiguration profileConfiguration = |
173 | 174 | (DefaultTenantProfileConfiguration)tenantProfileCache.get(tenantId).getProfileData().getConfiguration(); |
174 | 175 | long maxCustomers = profileConfiguration.getMaxCustomers(); |
175 | - if (maxCustomers > 0) { | |
176 | - long currentCustomersCount = customerDao.countCustomersByTenantId(tenantId); | |
177 | - if (currentCustomersCount >= maxCustomers) { | |
178 | - throw new DataValidationException("Can't create customers more then " + maxCustomers); | |
179 | - } | |
180 | - } | |
176 | + | |
177 | + validateNumberOfEntitiesPerTenant(tenantId, customerDao, maxCustomers, EntityType.CUSTOMER); | |
181 | 178 | customerDao.findCustomersByTenantIdAndTitle(customer.getTenantId().getId(), customer.getTitle()).ifPresent( |
182 | 179 | c -> { |
183 | 180 | throw new DataValidationException("Customer with such title already exists!"); | ... | ... |
... | ... | @@ -18,11 +18,12 @@ package org.thingsboard.server.dao.dashboard; |
18 | 18 | import org.thingsboard.server.common.data.Dashboard; |
19 | 19 | import org.thingsboard.server.common.data.id.TenantId; |
20 | 20 | import org.thingsboard.server.dao.Dao; |
21 | +import org.thingsboard.server.dao.TenantEntityDao; | |
21 | 22 | |
22 | 23 | /** |
23 | 24 | * The Interface DashboardDao. |
24 | 25 | */ |
25 | -public interface DashboardDao extends Dao<Dashboard> { | |
26 | +public interface DashboardDao extends Dao<Dashboard>, TenantEntityDao { | |
26 | 27 | |
27 | 28 | /** |
28 | 29 | * Save or update dashboard object |
... | ... | @@ -31,6 +32,4 @@ public interface DashboardDao extends Dao<Dashboard> { |
31 | 32 | * @return saved dashboard object |
32 | 33 | */ |
33 | 34 | Dashboard save(TenantId tenantId, Dashboard dashboard); |
34 | - | |
35 | - Long countDashboardsByTenantId(TenantId tenantId); | |
36 | 35 | } | ... | ... |
... | ... | @@ -24,6 +24,7 @@ import org.springframework.stereotype.Service; |
24 | 24 | import org.thingsboard.server.common.data.Customer; |
25 | 25 | import org.thingsboard.server.common.data.Dashboard; |
26 | 26 | import org.thingsboard.server.common.data.DashboardInfo; |
27 | +import org.thingsboard.server.common.data.EntityType; | |
27 | 28 | import org.thingsboard.server.common.data.Tenant; |
28 | 29 | import org.thingsboard.server.common.data.id.CustomerId; |
29 | 30 | import org.thingsboard.server.common.data.id.DashboardId; |
... | ... | @@ -226,12 +227,7 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb |
226 | 227 | DefaultTenantProfileConfiguration profileConfiguration = |
227 | 228 | (DefaultTenantProfileConfiguration)tenantProfileCache.get(tenantId).getProfileData().getConfiguration(); |
228 | 229 | long maxDashboards = profileConfiguration.getMaxDashboards(); |
229 | - if (maxDashboards > 0) { | |
230 | - long currentDashboardsCount = dashboardDao.countDashboardsByTenantId(tenantId); | |
231 | - if (currentDashboardsCount >= maxDashboards) { | |
232 | - throw new DataValidationException("Can't create dashboards more then " + maxDashboards); | |
233 | - } | |
234 | - } | |
230 | + validateNumberOfEntitiesPerTenant(tenantId, dashboardDao, maxDashboards, EntityType.DASHBOARD); | |
235 | 231 | } |
236 | 232 | |
237 | 233 | @Override | ... | ... |
... | ... | @@ -23,6 +23,7 @@ import org.thingsboard.server.common.data.id.TenantId; |
23 | 23 | import org.thingsboard.server.common.data.page.PageData; |
24 | 24 | import org.thingsboard.server.common.data.page.PageLink; |
25 | 25 | import org.thingsboard.server.dao.Dao; |
26 | +import org.thingsboard.server.dao.TenantEntityDao; | |
26 | 27 | |
27 | 28 | import java.util.List; |
28 | 29 | import java.util.Optional; |
... | ... | @@ -32,7 +33,7 @@ import java.util.UUID; |
32 | 33 | * The Interface DeviceDao. |
33 | 34 | * |
34 | 35 | */ |
35 | -public interface DeviceDao extends Dao<Device> { | |
36 | +public interface DeviceDao extends Dao<Device>, TenantEntityDao { | |
36 | 37 | |
37 | 38 | /** |
38 | 39 | * Find device info by id. |
... | ... | @@ -203,8 +204,6 @@ public interface DeviceDao extends Dao<Device> { |
203 | 204 | */ |
204 | 205 | ListenableFuture<Device> findDeviceByTenantIdAndIdAsync(TenantId tenantId, UUID id); |
205 | 206 | |
206 | - Long countDevicesByTenantId(TenantId tenantId); | |
207 | - | |
208 | 207 | Long countDevicesByDeviceProfileId(TenantId tenantId, UUID deviceProfileId); |
209 | 208 | |
210 | 209 | /** | ... | ... |
... | ... | @@ -530,12 +530,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe |
530 | 530 | DefaultTenantProfileConfiguration profileConfiguration = |
531 | 531 | (DefaultTenantProfileConfiguration)tenantProfileCache.get(tenantId).getProfileData().getConfiguration(); |
532 | 532 | long maxDevices = profileConfiguration.getMaxDevices(); |
533 | - if (maxDevices > 0) { | |
534 | - long currentDevicesCount = deviceDao.countDevicesByTenantId(tenantId); | |
535 | - if (currentDevicesCount >= maxDevices) { | |
536 | - throw new DataValidationException("Can't create devices more then " + maxDevices); | |
537 | - } | |
538 | - } | |
533 | + validateNumberOfEntitiesPerTenant(tenantId, deviceDao, maxDevices, EntityType.DEVICE); | |
539 | 534 | } |
540 | 535 | |
541 | 536 | @Override | ... | ... |
... | ... | @@ -37,12 +37,11 @@ public abstract class AbstractEntityService { |
37 | 37 | |
38 | 38 | protected Optional<ConstraintViolationException> extractConstraintViolationException(Exception t) { |
39 | 39 | if (t instanceof ConstraintViolationException) { |
40 | - return Optional.of ((ConstraintViolationException) t); | |
40 | + return Optional.of((ConstraintViolationException) t); | |
41 | 41 | } else if (t.getCause() instanceof ConstraintViolationException) { |
42 | - return Optional.of ((ConstraintViolationException) (t.getCause())); | |
42 | + return Optional.of((ConstraintViolationException) (t.getCause())); | |
43 | 43 | } else { |
44 | 44 | return Optional.empty(); |
45 | 45 | } |
46 | 46 | } |
47 | - | |
48 | 47 | } | ... | ... |
... | ... | @@ -592,12 +592,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC |
592 | 592 | DefaultTenantProfileConfiguration profileConfiguration = |
593 | 593 | (DefaultTenantProfileConfiguration)tenantProfileCache.get(tenantId).getProfileData().getConfiguration(); |
594 | 594 | long maxRuleChains = profileConfiguration.getMaxRuleChains(); |
595 | - if (maxRuleChains > 0) { | |
596 | - long currentRuleChainsCount = ruleChainDao.countRuleChainsByTenantId(tenantId); | |
597 | - if (currentRuleChainsCount >= maxRuleChains) { | |
598 | - throw new DataValidationException("Can't create rule chains more then " + maxRuleChains); | |
599 | - } | |
600 | - } | |
595 | + validateNumberOfEntitiesPerTenant(tenantId, ruleChainDao, maxRuleChains, EntityType.RULE_CHAIN); | |
601 | 596 | } |
602 | 597 | |
603 | 598 | @Override | ... | ... |
... | ... | @@ -15,18 +15,18 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.dao.rule; |
17 | 17 | |
18 | -import org.thingsboard.server.common.data.id.TenantId; | |
19 | 18 | import org.thingsboard.server.common.data.page.PageData; |
20 | 19 | import org.thingsboard.server.common.data.page.PageLink; |
21 | 20 | import org.thingsboard.server.common.data.rule.RuleChain; |
22 | 21 | import org.thingsboard.server.dao.Dao; |
22 | +import org.thingsboard.server.dao.TenantEntityDao; | |
23 | 23 | |
24 | 24 | import java.util.UUID; |
25 | 25 | |
26 | 26 | /** |
27 | 27 | * Created by igor on 3/12/18. |
28 | 28 | */ |
29 | -public interface RuleChainDao extends Dao<RuleChain> { | |
29 | +public interface RuleChainDao extends Dao<RuleChain>, TenantEntityDao { | |
30 | 30 | |
31 | 31 | /** |
32 | 32 | * Find rule chains by tenantId and page link. |
... | ... | @@ -36,6 +36,4 @@ public interface RuleChainDao extends Dao<RuleChain> { |
36 | 36 | * @return the list of rule chain objects |
37 | 37 | */ |
38 | 38 | PageData<RuleChain> findRuleChainsByTenantId(UUID tenantId, PageLink pageLink); |
39 | - | |
40 | - Long countRuleChainsByTenantId(TenantId tenantId); | |
41 | 39 | } | ... | ... |
... | ... | @@ -18,7 +18,9 @@ package org.thingsboard.server.dao.service; |
18 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
19 | 19 | import lombok.extern.slf4j.Slf4j; |
20 | 20 | import org.thingsboard.server.common.data.BaseData; |
21 | +import org.thingsboard.server.common.data.EntityType; | |
21 | 22 | import org.thingsboard.server.common.data.id.TenantId; |
23 | +import org.thingsboard.server.dao.TenantEntityDao; | |
22 | 24 | import org.thingsboard.server.dao.exception.DataValidationException; |
23 | 25 | |
24 | 26 | import java.util.HashSet; |
... | ... | @@ -79,6 +81,19 @@ public abstract class DataValidator<D extends BaseData<?>> { |
79 | 81 | return emailMatcher.matches(); |
80 | 82 | } |
81 | 83 | |
84 | + protected void validateNumberOfEntitiesPerTenant(TenantId tenantId, | |
85 | + TenantEntityDao tenantEntityDao, | |
86 | + long maxEntities, | |
87 | + EntityType entityType) { | |
88 | + if (maxEntities > 0) { | |
89 | + long currentEntitiesCount = tenantEntityDao.countByTenantId(tenantId); | |
90 | + if (currentEntitiesCount >= maxEntities) { | |
91 | + throw new DataValidationException(String.format("Can't create more then %d %ss!", | |
92 | + maxEntities, entityType.name().toLowerCase().replaceAll("_", " "))); | |
93 | + } | |
94 | + } | |
95 | + } | |
96 | + | |
82 | 97 | protected static void validateJsonStructure(JsonNode expectedNode, JsonNode actualNode) { |
83 | 98 | Set<String> expectedFields = new HashSet<>(); |
84 | 99 | Iterator<String> fieldsIterator = expectedNode.fieldNames(); | ... | ... |
... | ... | @@ -178,8 +178,7 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im |
178 | 178 | } |
179 | 179 | |
180 | 180 | @Override |
181 | - public Long countAssetsByTenantId(TenantId tenantId) { | |
181 | + public Long countByTenantId(TenantId tenantId) { | |
182 | 182 | return assetRepository.countByTenantId(tenantId.getId()); |
183 | - | |
184 | 183 | } |
185 | 184 | } | ... | ... |
... | ... | @@ -65,7 +65,7 @@ public class JpaCustomerDao extends JpaAbstractSearchTextDao<CustomerEntity, Cus |
65 | 65 | } |
66 | 66 | |
67 | 67 | @Override |
68 | - public Long countCustomersByTenantId(TenantId tenantId) { | |
68 | + public Long countByTenantId(TenantId tenantId) { | |
69 | 69 | return customerRepository.countByTenantId(tenantId.getId()); |
70 | 70 | } |
71 | 71 | } | ... | ... |
... | ... | @@ -46,7 +46,7 @@ public class JpaDashboardDao extends JpaAbstractSearchTextDao<DashboardEntity, D |
46 | 46 | } |
47 | 47 | |
48 | 48 | @Override |
49 | - public Long countDashboardsByTenantId(TenantId tenantId) { | |
49 | + public Long countByTenantId(TenantId tenantId) { | |
50 | 50 | return dashboardRepository.countByTenantId(tenantId.getId()); |
51 | 51 | } |
52 | 52 | } | ... | ... |
... | ... | @@ -50,9 +50,9 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit |
50 | 50 | "AND d.deviceProfileId = :profileId " + |
51 | 51 | "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:searchText, '%'))") |
52 | 52 | Page<DeviceEntity> findByTenantIdAndProfileId(@Param("tenantId") UUID tenantId, |
53 | - @Param("profileId") UUID profileId, | |
54 | - @Param("searchText") String searchText, | |
55 | - Pageable pageable); | |
53 | + @Param("profileId") UUID profileId, | |
54 | + @Param("searchText") String searchText, | |
55 | + Pageable pageable); | |
56 | 56 | |
57 | 57 | @Query("SELECT new org.thingsboard.server.dao.model.sql.DeviceInfoEntity(d, c.title, c.additionalInfo, p.name) " + |
58 | 58 | "FROM DeviceEntity d " + |
... | ... | @@ -62,9 +62,9 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit |
62 | 62 | "AND d.customerId = :customerId " + |
63 | 63 | "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:searchText, '%'))") |
64 | 64 | Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, |
65 | - @Param("customerId") UUID customerId, | |
66 | - @Param("searchText") String searchText, | |
67 | - Pageable pageable); | |
65 | + @Param("customerId") UUID customerId, | |
66 | + @Param("searchText") String searchText, | |
67 | + Pageable pageable); | |
68 | 68 | |
69 | 69 | @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId") |
70 | 70 | Page<DeviceEntity> findByTenantId(@Param("tenantId") UUID tenantId, |
... | ... | @@ -102,9 +102,9 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit |
102 | 102 | "AND d.type = :type " + |
103 | 103 | "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
104 | 104 | Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndType(@Param("tenantId") UUID tenantId, |
105 | - @Param("type") String type, | |
106 | - @Param("textSearch") String textSearch, | |
107 | - Pageable pageable); | |
105 | + @Param("type") String type, | |
106 | + @Param("textSearch") String textSearch, | |
107 | + Pageable pageable); | |
108 | 108 | |
109 | 109 | @Query("SELECT new org.thingsboard.server.dao.model.sql.DeviceInfoEntity(d, c.title, c.additionalInfo, p.name) " + |
110 | 110 | "FROM DeviceEntity d " + |
... | ... | @@ -137,10 +137,10 @@ public interface DeviceRepository extends PagingAndSortingRepository<DeviceEntit |
137 | 137 | "AND d.type = :type " + |
138 | 138 | "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%'))") |
139 | 139 | Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, |
140 | - @Param("customerId") UUID customerId, | |
141 | - @Param("type") String type, | |
142 | - @Param("textSearch") String textSearch, | |
143 | - Pageable pageable); | |
140 | + @Param("customerId") UUID customerId, | |
141 | + @Param("type") String type, | |
142 | + @Param("textSearch") String textSearch, | |
143 | + Pageable pageable); | |
144 | 144 | |
145 | 145 | @Query("SELECT new org.thingsboard.server.dao.model.sql.DeviceInfoEntity(d, c.title, c.additionalInfo, p.name) " + |
146 | 146 | "FROM DeviceEntity d " + | ... | ... |
... | ... | @@ -220,7 +220,7 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device> |
220 | 220 | } |
221 | 221 | |
222 | 222 | @Override |
223 | - public Long countDevicesByTenantId(TenantId tenantId) { | |
223 | + public Long countByTenantId(TenantId tenantId) { | |
224 | 224 | return deviceRepository.countByTenantId(tenantId.getId()); |
225 | 225 | } |
226 | 226 | ... | ... |
... | ... | @@ -58,7 +58,7 @@ public class JpaRuleChainDao extends JpaAbstractSearchTextDao<RuleChainEntity, R |
58 | 58 | } |
59 | 59 | |
60 | 60 | @Override |
61 | - public Long countRuleChainsByTenantId(TenantId tenantId) { | |
61 | + public Long countByTenantId(TenantId tenantId) { | |
62 | 62 | return ruleChainRepository.countByTenantId(tenantId.getId()); |
63 | 63 | } |
64 | 64 | } | ... | ... |
... | ... | @@ -93,7 +93,7 @@ public class JpaUserDao extends JpaAbstractSearchTextDao<UserEntity, User> imple |
93 | 93 | } |
94 | 94 | |
95 | 95 | @Override |
96 | - public Long countUsersByTenantId(TenantId tenantId) { | |
96 | + public Long countByTenantId(TenantId tenantId) { | |
97 | 97 | return userRepository.countByTenantId(tenantId.getId()); |
98 | 98 | } |
99 | 99 | } | ... | ... |
... | ... | @@ -20,10 +20,11 @@ import org.thingsboard.server.common.data.id.TenantId; |
20 | 20 | import org.thingsboard.server.common.data.page.PageData; |
21 | 21 | import org.thingsboard.server.common.data.page.PageLink; |
22 | 22 | import org.thingsboard.server.dao.Dao; |
23 | +import org.thingsboard.server.dao.TenantEntityDao; | |
23 | 24 | |
24 | 25 | import java.util.UUID; |
25 | 26 | |
26 | -public interface UserDao extends Dao<User> { | |
27 | +public interface UserDao extends Dao<User>, TenantEntityDao { | |
27 | 28 | |
28 | 29 | /** |
29 | 30 | * Save or update user object |
... | ... | @@ -49,7 +50,7 @@ public interface UserDao extends Dao<User> { |
49 | 50 | * @return the list of user entities |
50 | 51 | */ |
51 | 52 | PageData<User> findByTenantId(UUID tenantId, PageLink pageLink); |
52 | - | |
53 | + | |
53 | 54 | /** |
54 | 55 | * Find tenant admin users by tenantId and page link. |
55 | 56 | * |
... | ... | @@ -58,7 +59,7 @@ public interface UserDao extends Dao<User> { |
58 | 59 | * @return the list of user entities |
59 | 60 | */ |
60 | 61 | PageData<User> findTenantAdmins(UUID tenantId, PageLink pageLink); |
61 | - | |
62 | + | |
62 | 63 | /** |
63 | 64 | * Find customer users by tenantId, customerId and page link. |
64 | 65 | * |
... | ... | @@ -68,6 +69,4 @@ public interface UserDao extends Dao<User> { |
68 | 69 | * @return the list of user entities |
69 | 70 | */ |
70 | 71 | PageData<User> findCustomerUsers(UUID tenantId, UUID customerId, PageLink pageLink); |
71 | - | |
72 | - Long countUsersByTenantId(TenantId tenantId); | |
73 | 72 | } | ... | ... |
... | ... | @@ -27,6 +27,7 @@ import org.springframework.beans.factory.annotation.Value; |
27 | 27 | import org.springframework.context.annotation.Lazy; |
28 | 28 | import org.springframework.stereotype.Service; |
29 | 29 | import org.thingsboard.server.common.data.Customer; |
30 | +import org.thingsboard.server.common.data.EntityType; | |
30 | 31 | import org.thingsboard.server.common.data.Tenant; |
31 | 32 | import org.thingsboard.server.common.data.User; |
32 | 33 | import org.thingsboard.server.common.data.id.CustomerId; |
... | ... | @@ -377,12 +378,7 @@ public class UserServiceImpl extends AbstractEntityService implements UserServic |
377 | 378 | DefaultTenantProfileConfiguration profileConfiguration = |
378 | 379 | (DefaultTenantProfileConfiguration) tenantProfileCache.get(tenantId).getProfileData().getConfiguration(); |
379 | 380 | long maxUsers = profileConfiguration.getMaxUsers(); |
380 | - if (maxUsers > 0) { | |
381 | - long currentUsersCount = userDao.countUsersByTenantId(tenantId); | |
382 | - if (currentUsersCount >= maxUsers) { | |
383 | - throw new DataValidationException("Can't create users more then " + maxUsers); | |
384 | - } | |
385 | - } | |
381 | + validateNumberOfEntitiesPerTenant(tenantId, userDao, maxUsers, EntityType.USER); | |
386 | 382 | } |
387 | 383 | } |
388 | 384 | ... | ... |