// // Copyright © 2020, 2021 Anticrm Platform Contributors. // Copyright © 2021, 2022, 2023 Hardcore Engineering Inc. // // Licensed under the Eclipse Public 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 https://www.eclipse.org/legal/epl-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 { ActivityMessage } from '@hcengineering/activity' import { Employee, Person, PersonSpace } from '@hcengineering/contact' import { PersonId, Class, Doc, Mixin, Ref, Tx, TxCUD } from '@hcengineering/core' import { BaseNotificationType, InboxNotification, NotificationContent, NotificationProvider, NotificationType } from '@hcengineering/notification' import { Metadata, Plugin, Resource, plugin } from '@hcengineering/platform' import type { TriggerControl, TriggerFunc } from '@hcengineering/server-core' /** * @public */ export const serverNotificationId = 'server-notification' as Plugin export { DOMAIN_USER_NOTIFY, DOMAIN_NOTIFICATION, DOMAIN_DOC_NOTIFY } from '@hcengineering/notification' /** * @public */ export type Presenter = (doc: T, control: TriggerControl) => Promise /** * @public */ export interface HTMLPresenter extends Class { presenter: Resource> } /** * @public */ export interface TextPresenter extends Class { presenter: Resource> } /** * @public */ export type TypeMatchFunc = Resource< ( tx: Tx, doc: Doc, person: Person, socialIds: PersonId[], type: NotificationType, control: TriggerControl ) => boolean | Promise > /** * @public */ export interface TypeMatch extends NotificationType { func: TypeMatchFunc } /** * @public */ export type NotificationContentProvider = ( doc: Doc, tx: TxCUD, target: PersonId, control: TriggerControl ) => Promise /** * @public */ export interface NotificationPresenter extends Class { presenter: Resource } export interface ReceiverInfo { _id: PersonId person: Person socialStrings: PersonId[] space: Ref employee: Employee } export interface SenderInfo { _id: PersonId person?: Person socialStrings: PersonId[] } export type NotificationProviderFunc = ( control: TriggerControl, types: BaseNotificationType[], object: Doc, data: InboxNotification, receiver: ReceiverInfo, sender: SenderInfo, message?: ActivityMessage ) => Promise export interface NotificationProviderResources extends Doc { provider: Ref fn: Resource } export const NOTIFICATION_BODY_SIZE = 50 export const PUSH_NOTIFICATION_TITLE_SIZE = 80 /** * @public */ export default plugin(serverNotificationId, { metadata: { SesUrl: '' as Metadata, SesAuthToken: '' as Metadata, InboxOnlyNotifications: '' as Metadata }, class: { NotificationProviderResources: '' as Ref> }, mixin: { HTMLPresenter: '' as Ref>, TextPresenter: '' as Ref>, TypeMatch: '' as Ref>, NotificationPresenter: '' as Ref> }, trigger: { OnAttributeCreate: '' as Resource, OnAttributeUpdate: '' as Resource, OnReactionChanged: '' as Resource, OnDocRemove: '' as Resource, OnEmployeeDeactivate: '' as Resource, PushNotificationsHandler: '' as Resource }, function: { IsUserInFieldValueTypeMatch: '' as TypeMatchFunc, IsUserEmployeeInFieldValueTypeMatch: '' as TypeMatchFunc } })