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