16 changed files with 465 additions and 8 deletions
@ -0,0 +1,132 @@ |
|||||
|
///
|
||||
|
/// Copyright © 2016-2022 The Thingsboard Authors
|
||||
|
///
|
||||
|
/// 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 { Injectable } from '@angular/core'; |
||||
|
import { HttpClient } from '@angular/common/http'; |
||||
|
import { defaultHttpOptionsFromConfig, RequestConfig } from '@core/http/http-utils'; |
||||
|
import { Observable } from 'rxjs'; |
||||
|
import { PageLink } from '@shared/models/page/page-link'; |
||||
|
import { PageData } from '@shared/models/page/page-data'; |
||||
|
import { |
||||
|
Notification, |
||||
|
NotificationRequest, |
||||
|
NotificationRule, |
||||
|
NotificationSettings, |
||||
|
NotificationTarget, |
||||
|
NotificationTemplate, |
||||
|
SlackChanelType, |
||||
|
SlackConversation |
||||
|
} from '@shared/models/notification.models'; |
||||
|
import { User } from '@shared/models/user.model'; |
||||
|
|
||||
|
@Injectable({ |
||||
|
providedIn: 'root' |
||||
|
}) |
||||
|
export class NotificationService { |
||||
|
|
||||
|
constructor( |
||||
|
private http: HttpClient |
||||
|
) { |
||||
|
} |
||||
|
|
||||
|
public getNotifications(pageLink: PageLink, config?: RequestConfig): Observable<PageData<Notification>> { |
||||
|
return this.http.get<PageData<Notification>>(`/api/notifications${pageLink.toQuery()}`, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public markNotificationAsRead(id: string, config?: RequestConfig): Observable<void> { |
||||
|
return this.http.put<void>(`/api/notification/${id}/read`, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public createNotificationRequest(notification: NotificationRequest, config?: RequestConfig): Observable<any> { |
||||
|
return this.http.post<NotificationRequest>('/api/notification/request', notification, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public getNotificationRequestById(id: string, config?: RequestConfig): Observable<NotificationRequest> { |
||||
|
return this.http.get<NotificationRequest>(`/api/notification/request/${id}`, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public deleteNotificationRequest(id: string, config?: RequestConfig): Observable<void> { |
||||
|
return this.http.delete<void>(`/api/notification/request/${id}`, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public getNotificationRequests(pageLink: PageLink, config?: RequestConfig): Observable<PageData<NotificationRequest>> { |
||||
|
return this.http.get<PageData<NotificationRequest>>('/api/notification/request/', defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public getNotificationSettings(config?: RequestConfig): Observable<NotificationSettings> { |
||||
|
return this.http.get<NotificationSettings>('/api/notification/settings', defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public saveNotificationSettings(notificationSettings: NotificationSettings, config?: RequestConfig): Observable<NotificationSettings> { |
||||
|
return this.http.post<NotificationSettings>('/api/notification/settings', notificationSettings, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public listSlackConversations(type: SlackChanelType, config?: RequestConfig): Observable<Array<SlackConversation>> { |
||||
|
return this.http.get<Array<SlackConversation>>(`/api/notification/slack/conversations?type=${type}`, |
||||
|
defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public saveNotificationRule(notificationRule: NotificationRule, config?: RequestConfig): Observable<NotificationRule> { |
||||
|
return this.http.post<NotificationRule>('/api/notification/rule', notificationRule, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public getNotificationRuleById(id: string, config?: RequestConfig): Observable<NotificationRule> { |
||||
|
return this.http.get<NotificationRule>(`/api/notification/rule/${id}`, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public deleteNotificationRule(id: string, config?: RequestConfig): Observable<void> { |
||||
|
return this.http.delete<void>(`/api/notification/rule/${id}`, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public getNotificationRules(pageLink: PageLink, config?: RequestConfig): Observable<PageData<NotificationRule>> { |
||||
|
return this.http.get<PageData<NotificationRule>>(`/api/notification/rules${pageLink.toQuery()}`, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public saveNotificationTarget(notificationTarget: NotificationTarget, config?: RequestConfig): Observable<NotificationTarget> { |
||||
|
return this.http.post<NotificationTarget>('/api/notification/target', notificationTarget, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public getNotificationTargetById(id: string, config?: RequestConfig): Observable<NotificationTarget> { |
||||
|
return this.http.get<NotificationTarget>(`/api/notification/target/${id}`, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public deleteNotificationTarget(id: string, config?: RequestConfig): Observable<void> { |
||||
|
return this.http.delete<void>(`/api/notification/target/${id}`, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public getNotificationTargets(pageLink: PageLink, config?: RequestConfig): Observable<PageData<NotificationTarget>> { |
||||
|
return this.http.get<PageData<NotificationTarget>>(`/api/notification/targets${pageLink.toQuery()}`, |
||||
|
defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public getRecipientsForNotificationTargetConfig(notificationTarget: NotificationTarget, pageLink: PageLink, |
||||
|
config?: RequestConfig): Observable<PageData<User>> { |
||||
|
return this.http.post<PageData<User>>(`/api/notification/target/recipients${pageLink.toQuery()}`, notificationTarget, |
||||
|
defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public saveNotificationTemplate(notificationTarget: NotificationTemplate, config?: RequestConfig): Observable<NotificationTemplate> { |
||||
|
return this.http.post<NotificationTemplate>('/api/notification/template', notificationTarget, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public getNotificationTemplateById(id: string, config?: RequestConfig): Observable<NotificationTemplate> { |
||||
|
return this.http.get<NotificationTemplate>(`/api/notification/template/${id}`, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
|
||||
|
public deleteNotificationTemplate(id: string, config?: RequestConfig): Observable<void> { |
||||
|
return this.http.delete<void>(`/api/notification/template/${id}`, defaultHttpOptionsFromConfig(config)); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,22 @@ |
|||||
|
///
|
||||
|
/// Copyright © 2016-2022 The Thingsboard Authors
|
||||
|
///
|
||||
|
/// 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.
|
||||
|
///
|
||||
|
|
||||
|
export class NotificationId { |
||||
|
id: string; |
||||
|
constructor(id: string) { |
||||
|
this.id = id; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,26 @@ |
|||||
|
///
|
||||
|
/// Copyright © 2016-2022 The Thingsboard Authors
|
||||
|
///
|
||||
|
/// 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 { EntityId } from '@shared/models/id/entity-id'; |
||||
|
import { EntityType } from '@shared/models/entity-type.models'; |
||||
|
|
||||
|
export class NotificationRequestId implements EntityId { |
||||
|
entityType = EntityType.NOTIFICATION_REQUEST; |
||||
|
id: string; |
||||
|
constructor(id: string) { |
||||
|
this.id = id; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,26 @@ |
|||||
|
///
|
||||
|
/// Copyright © 2016-2022 The Thingsboard Authors
|
||||
|
///
|
||||
|
/// 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 { EntityId } from '@shared/models/id/entity-id'; |
||||
|
import { EntityType } from '@shared/models/entity-type.models'; |
||||
|
|
||||
|
export class NotificationRuleId implements EntityId { |
||||
|
entityType = EntityType.NOTIFICATION_RULE; |
||||
|
id: string; |
||||
|
constructor(id: string) { |
||||
|
this.id = id; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,26 @@ |
|||||
|
///
|
||||
|
/// Copyright © 2016-2022 The Thingsboard Authors
|
||||
|
///
|
||||
|
/// 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 { EntityId } from '@shared/models/id/entity-id'; |
||||
|
import { EntityType } from '@shared/models/entity-type.models'; |
||||
|
|
||||
|
export class NotificationTargetId implements EntityId { |
||||
|
entityType = EntityType.NOTIFICATION_TARGET; |
||||
|
id: string; |
||||
|
constructor(id: string) { |
||||
|
this.id = id; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,26 @@ |
|||||
|
///
|
||||
|
/// Copyright © 2016-2022 The Thingsboard Authors
|
||||
|
///
|
||||
|
/// 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 { EntityId } from '@shared/models/id/entity-id'; |
||||
|
import { EntityType } from '@shared/models/entity-type.models'; |
||||
|
|
||||
|
export class NotificationTemplateId implements EntityId { |
||||
|
entityType = EntityType.NOTIFICATION_TEMPLATE; |
||||
|
id: string; |
||||
|
constructor(id: string) { |
||||
|
this.id = id; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,186 @@ |
|||||
|
///
|
||||
|
/// Copyright © 2016-2022 The Thingsboard Authors
|
||||
|
///
|
||||
|
/// 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 { DashboardId } from '@shared/models/id/dashboard-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'; |
||||
|
|
||||
|
export interface Notification { |
||||
|
readonly id: NotificationId; |
||||
|
readonly requestId: NotificationRequestId; |
||||
|
readonly recipientId: UserId; |
||||
|
readonly type: string; |
||||
|
readonly text: string; |
||||
|
readonly info: NotificationInfo; |
||||
|
readonly originatorType: NotificationOriginatorType; |
||||
|
readonly status: NotificationStatus; |
||||
|
} |
||||
|
|
||||
|
export interface NotificationInfo { |
||||
|
description: string; |
||||
|
dashboardId: DashboardId; |
||||
|
originatorType: NotificationOriginatorType; |
||||
|
} |
||||
|
|
||||
|
export interface NotificationRequest extends Omit<BaseData<NotificationRequestId>, 'label'> { |
||||
|
tenantId?: TenantId; |
||||
|
targets: Array<NotificationTargetId>; |
||||
|
templateId: NotificationTemplateId; |
||||
|
info?: NotificationInfo; |
||||
|
deliveryMethods: Array<NotificationDeliveryMethod>; |
||||
|
originatorEntityId: EntityId; |
||||
|
originatorType: NotificationOriginatorType; |
||||
|
status: NotificationRequestStatus; |
||||
|
stats: NotificationRequestStats; |
||||
|
additionalConfig: NotificationRequestConfig; |
||||
|
} |
||||
|
|
||||
|
export interface NotificationRequestStats { |
||||
|
sent: Map<NotificationDeliveryMethod, any>; |
||||
|
errors: Map<NotificationDeliveryMethod, Map<string, string>>; |
||||
|
processedRecipients: Map<NotificationDeliveryMethod, Set<UserId>>; |
||||
|
} |
||||
|
|
||||
|
export interface NotificationRequestConfig { |
||||
|
sendingDelayInSec: number; |
||||
|
} |
||||
|
|
||||
|
export interface NotificationSettings { |
||||
|
deliveryMethodsConfigs: Map<NotificationDeliveryMethod, NotificationDeliveryMethodConfig>; |
||||
|
} |
||||
|
|
||||
|
export interface NotificationDeliveryMethodConfig { |
||||
|
enabled: boolean; |
||||
|
method: NotificationDeliveryMethod; |
||||
|
} |
||||
|
|
||||
|
export interface SlackConversation { |
||||
|
id: string; |
||||
|
name: string; |
||||
|
} |
||||
|
|
||||
|
export interface NotificationRule extends Omit<BaseData<NotificationRuleId>, 'label'>{ |
||||
|
tenantId: TenantId; |
||||
|
templateId: NotificationTemplateId; |
||||
|
deliveryMethods: Array<NotificationDeliveryMethod>; |
||||
|
configuration: NotificationRuleConfig; |
||||
|
} |
||||
|
|
||||
|
export interface NotificationRuleConfig { |
||||
|
initialNotificationTargetId: NotificationTargetId; |
||||
|
escalationConfig: NotificationEscalationConfig; |
||||
|
} |
||||
|
|
||||
|
export interface NotificationEscalationConfig { |
||||
|
escalations: Array<NonConfirmedNotificationEscalation>; |
||||
|
} |
||||
|
|
||||
|
export interface NonConfirmedNotificationEscalation { |
||||
|
delayInSec: number; |
||||
|
notificationTargetId: NotificationTargetId; |
||||
|
} |
||||
|
|
||||
|
export interface NotificationTarget extends Omit<BaseData<NotificationTargetId>, 'label'>{ |
||||
|
tenantId: TenantId; |
||||
|
configuration: NotificationTargetConfig; |
||||
|
} |
||||
|
|
||||
|
export interface NotificationTargetConfig extends |
||||
|
Partial<SingleUserNotificationTargetConfig & UserListNotificationTargetConfig & CustomerUsersNotificationTargetConfig>{ |
||||
|
type: NotificationTargetConfigType; |
||||
|
} |
||||
|
|
||||
|
interface SingleUserNotificationTargetConfig { |
||||
|
userId: string; |
||||
|
} |
||||
|
|
||||
|
interface UserListNotificationTargetConfig { |
||||
|
usersIds: Array<string>; |
||||
|
} |
||||
|
|
||||
|
interface CustomerUsersNotificationTargetConfig { |
||||
|
customerId: string; |
||||
|
getCustomerIdFromOriginatorEntity: boolean; |
||||
|
} |
||||
|
|
||||
|
export interface NotificationTemplate extends Omit<BaseData<NotificationTemplateId>, 'label'>{ |
||||
|
tenantId: TenantId; |
||||
|
notificationType: string; |
||||
|
configuration: NotificationTemplateConfig; |
||||
|
} |
||||
|
|
||||
|
interface NotificationTemplateConfig { |
||||
|
defaultTextTemplate: string; |
||||
|
templates: Map<NotificationDeliveryMethod, DeliveryMethodNotificationTemplate>; |
||||
|
} |
||||
|
|
||||
|
interface DeliveryMethodNotificationTemplate extends |
||||
|
Partial<EmailDeliveryMethodNotificationTemplate & SlackDeliveryMethodNotificationTemplate>{ |
||||
|
body: string; |
||||
|
method: NotificationDeliveryMethod; |
||||
|
} |
||||
|
|
||||
|
interface EmailDeliveryMethodNotificationTemplate { |
||||
|
subject: string; |
||||
|
} |
||||
|
|
||||
|
interface SlackDeliveryMethodNotificationTemplate { |
||||
|
conversationType: SlackChanelType; |
||||
|
conversationId: string; |
||||
|
} |
||||
|
|
||||
|
export enum NotificationOriginatorType { |
||||
|
ADMIN = 'ADMIN', |
||||
|
ALARM = 'ALARM', |
||||
|
RULE_NODE = 'RULE_NODE' |
||||
|
} |
||||
|
|
||||
|
export enum NotificationStatus { |
||||
|
SENT = 'SENT', |
||||
|
READ = 'READ' |
||||
|
} |
||||
|
|
||||
|
export enum NotificationDeliveryMethod { |
||||
|
WEBSOCKET = 'WEBSOCKET', |
||||
|
SMS = 'SMS', |
||||
|
EMAIL = 'EMAIL', |
||||
|
SLACK = 'SLACK' |
||||
|
} |
||||
|
|
||||
|
export enum NotificationRequestStatus { |
||||
|
PROCESSED = 'PROCESSED', |
||||
|
SCHEDULED = 'SCHEDULED' |
||||
|
} |
||||
|
|
||||
|
export enum SlackChanelType { |
||||
|
USER= 'USER', |
||||
|
PUBLIC_CHANNEL = 'PUBLIC_CHANNEL', |
||||
|
PRIVATE_CHANNEL = 'PRIVATE_CHANNEL' |
||||
|
} |
||||
|
|
||||
|
export enum NotificationTargetConfigType { |
||||
|
SINGLE_USER = 'SINGLE_USER', |
||||
|
USER_LIST = 'USER_LIST', |
||||
|
CUSTOMER_USERS = 'CUSTOMER_USERS', |
||||
|
ALL_USERS = 'ALL_USERS' |
||||
|
} |
||||
Loading…
Reference in new issue