@ -17,6 +17,7 @@ package org.thingsboard.server.controller;
import io.swagger.v3.oas.annotations.Parameter ;
import io.swagger.v3.oas.annotations.Parameter ;
import io.swagger.v3.oas.annotations.media.Schema ;
import io.swagger.v3.oas.annotations.media.Schema ;
import jakarta.servlet.http.HttpServletRequest ;
import jakarta.validation.Valid ;
import jakarta.validation.Valid ;
import lombok.RequiredArgsConstructor ;
import lombok.RequiredArgsConstructor ;
import lombok.extern.slf4j.Slf4j ;
import lombok.extern.slf4j.Slf4j ;
@ -35,6 +36,8 @@ import org.thingsboard.rule.engine.api.NotificationCenter;
import org.thingsboard.server.common.data.EntityType ;
import org.thingsboard.server.common.data.EntityType ;
import org.thingsboard.server.common.data.User ;
import org.thingsboard.server.common.data.User ;
import org.thingsboard.server.common.data.exception.ThingsboardException ;
import org.thingsboard.server.common.data.exception.ThingsboardException ;
import org.thingsboard.server.common.data.id.CustomerId ;
import org.thingsboard.server.common.data.id.EntityId ;
import org.thingsboard.server.common.data.id.NotificationId ;
import org.thingsboard.server.common.data.id.NotificationId ;
import org.thingsboard.server.common.data.id.NotificationRequestId ;
import org.thingsboard.server.common.data.id.NotificationRequestId ;
import org.thingsboard.server.common.data.id.NotificationTargetId ;
import org.thingsboard.server.common.data.id.NotificationTargetId ;
@ -44,6 +47,9 @@ import org.thingsboard.server.common.data.notification.NotificationDeliveryMetho
import org.thingsboard.server.common.data.notification.NotificationRequest ;
import org.thingsboard.server.common.data.notification.NotificationRequest ;
import org.thingsboard.server.common.data.notification.NotificationRequestInfo ;
import org.thingsboard.server.common.data.notification.NotificationRequestInfo ;
import org.thingsboard.server.common.data.notification.NotificationRequestPreview ;
import org.thingsboard.server.common.data.notification.NotificationRequestPreview ;
import org.thingsboard.server.common.data.notification.NotificationType ;
import org.thingsboard.server.common.data.notification.info.EntitiesLimitIncreaseRequestNotificationInfo ;
import org.thingsboard.server.common.data.notification.info.NotificationInfo ;
import org.thingsboard.server.common.data.notification.settings.NotificationSettings ;
import org.thingsboard.server.common.data.notification.settings.NotificationSettings ;
import org.thingsboard.server.common.data.notification.settings.UserNotificationSettings ;
import org.thingsboard.server.common.data.notification.settings.UserNotificationSettings ;
import org.thingsboard.server.common.data.notification.targets.MicrosoftTeamsNotificationTargetConfig ;
import org.thingsboard.server.common.data.notification.targets.MicrosoftTeamsNotificationTargetConfig ;
@ -51,6 +57,7 @@ import org.thingsboard.server.common.data.notification.targets.NotificationRecip
import org.thingsboard.server.common.data.notification.targets.NotificationTarget ;
import org.thingsboard.server.common.data.notification.targets.NotificationTarget ;
import org.thingsboard.server.common.data.notification.targets.NotificationTargetType ;
import org.thingsboard.server.common.data.notification.targets.NotificationTargetType ;
import org.thingsboard.server.common.data.notification.targets.platform.PlatformUsersNotificationTargetConfig ;
import org.thingsboard.server.common.data.notification.targets.platform.PlatformUsersNotificationTargetConfig ;
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.SlackConversation ;
import org.thingsboard.server.common.data.notification.targets.slack.SlackNotificationTargetConfig ;
import org.thingsboard.server.common.data.notification.targets.slack.SlackNotificationTargetConfig ;
import org.thingsboard.server.common.data.notification.template.DeliveryMethodNotificationTemplate ;
import org.thingsboard.server.common.data.notification.template.DeliveryMethodNotificationTemplate ;
@ -69,6 +76,7 @@ import org.thingsboard.server.service.notification.NotificationProcessingContext
import org.thingsboard.server.service.security.model.SecurityUser ;
import org.thingsboard.server.service.security.model.SecurityUser ;
import org.thingsboard.server.service.security.permission.Operation ;
import org.thingsboard.server.service.security.permission.Operation ;
import org.thingsboard.server.service.security.permission.Resource ;
import org.thingsboard.server.service.security.permission.Resource ;
import org.thingsboard.server.service.security.system.SystemSecurityService ;
import java.util.Comparator ;
import java.util.Comparator ;
import java.util.HashMap ;
import java.util.HashMap ;
@ -76,6 +84,7 @@ import java.util.LinkedHashMap;
import java.util.LinkedHashSet ;
import java.util.LinkedHashSet ;
import java.util.List ;
import java.util.List ;
import java.util.Map ;
import java.util.Map ;
import java.util.Optional ;
import java.util.Set ;
import java.util.Set ;
import java.util.UUID ;
import java.util.UUID ;
import java.util.stream.Collectors ;
import java.util.stream.Collectors ;
@ -90,6 +99,7 @@ import static org.thingsboard.server.controller.ControllerConstants.PAGE_SIZE_DE
import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION ;
import static org.thingsboard.server.controller.ControllerConstants.SORT_ORDER_DESCRIPTION ;
import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION ;
import static org.thingsboard.server.controller.ControllerConstants.SORT_PROPERTY_DESCRIPTION ;
import static org.thingsboard.server.controller.ControllerConstants.SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH ;
import static org.thingsboard.server.controller.ControllerConstants.SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH ;
import static org.thingsboard.server.controller.ControllerConstants.TENANT_AUTHORITY_PARAGRAPH ;
import static org.thingsboard.server.service.security.permission.Resource.NOTIFICATION ;
import static org.thingsboard.server.service.security.permission.Resource.NOTIFICATION ;
@RestController
@RestController
@ -105,6 +115,7 @@ public class NotificationController extends BaseController {
private final NotificationTargetService notificationTargetService ;
private final NotificationTargetService notificationTargetService ;
private final NotificationCenter notificationCenter ;
private final NotificationCenter notificationCenter ;
private final NotificationSettingsService notificationSettingsService ;
private final NotificationSettingsService notificationSettingsService ;
private final SystemSecurityService systemSecurityService ;
@ApiOperation ( value = "Get notifications (getNotifications)" ,
@ApiOperation ( value = "Get notifications (getNotifications)" ,
notes = "Returns the page of notifications for current user." + NEW_LINE +
notes = "Returns the page of notifications for current user." + NEW_LINE +
@ -282,6 +293,34 @@ public class NotificationController extends BaseController {
return doSaveAndLog ( EntityType . NOTIFICATION_REQUEST , notificationRequest , ( tenantId , request ) - > notificationCenter . processNotificationRequest ( tenantId , request , null ) ) ;
return doSaveAndLog ( EntityType . NOTIFICATION_REQUEST , notificationRequest , ( tenantId , request ) - > notificationCenter . processNotificationRequest ( tenantId , request , null ) ) ;
}
}
@ApiOperation ( value = "Send entity limit increase request notification to System administrators (sendEntitiesLimitIncreaseRequest)" ,
notes = "Send entity limit increase request notification by Tenant Administrator to System administrators." +
TENANT_AUTHORITY_PARAGRAPH )
@PostMapping ( "/notification/entitiesLimitIncreaseRequest/{entityType}" )
@PreAuthorize ( "hasAnyAuthority('TENANT_ADMIN')" )
public void sendEntitiesLimitIncreaseRequest ( @Parameter ( description = "Entity type" , required = true , schema = @Schema ( allowableValues = { "DEVICE" , "ASSET" , "CUSTOMER" , "USER" , "DASHBOARD" , "RULE_CHAIN" , "EDGE" } ) )
@PathVariable ( "entityType" ) String strEntityType ,
@AuthenticationPrincipal SecurityUser user ,
HttpServletRequest request ) throws Exception {
EntityType entityType = checkEnumParameter ( "entityType" , strEntityType , EntityType : : valueOf ) ;
Optional < NotificationTarget > sysAdmins = notificationTargetService . findNotificationTargetsByTenantIdAndUsersFilterType ( TenantId . SYS_TENANT_ID , UsersFilterType . SYSTEM_ADMINISTRATORS )
. stream ( ) . findFirst ( ) ;
if ( sysAdmins . isPresent ( ) ) {
NotificationTargetId notificationTargetId = sysAdmins . get ( ) . getId ( ) ;
String baseUrl = systemSecurityService . getBaseUrl ( TenantId . SYS_TENANT_ID , new CustomerId ( EntityId . NULL_UUID ) , request ) ;
NotificationInfo info = EntitiesLimitIncreaseRequestNotificationInfo . builder ( )
. entityType ( entityType )
. userEmail ( user . getEmail ( ) )
. increaseLimitActionLabel ( "Set new limit" )
. increaseLimitLink ( "/tenantProfiles/" + tenantService . findTenantById ( user . getTenantId ( ) ) . getTenantProfileId ( ) . toString ( ) )
. baseUrl ( baseUrl )
. build ( ) ;
notificationCenter . sendSystemNotification ( TenantId . SYS_TENANT_ID , notificationTargetId , NotificationType . ENTITIES_LIMIT_INCREASE_REQUEST , info ) ;
} else {
throw new IllegalArgumentException ( "Notification target for 'System administrators' not found" ) ;
}
}
@ApiOperation ( value = "Get notification request preview (getNotificationRequestPreview)" ,
@ApiOperation ( value = "Get notification request preview (getNotificationRequestPreview)" ,
notes = "Returns preview for notification request." + NEW_LINE +
notes = "Returns preview for notification request." + NEW_LINE +
"`processedTemplates` shows how the notifications for each delivery method will look like " +
"`processedTemplates` shows how the notifications for each delivery method will look like " +