thingsboard/ui-ngx/src/app/shared/models/notification.models.ts

421 lines
13 KiB
TypeScript
Raw Normal View History

2022-12-28 10:03:11 +02:00
///
/// Copyright © 2016-2023 The Thingsboard Authors
2022-12-28 10:03:11 +02:00
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
import { NotificationId } from '@shared/models/id/notification-id';
import { NotificationRequestId } from '@shared/models/id/notification-request-id';
import { UserId } from '@shared/models/id/user-id';
import { BaseData } from '@shared/models/base-data';
import { TenantId } from '@shared/models/id/tenant-id';
import { NotificationTargetId } from '@shared/models/id/notification-target-id';
import { NotificationTemplateId } from '@shared/models/id/notification-template-id';
import { EntityId } from '@shared/models/id/entity-id';
import { NotificationRuleId } from '@shared/models/id/notification-rule-id';
import { AlarmSearchStatus, AlarmSeverity, AlarmStatus } from '@shared/models/alarm.models';
2023-01-31 02:03:51 +02:00
import { EntityType } from '@shared/models/entity-type.models';
2022-12-28 10:03:11 +02:00
export interface Notification {
readonly id: NotificationId;
readonly requestId: NotificationRequestId;
readonly recipientId: UserId;
readonly type: NotificationType;
readonly subject: string;
2022-12-28 10:03:11 +02:00
readonly text: string;
readonly info: NotificationInfo;
readonly status: NotificationStatus;
readonly createdTime: number;
2023-03-15 13:28:31 +02:00
readonly additionalConfig?: WebDeliveryMethodAdditionalConfig;
2022-12-28 10:03:11 +02:00
}
export interface NotificationInfo {
description: string;
type: string;
2023-02-06 13:31:00 +02:00
alarmSeverity?: AlarmSeverity;
alarmStatus?: AlarmStatus;
alarmType?: string;
2023-03-14 16:37:05 +02:00
stateEntityId?: EntityId;
2022-12-28 10:03:11 +02:00
}
export interface NotificationRequest extends Omit<BaseData<NotificationRequestId>, 'label'> {
tenantId?: TenantId;
targets: Array<string>;
templateId?: NotificationTemplateId;
template?: NotificationTemplate;
2022-12-28 10:03:11 +02:00
info?: NotificationInfo;
deliveryMethods: Array<NotificationDeliveryMethod>;
originatorEntityId: EntityId;
status: NotificationRequestStatus;
stats: NotificationRequestStats;
additionalConfig: NotificationRequestConfig;
}
export interface NotificationRequestInfo extends NotificationRequest {
templateName: string;
deliveryMethods: NotificationDeliveryMethod[];
}
export interface NotificationRequestPreview {
totalRecipientsCount: number;
recipientsCountByTarget: { [key in string]: number };
processedTemplates: { [key in NotificationDeliveryMethod]: DeliveryMethodNotificationTemplate };
}
2022-12-28 10:03:11 +02:00
export interface NotificationRequestStats {
sent: Map<NotificationDeliveryMethod, any>;
errors: { [key in NotificationDeliveryMethod]: {[key in string]: string}};
2022-12-28 10:03:11 +02:00
processedRecipients: Map<NotificationDeliveryMethod, Set<UserId>>;
}
export interface NotificationRequestConfig {
sendingDelayInSec: number;
}
export interface NotificationSettings {
deliveryMethodsConfigs: { [key in NotificationDeliveryMethod]: NotificationDeliveryMethodConfig };
2022-12-28 10:03:11 +02:00
}
export interface NotificationDeliveryMethodConfig extends Partial<SlackNotificationDeliveryMethodConfig>{
2022-12-28 10:03:11 +02:00
enabled: boolean;
method: NotificationDeliveryMethod;
}
interface SlackNotificationDeliveryMethodConfig {
botToken: string;
}
2022-12-28 10:03:11 +02:00
export interface SlackConversation {
id: string;
name: string;
}
export interface NotificationRule extends Omit<BaseData<NotificationRuleId>, 'label'>{
tenantId: TenantId;
templateId: NotificationTemplateId;
2023-01-31 02:03:51 +02:00
triggerType: TriggerType;
triggerConfig: NotificationRuleTriggerConfig;
2023-02-01 02:02:27 +02:00
recipientsConfig: NotificationRuleRecipientConfig;
additionalConfig: {description: string};
2022-12-28 10:03:11 +02:00
}
2023-03-16 15:45:34 +02:00
export type NotificationRuleTriggerConfig = Partial<AlarmNotificationRuleTriggerConfig & DeviceInactivityNotificationRuleTriggerConfig & EntityActionNotificationRuleTriggerConfig & AlarmCommentNotificationRuleTriggerConfig & AlarmAssignmentNotificationRuleTriggerConfig>
export interface AlarmNotificationRuleTriggerConfig {
2023-01-31 02:03:51 +02:00
alarmTypes?: Array<string>;
alarmSeverities?: Array<AlarmSeverity>;
2023-03-16 15:45:34 +02:00
notifyOn: Array<AlarmAction>;
clearRule?: ClearRule;
}
interface ClearRule {
alarmStatuses: Array<AlarmSearchStatus>
}
export interface DeviceInactivityNotificationRuleTriggerConfig {
2023-01-31 02:03:51 +02:00
devices?: Array<string>;
2023-02-01 15:58:00 +02:00
deviceProfiles?: Array<string>;
2022-12-28 10:03:11 +02:00
}
2023-03-16 15:45:34 +02:00
export interface EntityActionNotificationRuleTriggerConfig {
entityType: EntityType;
created: boolean;
updated: boolean;
deleted: boolean;
}
export interface AlarmCommentNotificationRuleTriggerConfig {
alarmTypes?: Array<string>;
alarmSeverities?: Array<AlarmSeverity>;
alarmStatuses?: Array<AlarmSearchStatus>;
notifyOnUnassign?: boolean;
onlyUserComments?: boolean;
}
export interface AlarmAssignmentNotificationRuleTriggerConfig {
alarmTypes?: Array<string>;
alarmSeverities?: Array<AlarmSeverity>;
alarmStatuses?: Array<AlarmSearchStatus>;
notifyOnUnassign?: boolean;
}
export enum AlarmAction {
CREATED = 'CREATED',
SEVERITY_CHANGED = 'SEVERITY_CHANGED',
ACKNOWLEDGED = 'ACKNOWLEDGED',
CLEARED = 'CLEARED'
}
export const AlarmActionTranslationMap = new Map<AlarmAction, string>([
[AlarmAction.CREATED, 'notification.notify-alarm-action.created'],
[AlarmAction.SEVERITY_CHANGED, 'notification.notify-alarm-action.severity-changed'],
[AlarmAction.ACKNOWLEDGED, 'notification.notify-alarm-action.acknowledged'],
[AlarmAction.CLEARED, 'notification.notify-alarm-action.cleared']
])
2023-01-31 02:03:51 +02:00
export interface NotificationRuleRecipientConfig {
targets?: Array<string>;
2023-02-02 15:25:04 +02:00
escalationTable?: {[key: number]: Array<string>};
2022-12-28 10:03:11 +02:00
}
export interface NonConfirmedNotificationEscalation {
delayInSec: number;
2023-02-02 15:25:04 +02:00
targets: Array<string>;
2022-12-28 10:03:11 +02:00
}
export interface NotificationTarget extends Omit<BaseData<NotificationTargetId>, 'label'>{
tenantId: TenantId;
configuration: NotificationTargetConfig;
}
export interface NotificationTargetConfig extends Partial<PlatformUsersNotificationTargetConfig & SlackNotificationTargetConfig> {
description?: string;
type: NotificationTargetType;
}
export interface PlatformUsersNotificationTargetConfig {
usersFilter: UsersFilter;
}
export interface UsersFilter extends
Partial<UserListNotificationTargetConfig & CustomerUsersNotificationTargetConfig>{
2022-12-28 10:03:11 +02:00
type: NotificationTargetConfigType;
}
interface UserListNotificationTargetConfig {
usersIds: Array<string>;
}
interface CustomerUsersNotificationTargetConfig {
customerId: string;
}
export interface SlackNotificationTargetConfig {
conversationType: SlackChanelType;
conversation: SlackConversation;
}
export enum NotificationTargetType {
PLATFORM_USERS = 'PLATFORM_USERS',
SLACK = 'SLACK'
}
export const NotificationTargetTypeTranslationMap = new Map<NotificationTargetType, string>([
[NotificationTargetType.PLATFORM_USERS, 'notification.platform-users'],
[NotificationTargetType.SLACK, 'notification.slack']
]);
2022-12-28 10:03:11 +02:00
export interface NotificationTemplate extends Omit<BaseData<NotificationTemplateId>, 'label'>{
tenantId: TenantId;
notificationType: NotificationType;
2022-12-28 10:03:11 +02:00
configuration: NotificationTemplateConfig;
}
interface NotificationTemplateConfig {
defaultTextTemplate: string;
2023-01-12 18:11:37 +02:00
notificationSubject: string;
deliveryMethodsTemplates: {
[key in NotificationDeliveryMethod]: DeliveryMethodNotificationTemplate
};
2022-12-28 10:03:11 +02:00
}
2023-01-12 18:11:37 +02:00
export interface DeliveryMethodNotificationTemplate extends
2023-03-15 13:28:31 +02:00
Partial<WebDeliveryMethodNotificationTemplate & EmailDeliveryMethodNotificationTemplate & SlackDeliveryMethodNotificationTemplate>{
body?: string;
2023-01-12 18:11:37 +02:00
enabled: boolean;
2022-12-28 10:03:11 +02:00
method: NotificationDeliveryMethod;
}
2023-03-15 13:28:31 +02:00
interface WebDeliveryMethodNotificationTemplate {
subject?: string;
2023-03-15 13:28:31 +02:00
additionalConfig: WebDeliveryMethodAdditionalConfig;
}
2023-03-15 13:28:31 +02:00
interface WebDeliveryMethodAdditionalConfig {
icon: {
enabled: boolean;
icon: string;
color: string;
};
actionButtonConfig: {
enabled: boolean;
text: string;
2023-03-14 16:37:05 +02:00
linkType: ActionButtonLinkType;
link?: string;
dashboardId?: string;
dashboardState?: string;
2023-03-14 16:37:05 +02:00
setEntityIdInState?: boolean;
};
}
2022-12-28 10:03:11 +02:00
interface EmailDeliveryMethodNotificationTemplate {
subject: string;
}
interface SlackDeliveryMethodNotificationTemplate {
conversationType: SlackChanelType;
conversationId: string;
}
export enum NotificationStatus {
SENT = 'SENT',
READ = 'READ'
}
export enum NotificationDeliveryMethod {
2023-03-15 13:28:31 +02:00
WEB = 'WEB',
2022-12-28 10:03:11 +02:00
SMS = 'SMS',
EMAIL = 'EMAIL',
SLACK = 'SLACK'
}
export const NotificationDeliveryMethodTranslateMap = new Map<NotificationDeliveryMethod, string>([
2023-03-15 13:28:31 +02:00
[NotificationDeliveryMethod.WEB, 'notification.delivery-method-type.web'],
[NotificationDeliveryMethod.SMS, 'notification.delivery-method-type.sms'],
[NotificationDeliveryMethod.EMAIL, 'notification.delivery-method-type.email'],
2023-03-14 16:37:05 +02:00
[NotificationDeliveryMethod.SLACK, 'notification.delivery-method-type.slack']
]);
2022-12-28 10:03:11 +02:00
export enum NotificationRequestStatus {
PROCESSING = 'PROCESSING',
SCHEDULED = 'SCHEDULED',
SENT = 'SENT'
2022-12-28 10:03:11 +02:00
}
export const NotificationRequestStatusTranslateMap = new Map<NotificationRequestStatus, string>([
[NotificationRequestStatus.PROCESSING, 'notification.request-status.processing'],
[NotificationRequestStatus.SCHEDULED, 'notification.request-status.scheduled'],
[NotificationRequestStatus.SENT, 'notification.request-status.sent']
]);
2022-12-28 10:03:11 +02:00
export enum SlackChanelType {
PUBLIC_CHANNEL = 'PUBLIC_CHANNEL',
PRIVATE_CHANNEL = 'PRIVATE_CHANNEL',
DIRECT= 'DIRECT'
2022-12-28 10:03:11 +02:00
}
export const SlackChanelTypesTranslateMap = new Map<SlackChanelType, string>([
[SlackChanelType.DIRECT, 'notification.slack-chanel-types.direct'],
[SlackChanelType.PUBLIC_CHANNEL, 'notification.slack-chanel-types.public-channel'],
[SlackChanelType.PRIVATE_CHANNEL, 'notification.slack-chanel-types.private-channel']
]);
2022-12-28 10:03:11 +02:00
export enum NotificationTargetConfigType {
ALL_USERS = 'ALL_USERS',
2022-12-28 10:03:11 +02:00
USER_LIST = 'USER_LIST',
CUSTOMER_USERS = 'CUSTOMER_USERS',
ORIGINATOR_ENTITY_OWNER_USERS = 'ORIGINATOR_ENTITY_OWNER_USERS'
2022-12-28 10:03:11 +02:00
}
export const NotificationTargetConfigTypeTranslateMap = new Map<NotificationTargetConfigType, string>([
[NotificationTargetConfigType.ALL_USERS, 'notification.target-type.all-users'],
[NotificationTargetConfigType.USER_LIST, 'notification.target-type.user-list'],
[NotificationTargetConfigType.CUSTOMER_USERS, 'notification.target-type.customer-users'],
[NotificationTargetConfigType.ORIGINATOR_ENTITY_OWNER_USERS, 'notification.target-type.originator-entity-owner-users']
]);
export enum NotificationType {
2023-01-12 18:11:37 +02:00
GENERAL = 'GENERAL',
ALARM = 'ALARM',
DEVICE_INACTIVITY = 'DEVICE_INACTIVITY',
ENTITY_ACTION = 'ENTITY_ACTION',
ALARM_COMMENT = 'ALARM_COMMENT',
ALARM_ASSIGNMENT = 'ALARM_ASSIGNMENT'
}
2023-01-12 18:11:37 +02:00
2023-02-06 13:31:00 +02:00
export const NotificationTypeIcons = new Map<NotificationType, string | null>([
[NotificationType.ALARM, 'warning'],
[NotificationType.DEVICE_INACTIVITY, 'phonelink_off'],
[NotificationType.ENTITY_ACTION, 'devices'],
[NotificationType.ALARM_COMMENT, 'comment'],
[NotificationType.ALARM_ASSIGNMENT, 'assignment_turned_in'],
2023-02-06 13:31:00 +02:00
]);
2023-02-09 12:31:06 +02:00
export const AlarmSeverityNotificationColors = new Map<AlarmSeverity, string>(
[
[AlarmSeverity.CRITICAL, '#D12730'],
[AlarmSeverity.MAJOR, '#FEAC0C'],
[AlarmSeverity.MINOR, '#F2DA05'],
[AlarmSeverity.WARNING, '#F66716'],
[AlarmSeverity.INDETERMINATE, '#00000061']
]
);
export enum ActionButtonLinkType {
LINK = 'LINK',
DASHBOARD = 'DASHBOARD'
}
export const ActionButtonLinkTypeTranslateMap = new Map<ActionButtonLinkType, string>([
[ActionButtonLinkType.LINK, 'notification.link-type.link'],
[ActionButtonLinkType.DASHBOARD, 'notification.link-type.dashboard']
]);
2023-01-12 18:11:37 +02:00
interface NotificationTemplateTypeTranslate {
name: string;
hint?: string;
}
export const NotificationTemplateTypeTranslateMap = new Map<NotificationType, NotificationTemplateTypeTranslate>([
[NotificationType.GENERAL,
2023-01-12 18:11:37 +02:00
{
name: 'notification.template-type.general',
hint: 'notification.template-hint.general'
2023-01-12 18:11:37 +02:00
}
],
[NotificationType.ALARM,
2023-01-12 18:11:37 +02:00
{
name: 'notification.template-type.alarm',
hint: 'notification.template-hint.alarm'
}
],
[NotificationType.DEVICE_INACTIVITY,
{
name: 'notification.template-type.device-inactivity',
hint: 'notification.template-hint.device-inactivity'
}
],
[NotificationType.ENTITY_ACTION,
{
name: 'notification.template-type.entity-action',
hint: 'notification.template-hint.entity-action'
}
],
[NotificationType.ALARM_COMMENT,
{
name: 'notification.template-type.alarm-comment',
hint: 'notification.template-hint.alarm-comment'
}
],
[NotificationType.ALARM_ASSIGNMENT,
{
name: 'notification.template-type.alarm-assignment',
hint: 'notification.template-hint.alarm-assignment'
}
2023-03-14 16:37:05 +02:00
]
2023-01-12 18:11:37 +02:00
]);
2023-01-27 15:47:08 +02:00
export enum TriggerType {
ALARM = 'ALARM',
DEVICE_INACTIVITY = 'DEVICE_INACTIVITY',
ENTITY_ACTION = 'ENTITY_ACTION',
ALARM_COMMENT = 'ALARM_COMMENT',
ALARM_ASSIGNMENT = 'ALARM_ASSIGNMENT'
2023-01-27 15:47:08 +02:00
}
export const TriggerTypeTranslationMap = new Map<TriggerType, string>([
[TriggerType.ALARM, 'notification.trigger.alarm'],
[TriggerType.DEVICE_INACTIVITY, 'notification.trigger.device-inactivity'],
[TriggerType.ENTITY_ACTION, 'notification.trigger.entity-action'],
[TriggerType.ALARM_COMMENT, 'notification.trigger.alarm-comment'],
[TriggerType.ALARM_ASSIGNMENT, 'notification.trigger.alarm-assignment'],
2023-01-27 15:47:08 +02:00
]);