Browse Source

Merge pull request #14773 from thingsboard/fix/notification-query

Fix invalid notification targets search by type
pull/14791/head
Viacheslav Klimov 7 months ago
committed by GitHub
parent
commit
154bad150c
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 28
      application/src/test/java/org/thingsboard/server/service/notification/NotificationTargetApiTest.java
  2. 2
      dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java
  3. 15
      dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTargetRepository.java

28
application/src/test/java/org/thingsboard/server/service/notification/NotificationTargetApiTest.java

@ -16,6 +16,7 @@
package org.thingsboard.server.service.notification;
import com.fasterxml.jackson.core.type.TypeReference;
import org.apache.commons.lang3.RandomStringUtils;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
@ -30,7 +31,12 @@ import org.thingsboard.server.common.data.notification.targets.NotificationTarge
import org.thingsboard.server.common.data.notification.targets.platform.AllUsersFilter;
import org.thingsboard.server.common.data.notification.targets.platform.CustomerUsersFilter;
import org.thingsboard.server.common.data.notification.targets.platform.PlatformUsersNotificationTargetConfig;
import org.thingsboard.server.common.data.notification.targets.platform.SystemAdministratorsFilter;
import org.thingsboard.server.common.data.notification.targets.platform.UserListFilter;
import org.thingsboard.server.common.data.notification.targets.platform.UsersFilterType;
import org.thingsboard.server.common.data.notification.targets.slack.SlackConversation;
import org.thingsboard.server.common.data.notification.targets.slack.SlackConversationType;
import org.thingsboard.server.common.data.notification.targets.slack.SlackNotificationTargetConfig;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.dao.notification.NotificationTargetDao;
@ -175,6 +181,28 @@ public class NotificationTargetApiTest extends AbstractNotificationApiTest {
assertThat(error).containsIgnoringCase("referenced by scheduled notification request");
}
@Test
public void findByTenantIdAndUsersFilterType() throws Exception {
loginSysAdmin();
NotificationTarget sysAdmins = createNotificationTarget(new SystemAdministratorsFilter());
NotificationTarget slack = new NotificationTarget();
slack.setName(RandomStringUtils.randomNumeric(5));
SlackNotificationTargetConfig slackConfig = new SlackNotificationTargetConfig();
SlackConversation slackConversation = new SlackConversation();
slackConversation.setType(SlackConversationType.DIRECT);
slackConversation.setId("U12345678");
slackConversation.setName("test");
slackConfig.setConversation(slackConversation);
slack.setConfiguration(slackConfig);
slack = saveNotificationTarget(slack);
List<NotificationTarget> sysAdminTargets = notificationTargetDao.findByTenantIdAndUsersFilterType(
TenantId.SYS_TENANT_ID, UsersFilterType.SYSTEM_ADMINISTRATORS
);
assertThat(sysAdminTargets).containsOnly(sysAdmins);
}
private String saveAndGetError(NotificationTarget notificationTarget, ResultMatcher statusMatcher) throws Exception {
return getErrorMessage(save(notificationTarget, statusMatcher));
}

2
dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java

@ -67,7 +67,7 @@ public class JpaNotificationTargetDao extends JpaAbstractDao<NotificationTargetE
@Override
public List<NotificationTarget> findByTenantIdAndUsersFilterType(TenantId tenantId, UsersFilterType filterType) {
return DaoUtil.convertDataList(notificationTargetRepository.findByTenantIdAndSearchTextAndUsersFilterTypeIfPresent(tenantId.getId(), null,
return DaoUtil.convertDataList(notificationTargetRepository.findByTenantIdAndUsersFilterType(tenantId.getId(),
List.of(filterType.name()), DaoUtil.toPageable(new PageLink(Integer.MAX_VALUE))).getContent());
}

15
dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTargetRepository.java

@ -33,20 +33,27 @@ import java.util.UUID;
public interface NotificationTargetRepository extends JpaRepository<NotificationTargetEntity, UUID>, ExportableEntityRepository<NotificationTargetEntity> {
@Query("SELECT t FROM NotificationTargetEntity t WHERE t.tenantId = :tenantId " +
"AND (:searchText is NULL OR ilike(t.name, concat('%', :searchText, '%')) = true)")
"AND (:searchText is NULL OR ilike(t.name, concat('%', :searchText, '%')) = true)")
Page<NotificationTargetEntity> findByTenantIdAndSearchText(@Param("tenantId") UUID tenantId,
@Param("searchText") String searchText,
Pageable pageable);
@Query(value = "SELECT * FROM notification_target t WHERE t.tenant_id = :tenantId " +
"AND (:searchText IS NULL OR t.name ILIKE concat('%', :searchText, '%')) " +
"AND (cast(t.configuration as json) ->> 'type' <> 'PLATFORM_USERS' OR " +
"cast(t.configuration as json) -> 'usersFilter' ->> 'type' IN :usersFilterTypes)", nativeQuery = true)
"AND (:searchText IS NULL OR t.name ILIKE concat('%', :searchText, '%')) " +
"AND (cast(t.configuration as json) ->> 'type' <> 'PLATFORM_USERS' OR " +
"cast(t.configuration as json) -> 'usersFilter' ->> 'type' IN :usersFilterTypes)", nativeQuery = true)
Page<NotificationTargetEntity> findByTenantIdAndSearchTextAndUsersFilterTypeIfPresent(@Param("tenantId") UUID tenantId,
@Param("searchText") String searchText,
@Param("usersFilterTypes") List<String> usersFilterTypes,
Pageable pageable);
@Query(value = "SELECT * FROM notification_target t WHERE t.tenant_id = :tenantId " +
"AND (cast(t.configuration as json) ->> 'type' = 'PLATFORM_USERS' AND " +
"cast(t.configuration as json) -> 'usersFilter' ->> 'type' IN :usersFilterTypes)", nativeQuery = true)
Page<NotificationTargetEntity> findByTenantIdAndUsersFilterType(@Param("tenantId") UUID tenantId,
@Param("usersFilterTypes") List<String> usersFilterTypes,
Pageable pageable);
List<NotificationTargetEntity> findByTenantIdAndIdIn(UUID tenantId, List<UUID> ids);
@Transactional

Loading…
Cancel
Save