Commit 676a60e8042ce105427d7475f1c09fa3f55aede8
Committed by
GitHub
1 parent
8e0eab37
Revert "[3.3.3] Entities search within all tenants"
Showing
11 changed files
with
39 additions
and
532 deletions
@@ -17,10 +17,9 @@ package org.thingsboard.server.controller; | @@ -17,10 +17,9 @@ package org.thingsboard.server.controller; | ||
17 | 17 | ||
18 | import io.swagger.annotations.ApiOperation; | 18 | import io.swagger.annotations.ApiOperation; |
19 | import io.swagger.annotations.ApiParam; | 19 | import io.swagger.annotations.ApiParam; |
20 | -import lombok.RequiredArgsConstructor; | 20 | +import org.springframework.beans.factory.annotation.Autowired; |
21 | import org.springframework.http.ResponseEntity; | 21 | import org.springframework.http.ResponseEntity; |
22 | import org.springframework.security.access.prepost.PreAuthorize; | 22 | import org.springframework.security.access.prepost.PreAuthorize; |
23 | -import org.springframework.web.bind.annotation.PostMapping; | ||
24 | import org.springframework.web.bind.annotation.RequestBody; | 23 | import org.springframework.web.bind.annotation.RequestBody; |
25 | import org.springframework.web.bind.annotation.RequestMapping; | 24 | import org.springframework.web.bind.annotation.RequestMapping; |
26 | import org.springframework.web.bind.annotation.RequestMethod; | 25 | import org.springframework.web.bind.annotation.RequestMethod; |
@@ -37,30 +36,20 @@ import org.thingsboard.server.common.data.query.EntityCountQuery; | @@ -37,30 +36,20 @@ import org.thingsboard.server.common.data.query.EntityCountQuery; | ||
37 | import org.thingsboard.server.common.data.query.EntityData; | 36 | import org.thingsboard.server.common.data.query.EntityData; |
38 | import org.thingsboard.server.common.data.query.EntityDataPageLink; | 37 | import org.thingsboard.server.common.data.query.EntityDataPageLink; |
39 | import org.thingsboard.server.common.data.query.EntityDataQuery; | 38 | import org.thingsboard.server.common.data.query.EntityDataQuery; |
40 | -import org.thingsboard.server.data.search.EntitiesSearchRequest; | ||
41 | -import org.thingsboard.server.data.search.EntitySearchResult; | ||
42 | import org.thingsboard.server.queue.util.TbCoreComponent; | 39 | import org.thingsboard.server.queue.util.TbCoreComponent; |
43 | -import org.thingsboard.server.service.query.EntitiesSearchService; | ||
44 | import org.thingsboard.server.service.query.EntityQueryService; | 40 | import org.thingsboard.server.service.query.EntityQueryService; |
45 | 41 | ||
46 | import static org.thingsboard.server.controller.ControllerConstants.ALARM_DATA_QUERY_DESCRIPTION; | 42 | import static org.thingsboard.server.controller.ControllerConstants.ALARM_DATA_QUERY_DESCRIPTION; |
47 | import static org.thingsboard.server.controller.ControllerConstants.ENTITY_COUNT_QUERY_DESCRIPTION; | 43 | import static org.thingsboard.server.controller.ControllerConstants.ENTITY_COUNT_QUERY_DESCRIPTION; |
48 | import static org.thingsboard.server.controller.ControllerConstants.ENTITY_DATA_QUERY_DESCRIPTION; | 44 | import static org.thingsboard.server.controller.ControllerConstants.ENTITY_DATA_QUERY_DESCRIPTION; |
49 | -import static org.thingsboard.server.controller.ControllerConstants.NEW_LINE; | ||
50 | -import static org.thingsboard.server.controller.ControllerConstants.PAGE_NUMBER_DESCRIPTION; | ||
51 | -import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DESCRIPTION; | ||
52 | -import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_ALLOWABLE_VALUES; | ||
53 | -import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION; | ||
54 | -import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION; | ||
55 | 45 | ||
56 | @RestController | 46 | @RestController |
57 | @TbCoreComponent | 47 | @TbCoreComponent |
58 | @RequestMapping("/api") | 48 | @RequestMapping("/api") |
59 | -@RequiredArgsConstructor | ||
60 | public class EntityQueryController extends BaseController { | 49 | public class EntityQueryController extends BaseController { |
61 | 50 | ||
62 | - private final EntityQueryService entityQueryService; | ||
63 | - private final EntitiesSearchService entitiesSearchService; | 51 | + @Autowired |
52 | + private EntityQueryService entityQueryService; | ||
64 | 53 | ||
65 | private static final int MAX_PAGE_SIZE = 100; | 54 | private static final int MAX_PAGE_SIZE = 100; |
66 | 55 | ||
@@ -134,70 +123,4 @@ public class EntityQueryController extends BaseController { | @@ -134,70 +123,4 @@ public class EntityQueryController extends BaseController { | ||
134 | } | 123 | } |
135 | } | 124 | } |
136 | 125 | ||
137 | - @ApiOperation(value = "Search entities (searchEntities)", notes = "Search entities with specified entity type by id or name within the whole platform. " + | ||
138 | - "Searchable entity types are: CUSTOMER, USER, DEVICE, DEVICE_PROFILE, ASSET, ENTITY_VIEW, DASHBOARD, " + | ||
139 | - "RULE_CHAIN, EDGE, OTA_PACKAGE, TB_RESOURCE, WIDGETS_BUNDLE, TENANT, TENANT_PROFILE." + NEW_LINE + | ||
140 | - "The platform will search for entities, where a name contains the search text (case-insensitively), " + | ||
141 | - "or if the search query is a valid UUID (e.g. 128e4d40-26b3-11ec-aaeb-c7661c54701e) then " + | ||
142 | - "it will also search for an entity where id fully matches the query. If search query is empty " + | ||
143 | - "then all entities will be returned (according to page number, page size and sorting)." + NEW_LINE + | ||
144 | - "The returned result is a page of EntitySearchResult, which contains: " + | ||
145 | - "entity id, entity fields represented as strings, tenant info and owner info. " + | ||
146 | - "Returned entity fields are: name, type (will be present for USER, DEVICE, ASSET, ENTITY_VIEW, RULE_CHAIN, " + | ||
147 | - "EDGE, OTA_PACKAGE, TB_RESOURCE entity types; in case of USER - the type is its authority), " + | ||
148 | - "createdTime and lastActivityTime (will only be present for DEVICE and USER; for USER it is its last login time). " + | ||
149 | - "Tenant info contains tenant's id and title; owner info contains the same info for an entity's owner " + | ||
150 | - "(its customer, or if it is not a customer's entity - tenant)." + NEW_LINE + | ||
151 | - "Example response value:\n" + | ||
152 | - "{\n" + | ||
153 | - " \"data\": [\n" + | ||
154 | - " {\n" + | ||
155 | - " \"entityId\": {\n" + | ||
156 | - " \"entityType\": \"DEVICE\",\n" + | ||
157 | - " \"id\": \"48be0670-25c9-11ec-a618-8165eb6b112a\"\n" + | ||
158 | - " },\n" + | ||
159 | - " \"fields\": {\n" + | ||
160 | - " \"name\": \"Thermostat T1\",\n" + | ||
161 | - " \"createdTime\": \"1633430698071\",\n" + | ||
162 | - " \"lastActivityTime\": \"1635761085285\",\n" + | ||
163 | - " \"type\": \"thermostat\"\n" + | ||
164 | - " },\n" + | ||
165 | - " \"tenantInfo\": {\n" + | ||
166 | - " \"id\": {\n" + | ||
167 | - " \"entityType\": \"TENANT\",\n" + | ||
168 | - " \"id\": \"2ddd6120-25c9-11ec-a618-8165eb6b112a\"\n" + | ||
169 | - " },\n" + | ||
170 | - " \"name\": \"Tenant\"\n" + | ||
171 | - " },\n" + | ||
172 | - " \"ownerInfo\": {\n" + | ||
173 | - " \"id\": {\n" + | ||
174 | - " \"entityType\": \"CUSTOMER\",\n" + | ||
175 | - " \"id\": \"26cba800-eee3-11eb-9e2c-fb031bd4619c\"\n" + | ||
176 | - " },\n" + | ||
177 | - " \"name\": \"Customer A\"\n" + | ||
178 | - " }\n" + | ||
179 | - " }\n" + | ||
180 | - " ],\n" + | ||
181 | - " \"totalPages\": 1,\n" + | ||
182 | - " \"totalElements\": 1,\n" + | ||
183 | - " \"hasNext\": false\n" + | ||
184 | - "}") | ||
185 | - @PostMapping("/entities/search") | ||
186 | - @PreAuthorize("hasAnyAuthority('SYS_ADMIN')") | ||
187 | - public PageData<EntitySearchResult> searchEntities(@RequestBody EntitiesSearchRequest request, | ||
188 | - @ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true) | ||
189 | - @RequestParam int page, | ||
190 | - @ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true) | ||
191 | - @RequestParam int pageSize, | ||
192 | - @ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = "name, type, createdTime, lastActivityTime, createdTime, tenantId, customerId", required = false) | ||
193 | - @RequestParam(required = false) String sortProperty, | ||
194 | - @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES, required = false) | ||
195 | - @RequestParam(required = false) String sortOrder) throws ThingsboardException { | ||
196 | - try { | ||
197 | - return entitiesSearchService.searchEntities(getCurrentUser(), request, createPageLink(pageSize, page, null, sortProperty, sortOrder)); | ||
198 | - } catch (Exception e) { | ||
199 | - throw handleException(e); | ||
200 | - } | ||
201 | - } | ||
202 | - | ||
203 | } | 126 | } |
application/src/main/java/org/thingsboard/server/data/search/EntitiesSearchRequest.java
deleted
100644 → 0
1 | -/** | ||
2 | - * Copyright © 2016-2021 The Thingsboard Authors | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | -package org.thingsboard.server.data.search; | ||
17 | - | ||
18 | -import lombok.Data; | ||
19 | -import org.thingsboard.server.common.data.EntityType; | ||
20 | - | ||
21 | -@Data | ||
22 | -public class EntitiesSearchRequest { | ||
23 | - private EntityType entityType; | ||
24 | - private String searchQuery; | ||
25 | -} |
application/src/main/java/org/thingsboard/server/data/search/EntitySearchResult.java
deleted
100644 → 0
1 | -/** | ||
2 | - * Copyright © 2016-2021 The Thingsboard Authors | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | -package org.thingsboard.server.data.search; | ||
17 | - | ||
18 | -import lombok.AllArgsConstructor; | ||
19 | -import lombok.Data; | ||
20 | -import lombok.NoArgsConstructor; | ||
21 | -import org.thingsboard.server.common.data.id.EntityId; | ||
22 | -import org.thingsboard.server.common.data.id.TenantId; | ||
23 | - | ||
24 | -import java.util.Map; | ||
25 | - | ||
26 | -@Data | ||
27 | -public class EntitySearchResult { | ||
28 | - private EntityId entityId; | ||
29 | - private Map<String, String> fields; | ||
30 | - | ||
31 | - private EntityTenantInfo tenantInfo; | ||
32 | - private EntityOwnerInfo ownerInfo; | ||
33 | - | ||
34 | - @Data | ||
35 | - @AllArgsConstructor | ||
36 | - @NoArgsConstructor | ||
37 | - public static final class EntityTenantInfo { | ||
38 | - private TenantId id; | ||
39 | - private String name; | ||
40 | - } | ||
41 | - | ||
42 | - @Data | ||
43 | - @AllArgsConstructor | ||
44 | - @NoArgsConstructor | ||
45 | - public static final class EntityOwnerInfo { | ||
46 | - private EntityId id; | ||
47 | - private String name; | ||
48 | - } | ||
49 | - | ||
50 | -} |
application/src/main/java/org/thingsboard/server/service/query/EntitiesSearchService.java
deleted
100644 → 0
1 | -/** | ||
2 | - * Copyright © 2016-2021 The Thingsboard Authors | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | -package org.thingsboard.server.service.query; | ||
17 | - | ||
18 | -import org.thingsboard.server.common.data.page.PageData; | ||
19 | -import org.thingsboard.server.common.data.page.PageLink; | ||
20 | -import org.thingsboard.server.data.search.EntitiesSearchRequest; | ||
21 | -import org.thingsboard.server.data.search.EntitySearchResult; | ||
22 | -import org.thingsboard.server.service.security.model.SecurityUser; | ||
23 | - | ||
24 | -public interface EntitiesSearchService { | ||
25 | - PageData<EntitySearchResult> searchEntities(SecurityUser user, EntitiesSearchRequest request, PageLink pageLink); | ||
26 | -} |
application/src/main/java/org/thingsboard/server/service/query/EntitiesSearchServiceImpl.java
deleted
100644 → 0
1 | -/** | ||
2 | - * Copyright © 2016-2021 The Thingsboard Authors | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | -package org.thingsboard.server.service.query; | ||
17 | - | ||
18 | -import com.google.common.base.Strings; | ||
19 | -import lombok.RequiredArgsConstructor; | ||
20 | -import lombok.extern.slf4j.Slf4j; | ||
21 | -import org.apache.commons.lang3.StringUtils; | ||
22 | -import org.springframework.stereotype.Service; | ||
23 | -import org.thingsboard.server.common.data.ContactBased; | ||
24 | -import org.thingsboard.server.common.data.Customer; | ||
25 | -import org.thingsboard.server.common.data.EntityType; | ||
26 | -import org.thingsboard.server.common.data.Tenant; | ||
27 | -import org.thingsboard.server.common.data.id.CustomerId; | ||
28 | -import org.thingsboard.server.common.data.id.EntityId; | ||
29 | -import org.thingsboard.server.common.data.id.TenantId; | ||
30 | -import org.thingsboard.server.common.data.page.PageData; | ||
31 | -import org.thingsboard.server.common.data.page.PageLink; | ||
32 | -import org.thingsboard.server.common.data.page.SortOrder; | ||
33 | -import org.thingsboard.server.common.data.query.EntityData; | ||
34 | -import org.thingsboard.server.common.data.query.EntityDataPageLink; | ||
35 | -import org.thingsboard.server.common.data.query.EntityDataQuery; | ||
36 | -import org.thingsboard.server.common.data.query.EntityDataSortOrder; | ||
37 | -import org.thingsboard.server.common.data.query.EntityKey; | ||
38 | -import org.thingsboard.server.common.data.query.EntityKeyType; | ||
39 | -import org.thingsboard.server.common.data.query.EntityNameOrIdFilter; | ||
40 | -import org.thingsboard.server.dao.customer.CustomerService; | ||
41 | -import org.thingsboard.server.dao.tenant.TenantService; | ||
42 | -import org.thingsboard.server.data.search.EntitiesSearchRequest; | ||
43 | -import org.thingsboard.server.data.search.EntitySearchResult; | ||
44 | -import org.thingsboard.server.queue.util.TbCoreComponent; | ||
45 | -import org.thingsboard.server.service.security.model.SecurityUser; | ||
46 | -import org.thingsboard.server.service.state.DefaultDeviceStateService; | ||
47 | - | ||
48 | -import java.util.ArrayList; | ||
49 | -import java.util.Collections; | ||
50 | -import java.util.EnumSet; | ||
51 | -import java.util.HashMap; | ||
52 | -import java.util.List; | ||
53 | -import java.util.Map; | ||
54 | -import java.util.Optional; | ||
55 | -import java.util.Set; | ||
56 | -import java.util.UUID; | ||
57 | -import java.util.stream.Collectors; | ||
58 | -import java.util.stream.Stream; | ||
59 | - | ||
60 | -import static org.thingsboard.server.common.data.EntityType.ASSET; | ||
61 | -import static org.thingsboard.server.common.data.EntityType.CUSTOMER; | ||
62 | -import static org.thingsboard.server.common.data.EntityType.DASHBOARD; | ||
63 | -import static org.thingsboard.server.common.data.EntityType.DEVICE; | ||
64 | -import static org.thingsboard.server.common.data.EntityType.DEVICE_PROFILE; | ||
65 | -import static org.thingsboard.server.common.data.EntityType.EDGE; | ||
66 | -import static org.thingsboard.server.common.data.EntityType.ENTITY_VIEW; | ||
67 | -import static org.thingsboard.server.common.data.EntityType.OTA_PACKAGE; | ||
68 | -import static org.thingsboard.server.common.data.EntityType.RULE_CHAIN; | ||
69 | -import static org.thingsboard.server.common.data.EntityType.TB_RESOURCE; | ||
70 | -import static org.thingsboard.server.common.data.EntityType.TENANT; | ||
71 | -import static org.thingsboard.server.common.data.EntityType.TENANT_PROFILE; | ||
72 | -import static org.thingsboard.server.common.data.EntityType.USER; | ||
73 | -import static org.thingsboard.server.common.data.EntityType.WIDGETS_BUNDLE; | ||
74 | -import static org.thingsboard.server.dao.sql.query.EntityKeyMapping.CREATED_TIME; | ||
75 | -import static org.thingsboard.server.dao.sql.query.EntityKeyMapping.CUSTOMER_ID; | ||
76 | -import static org.thingsboard.server.dao.sql.query.EntityKeyMapping.LAST_ACTIVITY_TIME; | ||
77 | -import static org.thingsboard.server.dao.sql.query.EntityKeyMapping.NAME; | ||
78 | -import static org.thingsboard.server.dao.sql.query.EntityKeyMapping.TENANT_ID; | ||
79 | -import static org.thingsboard.server.dao.sql.query.EntityKeyMapping.TYPE; | ||
80 | - | ||
81 | -@Service | ||
82 | -@TbCoreComponent | ||
83 | -@RequiredArgsConstructor | ||
84 | -@Slf4j | ||
85 | -public class EntitiesSearchServiceImpl implements EntitiesSearchService { | ||
86 | - private final EntityQueryService entityQueryService; | ||
87 | - | ||
88 | - private final TenantService tenantService; | ||
89 | - private final CustomerService customerService; | ||
90 | - private final DefaultDeviceStateService deviceStateService; | ||
91 | - | ||
92 | - private static final List<EntityKey> entityResponseFields = Stream.of(CREATED_TIME, NAME, TYPE, TENANT_ID, CUSTOMER_ID) | ||
93 | - .map(field -> new EntityKey(EntityKeyType.ENTITY_FIELD, field)) | ||
94 | - .collect(Collectors.toList()); | ||
95 | - | ||
96 | - private static final Set<EntityType> searchableEntityTypes = EnumSet.of( | ||
97 | - TENANT, CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, RULE_CHAIN, ENTITY_VIEW, | ||
98 | - WIDGETS_BUNDLE, TENANT_PROFILE, DEVICE_PROFILE, TB_RESOURCE, OTA_PACKAGE, EDGE | ||
99 | - ); | ||
100 | - | ||
101 | - @Override | ||
102 | - public PageData<EntitySearchResult> searchEntities(SecurityUser user, EntitiesSearchRequest request, PageLink pageLink) { | ||
103 | - EntityType entityType = request.getEntityType(); | ||
104 | - if (!searchableEntityTypes.contains(entityType)) { | ||
105 | - return new PageData<>(); | ||
106 | - } | ||
107 | - | ||
108 | - EntityDataQuery query = createSearchQuery(request.getSearchQuery(), entityType, pageLink); | ||
109 | - PageData<EntityData> resultPage = entityQueryService.findEntityDataByQuery(user, query); | ||
110 | - | ||
111 | - Map<EntityId, ContactBased<? extends EntityId>> localOwnersCache = new HashMap<>(); | ||
112 | - return resultPage.mapData(entityData -> { | ||
113 | - Map<String, String> fields = new HashMap<>(); | ||
114 | - entityData.getLatest().values().stream() | ||
115 | - .flatMap(values -> values.entrySet().stream()) | ||
116 | - .forEach(entry -> fields.put(entry.getKey(), Strings.emptyToNull(entry.getValue().getValue()))); | ||
117 | - | ||
118 | - EntitySearchResult entitySearchResult = new EntitySearchResult(); | ||
119 | - | ||
120 | - entitySearchResult.setEntityId(entityData.getEntityId()); | ||
121 | - entitySearchResult.setFields(fields); | ||
122 | - setOwnerInfo(entitySearchResult, localOwnersCache); | ||
123 | - | ||
124 | - return entitySearchResult; | ||
125 | - }); | ||
126 | - } | ||
127 | - | ||
128 | - private EntityDataQuery createSearchQuery(String searchQuery, EntityType entityType, PageLink pageLink) { | ||
129 | - EntityDataPageLink entityDataPageLink = new EntityDataPageLink(); | ||
130 | - entityDataPageLink.setPageSize(pageLink.getPageSize()); | ||
131 | - entityDataPageLink.setPage(pageLink.getPage()); | ||
132 | - if (pageLink.getSortOrder() != null && StringUtils.isNotEmpty(pageLink.getSortOrder().getProperty())) { | ||
133 | - entityDataPageLink.setSortOrder(new EntityDataSortOrder(new EntityKey(EntityKeyType.ENTITY_FIELD, pageLink.getSortOrder().getProperty()), | ||
134 | - EntityDataSortOrder.Direction.valueOf(Optional.ofNullable(pageLink.getSortOrder().getDirection()).orElse(SortOrder.Direction.ASC).name()))); | ||
135 | - } | ||
136 | - | ||
137 | - EntityNameOrIdFilter filter = new EntityNameOrIdFilter(); | ||
138 | - filter.setEntityType(entityType); | ||
139 | - filter.setNameOrId(searchQuery); | ||
140 | - | ||
141 | - List<EntityKey> entityFields = entityResponseFields; | ||
142 | - List<EntityKey> latestValues = Collections.emptyList(); | ||
143 | - | ||
144 | - if (entityType == USER) { | ||
145 | - entityFields = new ArrayList<>(entityFields); | ||
146 | - entityFields.add(new EntityKey(EntityKeyType.ENTITY_FIELD, LAST_ACTIVITY_TIME)); | ||
147 | - } else if (entityType == DEVICE) { | ||
148 | - EntityKey lastActivityTimeKey; | ||
149 | - if (deviceStateService.isPersistToTelemetry()) { | ||
150 | - lastActivityTimeKey = new EntityKey(EntityKeyType.TIME_SERIES, LAST_ACTIVITY_TIME); | ||
151 | - } else { | ||
152 | - lastActivityTimeKey = new EntityKey(EntityKeyType.SERVER_ATTRIBUTE, LAST_ACTIVITY_TIME); | ||
153 | - } | ||
154 | - latestValues = List.of(lastActivityTimeKey); | ||
155 | - if (entityDataPageLink.getSortOrder() != null && entityDataPageLink.getSortOrder().getKey().getKey().equals(LAST_ACTIVITY_TIME)) { | ||
156 | - entityDataPageLink.getSortOrder().setKey(lastActivityTimeKey); | ||
157 | - } | ||
158 | - } | ||
159 | - | ||
160 | - return new EntityDataQuery(filter, entityDataPageLink, entityFields, latestValues, Collections.emptyList()); | ||
161 | - } | ||
162 | - | ||
163 | - private void setOwnerInfo(EntitySearchResult entitySearchResult, Map<EntityId, ContactBased<? extends EntityId>> localOwnersCache) { | ||
164 | - Map<String, String> fields = entitySearchResult.getFields(); | ||
165 | - | ||
166 | - UUID tenantUuid = toUuid(fields.remove(TENANT_ID)); | ||
167 | - UUID customerUuid = toUuid(fields.remove(CUSTOMER_ID)); | ||
168 | - | ||
169 | - Tenant tenant = null; | ||
170 | - if (tenantUuid != null) { | ||
171 | - tenant = getTenant(new TenantId(tenantUuid), localOwnersCache); | ||
172 | - } | ||
173 | - | ||
174 | - ContactBased<? extends EntityId> owner; | ||
175 | - if (customerUuid != null) { | ||
176 | - owner = getCustomer(new CustomerId(customerUuid), localOwnersCache); | ||
177 | - } else { | ||
178 | - owner = tenant; | ||
179 | - } | ||
180 | - | ||
181 | - if (tenant != null) { | ||
182 | - entitySearchResult.setTenantInfo(new EntitySearchResult.EntityTenantInfo(tenant.getId(), tenant.getName())); | ||
183 | - } | ||
184 | - if (owner != null) { | ||
185 | - entitySearchResult.setOwnerInfo(new EntitySearchResult.EntityOwnerInfo(owner.getId(), owner.getName())); | ||
186 | - } | ||
187 | - } | ||
188 | - | ||
189 | - private Tenant getTenant(TenantId tenantId, Map<EntityId, ContactBased<? extends EntityId>> localOwnersCache) { | ||
190 | - return (Tenant) localOwnersCache.computeIfAbsent(tenantId, id -> tenantService.findTenantById(tenantId)); | ||
191 | - } | ||
192 | - | ||
193 | - private Customer getCustomer(CustomerId customerId, Map<EntityId, ContactBased<? extends EntityId>> localOwnersCache) { | ||
194 | - return (Customer) localOwnersCache.computeIfAbsent(customerId, id -> customerService.findCustomerById(TenantId.SYS_TENANT_ID, customerId)); | ||
195 | - } | ||
196 | - | ||
197 | - private UUID toUuid(String uuid) { | ||
198 | - try { | ||
199 | - UUID id = UUID.fromString(uuid); | ||
200 | - if (!id.equals(EntityId.NULL_UUID)) { | ||
201 | - return id; | ||
202 | - } | ||
203 | - } catch (Exception ignored) {} | ||
204 | - | ||
205 | - return null; | ||
206 | - } | ||
207 | - | ||
208 | -} |
@@ -69,6 +69,5 @@ public interface PermissionChecker<I extends EntityId, T extends HasTenantId> { | @@ -69,6 +69,5 @@ public interface PermissionChecker<I extends EntityId, T extends HasTenantId> { | ||
69 | } | 69 | } |
70 | }; | 70 | }; |
71 | 71 | ||
72 | - PermissionChecker allowReadPermissionChecker = new GenericPermissionChecker(Operation.READ, Operation.READ_TELEMETRY, Operation.READ_ATTRIBUTES); | ||
73 | 72 | ||
74 | } | 73 | } |
@@ -17,7 +17,10 @@ package org.thingsboard.server.service.security.permission; | @@ -17,7 +17,10 @@ package org.thingsboard.server.service.security.permission; | ||
17 | 17 | ||
18 | import org.springframework.stereotype.Component; | 18 | import org.springframework.stereotype.Component; |
19 | import org.thingsboard.server.common.data.HasTenantId; | 19 | import org.thingsboard.server.common.data.HasTenantId; |
20 | +import org.thingsboard.server.common.data.User; | ||
20 | import org.thingsboard.server.common.data.id.EntityId; | 21 | import org.thingsboard.server.common.data.id.EntityId; |
22 | +import org.thingsboard.server.common.data.id.UserId; | ||
23 | +import org.thingsboard.server.common.data.security.Authority; | ||
21 | import org.thingsboard.server.service.security.model.SecurityUser; | 24 | import org.thingsboard.server.service.security.model.SecurityUser; |
22 | 25 | ||
23 | @Component(value="sysAdminPermissions") | 26 | @Component(value="sysAdminPermissions") |
@@ -26,29 +29,23 @@ public class SysAdminPermissions extends AbstractPermissions { | @@ -26,29 +29,23 @@ public class SysAdminPermissions extends AbstractPermissions { | ||
26 | public SysAdminPermissions() { | 29 | public SysAdminPermissions() { |
27 | super(); | 30 | super(); |
28 | put(Resource.ADMIN_SETTINGS, PermissionChecker.allowAllPermissionChecker); | 31 | put(Resource.ADMIN_SETTINGS, PermissionChecker.allowAllPermissionChecker); |
29 | - put(Resource.DASHBOARD, PermissionChecker.allowReadPermissionChecker); | 32 | + put(Resource.DASHBOARD, new PermissionChecker.GenericPermissionChecker(Operation.READ)); |
30 | put(Resource.TENANT, PermissionChecker.allowAllPermissionChecker); | 33 | put(Resource.TENANT, PermissionChecker.allowAllPermissionChecker); |
31 | - put(Resource.RULE_CHAIN, PermissionChecker.allowReadPermissionChecker); | ||
32 | - put(Resource.USER, PermissionChecker.allowAllPermissionChecker); | 34 | + put(Resource.RULE_CHAIN, systemEntityPermissionChecker); |
35 | + put(Resource.USER, userPermissionChecker); | ||
33 | put(Resource.WIDGETS_BUNDLE, systemEntityPermissionChecker); | 36 | put(Resource.WIDGETS_BUNDLE, systemEntityPermissionChecker); |
34 | put(Resource.WIDGET_TYPE, systemEntityPermissionChecker); | 37 | put(Resource.WIDGET_TYPE, systemEntityPermissionChecker); |
35 | put(Resource.OAUTH2_CONFIGURATION_INFO, PermissionChecker.allowAllPermissionChecker); | 38 | put(Resource.OAUTH2_CONFIGURATION_INFO, PermissionChecker.allowAllPermissionChecker); |
36 | put(Resource.OAUTH2_CONFIGURATION_TEMPLATE, PermissionChecker.allowAllPermissionChecker); | 39 | put(Resource.OAUTH2_CONFIGURATION_TEMPLATE, PermissionChecker.allowAllPermissionChecker); |
37 | put(Resource.TENANT_PROFILE, PermissionChecker.allowAllPermissionChecker); | 40 | put(Resource.TENANT_PROFILE, PermissionChecker.allowAllPermissionChecker); |
38 | - put(Resource.TB_RESOURCE, PermissionChecker.allowAllPermissionChecker); | ||
39 | - put(Resource.CUSTOMER, PermissionChecker.allowReadPermissionChecker); | ||
40 | - put(Resource.ASSET, PermissionChecker.allowReadPermissionChecker); | ||
41 | - put(Resource.DEVICE, PermissionChecker.allowReadPermissionChecker); | ||
42 | - put(Resource.ENTITY_VIEW, PermissionChecker.allowReadPermissionChecker); | ||
43 | - put(Resource.DEVICE_PROFILE, PermissionChecker.allowReadPermissionChecker); | ||
44 | - put(Resource.OTA_PACKAGE, PermissionChecker.allowReadPermissionChecker); | ||
45 | - put(Resource.EDGE, PermissionChecker.allowReadPermissionChecker); | 41 | + put(Resource.TB_RESOURCE, systemEntityPermissionChecker); |
46 | } | 42 | } |
47 | 43 | ||
48 | private static final PermissionChecker systemEntityPermissionChecker = new PermissionChecker() { | 44 | private static final PermissionChecker systemEntityPermissionChecker = new PermissionChecker() { |
49 | 45 | ||
50 | @Override | 46 | @Override |
51 | public boolean hasPermission(SecurityUser user, Operation operation, EntityId entityId, HasTenantId entity) { | 47 | public boolean hasPermission(SecurityUser user, Operation operation, EntityId entityId, HasTenantId entity) { |
48 | + | ||
52 | if (entity.getTenantId() != null && !entity.getTenantId().isNullUid()) { | 49 | if (entity.getTenantId() != null && !entity.getTenantId().isNullUid()) { |
53 | return false; | 50 | return false; |
54 | } | 51 | } |
@@ -56,4 +53,16 @@ public class SysAdminPermissions extends AbstractPermissions { | @@ -56,4 +53,16 @@ public class SysAdminPermissions extends AbstractPermissions { | ||
56 | } | 53 | } |
57 | }; | 54 | }; |
58 | 55 | ||
56 | + private static final PermissionChecker userPermissionChecker = new PermissionChecker<UserId, User>() { | ||
57 | + | ||
58 | + @Override | ||
59 | + public boolean hasPermission(SecurityUser user, Operation operation, UserId userId, User userEntity) { | ||
60 | + if (Authority.CUSTOMER_USER.equals(userEntity.getAuthority())) { | ||
61 | + return false; | ||
62 | + } | ||
63 | + return true; | ||
64 | + } | ||
65 | + | ||
66 | + }; | ||
67 | + | ||
59 | } | 68 | } |
@@ -29,8 +29,7 @@ public enum EntityFilterType { | @@ -29,8 +29,7 @@ public enum EntityFilterType { | ||
29 | DEVICE_SEARCH_QUERY("deviceSearchQuery"), | 29 | DEVICE_SEARCH_QUERY("deviceSearchQuery"), |
30 | ENTITY_VIEW_SEARCH_QUERY("entityViewSearchQuery"), | 30 | ENTITY_VIEW_SEARCH_QUERY("entityViewSearchQuery"), |
31 | EDGE_SEARCH_QUERY("edgeSearchQuery"), | 31 | EDGE_SEARCH_QUERY("edgeSearchQuery"), |
32 | - API_USAGE_STATE("apiUsageState"), | ||
33 | - ENTITY_NAME_OR_ID("entityNameOrId"); | 32 | + API_USAGE_STATE("apiUsageState"); |
34 | 33 | ||
35 | private final String label; | 34 | private final String label; |
36 | 35 |
common/data/src/main/java/org/thingsboard/server/common/data/query/EntityNameOrIdFilter.java
deleted
100644 → 0
1 | -/** | ||
2 | - * Copyright © 2016-2021 The Thingsboard Authors | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | -package org.thingsboard.server.common.data.query; | ||
17 | - | ||
18 | -import lombok.Data; | ||
19 | -import lombok.EqualsAndHashCode; | ||
20 | -import org.thingsboard.server.common.data.EntityType; | ||
21 | - | ||
22 | -@EqualsAndHashCode(callSuper = true) | ||
23 | -@Data | ||
24 | -public class EntityNameOrIdFilter extends EntitySearchQueryFilter { | ||
25 | - private String nameOrId; | ||
26 | - private EntityType entityType; | ||
27 | - | ||
28 | - @Override | ||
29 | - public EntityFilterType getType() { | ||
30 | - return EntityFilterType.ENTITY_NAME_OR_ID; | ||
31 | - } | ||
32 | -} |
@@ -44,7 +44,6 @@ import org.thingsboard.server.common.data.query.EntityFilterType; | @@ -44,7 +44,6 @@ import org.thingsboard.server.common.data.query.EntityFilterType; | ||
44 | import org.thingsboard.server.common.data.query.EntityKeyType; | 44 | import org.thingsboard.server.common.data.query.EntityKeyType; |
45 | import org.thingsboard.server.common.data.query.EntityListFilter; | 45 | import org.thingsboard.server.common.data.query.EntityListFilter; |
46 | import org.thingsboard.server.common.data.query.EntityNameFilter; | 46 | import org.thingsboard.server.common.data.query.EntityNameFilter; |
47 | -import org.thingsboard.server.common.data.query.EntityNameOrIdFilter; | ||
48 | import org.thingsboard.server.common.data.query.EntitySearchQueryFilter; | 47 | import org.thingsboard.server.common.data.query.EntitySearchQueryFilter; |
49 | import org.thingsboard.server.common.data.query.EntityTypeFilter; | 48 | import org.thingsboard.server.common.data.query.EntityTypeFilter; |
50 | import org.thingsboard.server.common.data.query.EntityViewSearchQueryFilter; | 49 | import org.thingsboard.server.common.data.query.EntityViewSearchQueryFilter; |
@@ -237,12 +236,6 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | @@ -237,12 +236,6 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | ||
237 | entityTableMap.put(EntityType.TENANT, "tenant"); | 236 | entityTableMap.put(EntityType.TENANT, "tenant"); |
238 | entityTableMap.put(EntityType.API_USAGE_STATE, SELECT_API_USAGE_STATE); | 237 | entityTableMap.put(EntityType.API_USAGE_STATE, SELECT_API_USAGE_STATE); |
239 | entityTableMap.put(EntityType.EDGE, "edge"); | 238 | entityTableMap.put(EntityType.EDGE, "edge"); |
240 | - entityTableMap.put(EntityType.RULE_CHAIN, "rule_chain"); | ||
241 | - entityTableMap.put(EntityType.WIDGETS_BUNDLE, "widgets_bundle"); | ||
242 | - entityTableMap.put(EntityType.TENANT_PROFILE, "tenant_profile"); | ||
243 | - entityTableMap.put(EntityType.DEVICE_PROFILE, "device_profile"); | ||
244 | - entityTableMap.put(EntityType.TB_RESOURCE, "resource"); | ||
245 | - entityTableMap.put(EntityType.OTA_PACKAGE, "ota_package"); | ||
246 | } | 239 | } |
247 | 240 | ||
248 | public static EntityType[] RELATION_QUERY_ENTITY_TYPES = new EntityType[]{ | 241 | public static EntityType[] RELATION_QUERY_ENTITY_TYPES = new EntityType[]{ |
@@ -448,7 +441,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | @@ -448,7 +441,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | ||
448 | Optional<EntityKeyMapping> sortOrderMappingOpt = mappings.stream().filter(EntityKeyMapping::isSortOrder).findFirst(); | 441 | Optional<EntityKeyMapping> sortOrderMappingOpt = mappings.stream().filter(EntityKeyMapping::isSortOrder).findFirst(); |
449 | if (sortOrderMappingOpt.isPresent()) { | 442 | if (sortOrderMappingOpt.isPresent()) { |
450 | EntityKeyMapping sortOrderMapping = sortOrderMappingOpt.get(); | 443 | EntityKeyMapping sortOrderMapping = sortOrderMappingOpt.get(); |
451 | - String direction = sortOrder.getDirection() == EntityDataSortOrder.Direction.ASC ? "asc" : "desc nulls last"; | 444 | + String direction = sortOrder.getDirection() == EntityDataSortOrder.Direction.ASC ? "asc" : "desc"; |
452 | if (sortOrderMapping.getEntityKey().getType() == EntityKeyType.ENTITY_FIELD) { | 445 | if (sortOrderMapping.getEntityKey().getType() == EntityKeyType.ENTITY_FIELD) { |
453 | dataQuery = String.format("%s order by %s %s, result.id %s", dataQuery, sortOrderMapping.getValueAlias(), direction, direction); | 446 | dataQuery = String.format("%s order by %s %s, result.id %s", dataQuery, sortOrderMapping.getValueAlias(), direction, direction); |
454 | } else { | 447 | } else { |
@@ -478,26 +471,15 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | @@ -478,26 +471,15 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | ||
478 | String entityFieldsQuery = EntityKeyMapping.buildQuery(ctx, entityFieldsFilters, entityFilter.getType()); | 471 | String entityFieldsQuery = EntityKeyMapping.buildQuery(ctx, entityFieldsFilters, entityFilter.getType()); |
479 | String result = permissionQuery; | 472 | String result = permissionQuery; |
480 | if (!entityFilterQuery.isEmpty()) { | 473 | if (!entityFilterQuery.isEmpty()) { |
481 | - if (!result.isEmpty()) { | ||
482 | - result += " and (" + entityFilterQuery + ")"; | ||
483 | - } else { | ||
484 | - result = "(" + entityFilterQuery + ")"; | ||
485 | - } | 474 | + result += " and (" + entityFilterQuery + ")"; |
486 | } | 475 | } |
487 | if (!entityFieldsQuery.isEmpty()) { | 476 | if (!entityFieldsQuery.isEmpty()) { |
488 | - if (!result.isEmpty()) { | ||
489 | - result += " and (" + entityFieldsQuery + ")"; | ||
490 | - } else { | ||
491 | - result = "(" + entityFieldsQuery + ")"; | ||
492 | - } | 477 | + result += " and (" + entityFieldsQuery + ")"; |
493 | } | 478 | } |
494 | return result; | 479 | return result; |
495 | } | 480 | } |
496 | 481 | ||
497 | private String buildPermissionQuery(QueryContext ctx, EntityFilter entityFilter) { | 482 | private String buildPermissionQuery(QueryContext ctx, EntityFilter entityFilter) { |
498 | - if (ctx.getTenantId().equals(TenantId.SYS_TENANT_ID)) { | ||
499 | - return ""; | ||
500 | - } | ||
501 | switch (entityFilter.getType()) { | 483 | switch (entityFilter.getType()) { |
502 | case RELATIONS_QUERY: | 484 | case RELATIONS_QUERY: |
503 | case DEVICE_SEARCH_QUERY: | 485 | case DEVICE_SEARCH_QUERY: |
@@ -566,8 +548,6 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | @@ -566,8 +548,6 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | ||
566 | case API_USAGE_STATE: | 548 | case API_USAGE_STATE: |
567 | case ENTITY_TYPE: | 549 | case ENTITY_TYPE: |
568 | return ""; | 550 | return ""; |
569 | - case ENTITY_NAME_OR_ID: | ||
570 | - return entityNameOrIdQuery(ctx, (EntityNameOrIdFilter) entityFilter); | ||
571 | default: | 551 | default: |
572 | throw new RuntimeException("Not implemented!"); | 552 | throw new RuntimeException("Not implemented!"); |
573 | } | 553 | } |
@@ -779,27 +759,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | @@ -779,27 +759,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | ||
779 | 759 | ||
780 | private String entityNameQuery(QueryContext ctx, EntityNameFilter filter) { | 760 | private String entityNameQuery(QueryContext ctx, EntityNameFilter filter) { |
781 | ctx.addStringParameter("entity_filter_name_filter", filter.getEntityNameFilter()); | 761 | ctx.addStringParameter("entity_filter_name_filter", filter.getEntityNameFilter()); |
782 | - return "lower(e.search_text) like lower(concat('%', :entity_filter_name_filter, '%'))"; | ||
783 | - } | ||
784 | - | ||
785 | - private String entityNameOrIdQuery(QueryContext ctx, EntityNameOrIdFilter filter) { | ||
786 | - String nameOrId = filter.getNameOrId(); | ||
787 | - if (StringUtils.isNotEmpty(nameOrId)) { | ||
788 | - nameOrId = nameOrId.replaceAll("%", "\\\\%").replaceAll("_", "\\\\_"); | ||
789 | - ctx.addStringParameter("entity_id_or_search_text_filter", nameOrId); | ||
790 | - String query = ""; | ||
791 | - | ||
792 | - String searchTextField = EntityKeyMapping.searchTextFields.get(filter.getEntityType()); | ||
793 | - query += "lower(e." + searchTextField + ") like lower(concat('%', :entity_id_or_search_text_filter, '%'))"; | ||
794 | - | ||
795 | - try { | ||
796 | - UUID.fromString(nameOrId); | ||
797 | - query += " or e.id = :entity_id_or_search_text_filter::uuid"; | ||
798 | - } catch (Exception ignored) {} | ||
799 | - | ||
800 | - return query; | ||
801 | - } | ||
802 | - return "true"; | 762 | + return "lower(e.search_text) like lower(concat(:entity_filter_name_filter, '%%'))"; |
803 | } | 763 | } |
804 | 764 | ||
805 | private String typeQuery(QueryContext ctx, EntityFilter filter) { | 765 | private String typeQuery(QueryContext ctx, EntityFilter filter) { |
@@ -827,7 +787,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | @@ -827,7 +787,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | ||
827 | } | 787 | } |
828 | ctx.addStringParameter("entity_filter_type_query_type", type); | 788 | ctx.addStringParameter("entity_filter_type_query_type", type); |
829 | ctx.addStringParameter("entity_filter_type_query_name", name); | 789 | ctx.addStringParameter("entity_filter_type_query_name", name); |
830 | - return "e.type = :entity_filter_type_query_type and lower(e.search_text) like lower(concat('%', :entity_filter_type_query_name, '%'))"; | 790 | + return "e.type = :entity_filter_type_query_type and lower(e.search_text) like lower(concat(:entity_filter_type_query_name, '%%'))"; |
831 | } | 791 | } |
832 | 792 | ||
833 | private EntityType resolveEntityType(EntityFilter entityFilter) { | 793 | private EntityType resolveEntityType(EntityFilter entityFilter) { |
@@ -856,8 +816,6 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | @@ -856,8 +816,6 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { | ||
856 | return ((RelationsQueryFilter) entityFilter).getRootEntity().getEntityType(); | 816 | return ((RelationsQueryFilter) entityFilter).getRootEntity().getEntityType(); |
857 | case API_USAGE_STATE: | 817 | case API_USAGE_STATE: |
858 | return EntityType.API_USAGE_STATE; | 818 | return EntityType.API_USAGE_STATE; |
859 | - case ENTITY_NAME_OR_ID: | ||
860 | - return ((EntityNameOrIdFilter) entityFilter).getEntityType(); | ||
861 | default: | 819 | default: |
862 | throw new RuntimeException("Not implemented!"); | 820 | throw new RuntimeException("Not implemented!"); |
863 | } | 821 | } |
@@ -38,7 +38,6 @@ import org.thingsboard.server.dao.model.ModelConstants; | @@ -38,7 +38,6 @@ import org.thingsboard.server.dao.model.ModelConstants; | ||
38 | import java.util.ArrayList; | 38 | import java.util.ArrayList; |
39 | import java.util.Arrays; | 39 | import java.util.Arrays; |
40 | import java.util.Collections; | 40 | import java.util.Collections; |
41 | -import java.util.EnumMap; | ||
42 | import java.util.HashMap; | 41 | import java.util.HashMap; |
43 | import java.util.HashSet; | 42 | import java.util.HashSet; |
44 | import java.util.List; | 43 | import java.util.List; |
@@ -54,8 +53,6 @@ public class EntityKeyMapping { | @@ -54,8 +53,6 @@ public class EntityKeyMapping { | ||
54 | private static final Map<EntityType, Set<String>> allowedEntityFieldMap = new HashMap<>(); | 53 | private static final Map<EntityType, Set<String>> allowedEntityFieldMap = new HashMap<>(); |
55 | private static final Map<String, String> entityFieldColumnMap = new HashMap<>(); | 54 | private static final Map<String, String> entityFieldColumnMap = new HashMap<>(); |
56 | private static final Map<EntityType, Map<String, String>> aliases = new HashMap<>(); | 55 | private static final Map<EntityType, Map<String, String>> aliases = new HashMap<>(); |
57 | - private static final Map<EntityType, Map<String, String>> propertiesFunctions = new EnumMap<>(EntityType.class); | ||
58 | - public static final Map<EntityType, String> searchTextFields = new EnumMap<>(EntityType.class); | ||
59 | 56 | ||
60 | public static final String CREATED_TIME = "createdTime"; | 57 | public static final String CREATED_TIME = "createdTime"; |
61 | public static final String ENTITY_TYPE = "entityType"; | 58 | public static final String ENTITY_TYPE = "entityType"; |
@@ -75,51 +72,35 @@ public class EntityKeyMapping { | @@ -75,51 +72,35 @@ public class EntityKeyMapping { | ||
75 | public static final String ZIP = "zip"; | 72 | public static final String ZIP = "zip"; |
76 | public static final String PHONE = "phone"; | 73 | public static final String PHONE = "phone"; |
77 | public static final String ADDITIONAL_INFO = "additionalInfo"; | 74 | public static final String ADDITIONAL_INFO = "additionalInfo"; |
78 | - public static final String TENANT_ID = "tenantId"; | ||
79 | - public static final String CUSTOMER_ID = "customerId"; | ||
80 | - public static final String AUTHORITY = "authority"; | ||
81 | - public static final String RESOURCE_TYPE = "resourceType"; | ||
82 | - public static final String LAST_ACTIVITY_TIME = "lastActivityTime"; | ||
83 | 75 | ||
84 | - public static final List<String> typedEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME, TYPE, ADDITIONAL_INFO, TENANT_ID); | 76 | + public static final List<String> typedEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME, TYPE, ADDITIONAL_INFO); |
77 | + public static final List<String> widgetEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME); | ||
85 | public static final List<String> commonEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME, ADDITIONAL_INFO); | 78 | public static final List<String> commonEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME, ADDITIONAL_INFO); |
86 | - | ||
87 | - public static final List<String> dashboardEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, TITLE, TENANT_ID); | ||
88 | - public static final List<String> labeledEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME, TYPE, LABEL, ADDITIONAL_INFO, TENANT_ID, CUSTOMER_ID); | 79 | + public static final List<String> dashboardEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, TITLE); |
80 | + public static final List<String> labeledEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME, TYPE, LABEL, ADDITIONAL_INFO); | ||
89 | public static final List<String> contactBasedEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, EMAIL, TITLE, COUNTRY, STATE, CITY, ADDRESS, ADDRESS_2, ZIP, PHONE, ADDITIONAL_INFO); | 81 | public static final List<String> contactBasedEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, EMAIL, TITLE, COUNTRY, STATE, CITY, ADDRESS, ADDRESS_2, ZIP, PHONE, ADDITIONAL_INFO); |
90 | 82 | ||
91 | - public static final Set<String> apiUsageStateEntityFields = new HashSet<>(Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME)); | 83 | + public static final Set<String> apiUsageStateEntityFields = new HashSet<>(Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME)); |
92 | public static final Set<String> commonEntityFieldsSet = new HashSet<>(commonEntityFields); | 84 | public static final Set<String> commonEntityFieldsSet = new HashSet<>(commonEntityFields); |
93 | public static final Set<String> relationQueryEntityFieldsSet = new HashSet<>(Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME, TYPE, LABEL, FIRST_NAME, LAST_NAME, EMAIL, REGION, TITLE, COUNTRY, STATE, CITY, ADDRESS, ADDRESS_2, ZIP, PHONE, ADDITIONAL_INFO)); | 85 | public static final Set<String> relationQueryEntityFieldsSet = new HashSet<>(Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME, TYPE, LABEL, FIRST_NAME, LAST_NAME, EMAIL, REGION, TITLE, COUNTRY, STATE, CITY, ADDRESS, ADDRESS_2, ZIP, PHONE, ADDITIONAL_INFO)); |
94 | 86 | ||
95 | static { | 87 | static { |
96 | allowedEntityFieldMap.put(EntityType.DEVICE, new HashSet<>(labeledEntityFields)); | 88 | allowedEntityFieldMap.put(EntityType.DEVICE, new HashSet<>(labeledEntityFields)); |
97 | allowedEntityFieldMap.put(EntityType.ASSET, new HashSet<>(labeledEntityFields)); | 89 | allowedEntityFieldMap.put(EntityType.ASSET, new HashSet<>(labeledEntityFields)); |
98 | - allowedEntityFieldMap.put(EntityType.EDGE, new HashSet<>(labeledEntityFields)); | ||
99 | allowedEntityFieldMap.put(EntityType.ENTITY_VIEW, new HashSet<>(typedEntityFields)); | 90 | allowedEntityFieldMap.put(EntityType.ENTITY_VIEW, new HashSet<>(typedEntityFields)); |
100 | - allowedEntityFieldMap.get(EntityType.ENTITY_VIEW).add(CUSTOMER_ID); | ||
101 | 91 | ||
102 | allowedEntityFieldMap.put(EntityType.TENANT, new HashSet<>(contactBasedEntityFields)); | 92 | allowedEntityFieldMap.put(EntityType.TENANT, new HashSet<>(contactBasedEntityFields)); |
103 | allowedEntityFieldMap.get(EntityType.TENANT).add(REGION); | 93 | allowedEntityFieldMap.get(EntityType.TENANT).add(REGION); |
104 | allowedEntityFieldMap.put(EntityType.CUSTOMER, new HashSet<>(contactBasedEntityFields)); | 94 | allowedEntityFieldMap.put(EntityType.CUSTOMER, new HashSet<>(contactBasedEntityFields)); |
105 | - allowedEntityFieldMap.get(EntityType.CUSTOMER).add(TENANT_ID); | ||
106 | - | ||
107 | - allowedEntityFieldMap.put(EntityType.USER, new HashSet<>(Arrays.asList(CREATED_TIME, FIRST_NAME, LAST_NAME, EMAIL, | ||
108 | - ADDITIONAL_INFO, AUTHORITY, TENANT_ID, CUSTOMER_ID))); | ||
109 | 95 | ||
110 | - allowedEntityFieldMap.put(EntityType.DEVICE_PROFILE, new HashSet<>(commonEntityFields)); | ||
111 | - allowedEntityFieldMap.get(EntityType.DEVICE_PROFILE).add(TENANT_ID); | 96 | + allowedEntityFieldMap.put(EntityType.USER, new HashSet<>(Arrays.asList(CREATED_TIME, FIRST_NAME, LAST_NAME, EMAIL, ADDITIONAL_INFO))); |
112 | 97 | ||
113 | allowedEntityFieldMap.put(EntityType.DASHBOARD, new HashSet<>(dashboardEntityFields)); | 98 | allowedEntityFieldMap.put(EntityType.DASHBOARD, new HashSet<>(dashboardEntityFields)); |
114 | allowedEntityFieldMap.put(EntityType.RULE_CHAIN, new HashSet<>(commonEntityFields)); | 99 | allowedEntityFieldMap.put(EntityType.RULE_CHAIN, new HashSet<>(commonEntityFields)); |
115 | - allowedEntityFieldMap.get(EntityType.RULE_CHAIN).add(TENANT_ID); | ||
116 | - allowedEntityFieldMap.get(EntityType.RULE_CHAIN).add(TYPE); | ||
117 | allowedEntityFieldMap.put(EntityType.RULE_NODE, new HashSet<>(commonEntityFields)); | 100 | allowedEntityFieldMap.put(EntityType.RULE_NODE, new HashSet<>(commonEntityFields)); |
118 | - allowedEntityFieldMap.put(EntityType.WIDGET_TYPE, new HashSet<>(Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME, TENANT_ID))); | ||
119 | - allowedEntityFieldMap.put(EntityType.WIDGETS_BUNDLE, new HashSet<>(Arrays.asList(CREATED_TIME, ENTITY_TYPE, TITLE, TENANT_ID))); | 101 | + allowedEntityFieldMap.put(EntityType.WIDGET_TYPE, new HashSet<>(widgetEntityFields)); |
102 | + allowedEntityFieldMap.put(EntityType.WIDGETS_BUNDLE, new HashSet<>(widgetEntityFields)); | ||
120 | allowedEntityFieldMap.put(EntityType.API_USAGE_STATE, apiUsageStateEntityFields); | 103 | allowedEntityFieldMap.put(EntityType.API_USAGE_STATE, apiUsageStateEntityFields); |
121 | - allowedEntityFieldMap.put(EntityType.TB_RESOURCE, Set.of(CREATED_TIME, ENTITY_TYPE, RESOURCE_TYPE, TITLE, TENANT_ID)); | ||
122 | - allowedEntityFieldMap.put(EntityType.OTA_PACKAGE, Set.of(CREATED_TIME, ENTITY_TYPE, TYPE, TITLE, TENANT_ID)); | ||
123 | 104 | ||
124 | entityFieldColumnMap.put(CREATED_TIME, ModelConstants.CREATED_TIME_PROPERTY); | 105 | entityFieldColumnMap.put(CREATED_TIME, ModelConstants.CREATED_TIME_PROPERTY); |
125 | entityFieldColumnMap.put(ENTITY_TYPE, ModelConstants.ENTITY_TYPE_PROPERTY); | 106 | entityFieldColumnMap.put(ENTITY_TYPE, ModelConstants.ENTITY_TYPE_PROPERTY); |
@@ -139,42 +120,25 @@ public class EntityKeyMapping { | @@ -139,42 +120,25 @@ public class EntityKeyMapping { | ||
139 | entityFieldColumnMap.put(ZIP, ModelConstants.ZIP_PROPERTY); | 120 | entityFieldColumnMap.put(ZIP, ModelConstants.ZIP_PROPERTY); |
140 | entityFieldColumnMap.put(PHONE, ModelConstants.PHONE_PROPERTY); | 121 | entityFieldColumnMap.put(PHONE, ModelConstants.PHONE_PROPERTY); |
141 | entityFieldColumnMap.put(ADDITIONAL_INFO, ModelConstants.ADDITIONAL_INFO_PROPERTY); | 122 | entityFieldColumnMap.put(ADDITIONAL_INFO, ModelConstants.ADDITIONAL_INFO_PROPERTY); |
142 | - entityFieldColumnMap.put(TENANT_ID, ModelConstants.TENANT_ID_PROPERTY); | ||
143 | - entityFieldColumnMap.put(CUSTOMER_ID, ModelConstants.CUSTOMER_ID_PROPERTY); | ||
144 | - entityFieldColumnMap.put(AUTHORITY, ModelConstants.USER_AUTHORITY_PROPERTY); | ||
145 | - entityFieldColumnMap.put(RESOURCE_TYPE, ModelConstants.RESOURCE_TYPE_COLUMN); | ||
146 | 123 | ||
147 | Map<String, String> contactBasedAliases = new HashMap<>(); | 124 | Map<String, String> contactBasedAliases = new HashMap<>(); |
148 | contactBasedAliases.put(NAME, TITLE); | 125 | contactBasedAliases.put(NAME, TITLE); |
149 | contactBasedAliases.put(LABEL, TITLE); | 126 | contactBasedAliases.put(LABEL, TITLE); |
150 | aliases.put(EntityType.TENANT, contactBasedAliases); | 127 | aliases.put(EntityType.TENANT, contactBasedAliases); |
151 | - aliases.put(EntityType.CUSTOMER, new HashMap<>(contactBasedAliases)); | 128 | + aliases.put(EntityType.CUSTOMER, contactBasedAliases); |
152 | aliases.put(EntityType.DASHBOARD, contactBasedAliases); | 129 | aliases.put(EntityType.DASHBOARD, contactBasedAliases); |
153 | Map<String, String> commonEntityAliases = new HashMap<>(); | 130 | Map<String, String> commonEntityAliases = new HashMap<>(); |
154 | commonEntityAliases.put(TITLE, NAME); | 131 | commonEntityAliases.put(TITLE, NAME); |
155 | aliases.put(EntityType.DEVICE, commonEntityAliases); | 132 | aliases.put(EntityType.DEVICE, commonEntityAliases); |
156 | aliases.put(EntityType.ASSET, commonEntityAliases); | 133 | aliases.put(EntityType.ASSET, commonEntityAliases); |
157 | aliases.put(EntityType.ENTITY_VIEW, commonEntityAliases); | 134 | aliases.put(EntityType.ENTITY_VIEW, commonEntityAliases); |
158 | - aliases.put(EntityType.EDGE, commonEntityAliases); | ||
159 | - aliases.put(EntityType.WIDGETS_BUNDLE, new HashMap<>(commonEntityAliases)); | ||
160 | - aliases.get(EntityType.WIDGETS_BUNDLE).put(NAME, TITLE); | 135 | + aliases.put(EntityType.WIDGETS_BUNDLE, commonEntityAliases); |
161 | 136 | ||
162 | Map<String, String> userEntityAliases = new HashMap<>(); | 137 | Map<String, String> userEntityAliases = new HashMap<>(); |
163 | userEntityAliases.put(TITLE, EMAIL); | 138 | userEntityAliases.put(TITLE, EMAIL); |
164 | userEntityAliases.put(LABEL, EMAIL); | 139 | userEntityAliases.put(LABEL, EMAIL); |
165 | userEntityAliases.put(NAME, EMAIL); | 140 | userEntityAliases.put(NAME, EMAIL); |
166 | - userEntityAliases.put(TYPE, AUTHORITY); | ||
167 | aliases.put(EntityType.USER, userEntityAliases); | 141 | aliases.put(EntityType.USER, userEntityAliases); |
168 | - aliases.put(EntityType.TB_RESOURCE, Map.of(NAME, TITLE, TYPE, RESOURCE_TYPE)); | ||
169 | - aliases.put(EntityType.OTA_PACKAGE, Map.of(NAME, TITLE)); | ||
170 | - | ||
171 | - propertiesFunctions.put(EntityType.USER, Map.of( | ||
172 | - LAST_ACTIVITY_TIME, "cast(e.additional_info::json ->> 'lastLoginTs' as bigint)" | ||
173 | - )); | ||
174 | - | ||
175 | - Arrays.stream(EntityType.values()).forEach(entityType -> { | ||
176 | - searchTextFields.put(entityType, ModelConstants.SEARCH_TEXT_PROPERTY); | ||
177 | - }); | ||
178 | } | 142 | } |
179 | 143 | ||
180 | private int index; | 144 | private int index; |
@@ -215,10 +179,6 @@ public class EntityKeyMapping { | @@ -215,10 +179,6 @@ public class EntityKeyMapping { | ||
215 | String column = entityFieldColumnMap.get(alias); | 179 | String column = entityFieldColumnMap.get(alias); |
216 | return String.format("cast(e.%s as varchar) as %s", column, getValueAlias()); | 180 | return String.format("cast(e.%s as varchar) as %s", column, getValueAlias()); |
217 | } else { | 181 | } else { |
218 | - Map<String, String> entityPropertiesFunctions = propertiesFunctions.get(entityType); | ||
219 | - if (entityPropertiesFunctions != null && entityPropertiesFunctions.containsKey(alias)) { | ||
220 | - return String.format("%s as %s", entityPropertiesFunctions.get(alias), getValueAlias()); | ||
221 | - } | ||
222 | return String.format("'' as %s", getValueAlias()); | 182 | return String.format("'' as %s", getValueAlias()); |
223 | } | 183 | } |
224 | } | 184 | } |