From 97396cc5f266d72d7b2f58596b40e6fd582f1519 Mon Sep 17 00:00:00 2001 From: Denis Bykhov Date: Thu, 27 Apr 2023 22:42:41 +0600 Subject: [PATCH] TSK-1349 Send notification integration disconnect (#3096) Signed-off-by: Denis Bykhov --- models/server-setting/package.json | 2 + models/server-setting/src/index.ts | 11 ++- models/setting/src/index.ts | 34 +++++++++ models/setting/src/migration.ts | 35 ++++++++- models/setting/src/plugin.ts | 5 +- .../notification-resources/src/index.ts | 4 +- server-plugins/setting-resources/src/index.ts | 75 +++++-------------- server-plugins/setting/package.json | 1 + server-plugins/setting/src/index.ts | 7 +- 9 files changed, 106 insertions(+), 68 deletions(-) diff --git a/models/server-setting/package.json b/models/server-setting/package.json index fc5808454f..110580abc0 100644 --- a/models/server-setting/package.json +++ b/models/server-setting/package.json @@ -28,6 +28,8 @@ "@hcengineering/core": "^0.6.23", "@hcengineering/model": "^0.6.2", "@hcengineering/platform": "^0.6.8", + "@hcengineering/setting": "^0.6.5", + "@hcengineering/server-notification": "^0.6.0", "@hcengineering/server-setting": "^0.6.0", "@hcengineering/server-core": "^0.6.1" } diff --git a/models/server-setting/src/index.ts b/models/server-setting/src/index.ts index 4c034e4180..167e14a0f5 100644 --- a/models/server-setting/src/index.ts +++ b/models/server-setting/src/index.ts @@ -17,13 +17,18 @@ import { Builder } from '@hcengineering/model' import core from '@hcengineering/core' -import serverCore from '@hcengineering/server-core' +import serverNotification from '@hcengineering/server-notification' import serverSetting from '@hcengineering/server-setting' +import setting from '@hcengineering/setting' export { serverSettingId } from '@hcengineering/server-setting' export function createModel (builder: Builder): void { - builder.createDoc(serverCore.class.Trigger, core.space.Model, { - trigger: serverSetting.trigger.OnIntegrationDisable + builder.mixin(setting.class.Integration, core.class.Class, serverNotification.mixin.HTMLPresenter, { + presenter: serverSetting.function.IntegrationHTMLPresenter + }) + + builder.mixin(setting.class.Integration, core.class.Class, serverNotification.mixin.TextPresenter, { + presenter: serverSetting.function.IntegrationTextPresenter }) } diff --git a/models/setting/src/index.ts b/models/setting/src/index.ts index 0c7a5157e8..acb16b8a68 100644 --- a/models/setting/src/index.ts +++ b/models/setting/src/index.ts @@ -482,4 +482,38 @@ export function createModel (builder: Builder): void { }, setting.templateField.OwnerPosition ) + + builder.createDoc( + notification.class.NotificationGroup, + core.space.Model, + { + label: setting.string.Setting, + icon: setting.icon.Setting + }, + setting.ids.SettingNotificationGroup + ) + + builder.createDoc( + notification.class.NotificationType, + core.space.Model, + { + hidden: false, + generated: false, + label: setting.string.IntegrationDisabled, + group: setting.ids.SettingNotificationGroup, + field: 'disabled', + txClasses: [core.class.TxUpdateDoc], + objectClass: setting.class.Integration, + templates: { + textTemplate: 'Integration with {doc} was disabled', + htmlTemplate: '

Integration with {doc} was disabled

', + subjectTemplate: 'Integration with {doc} was disabled' + }, + providers: { + [notification.providers.PlatformNotification]: true, + [notification.providers.EmailNotification]: true + } + }, + setting.ids.IntegrationDisabledNotification + ) } diff --git a/models/setting/src/migration.ts b/models/setting/src/migration.ts index 680b008854..17b487ae53 100644 --- a/models/setting/src/migration.ts +++ b/models/setting/src/migration.ts @@ -13,10 +13,11 @@ // limitations under the License. // -import core, { DOMAIN_TX, TxOperations } from '@hcengineering/core' +import core, { DOMAIN_TX, Doc, TxOperations } from '@hcengineering/core' import { MigrateOperation, MigrationClient, MigrationUpgradeClient } from '@hcengineering/model' import setting from './plugin' import { DOMAIN_SETTING } from '.' +import notification, { Collaborators } from '@hcengineering/notification' async function migrateIntegrationsSpace (client: MigrationClient): Promise { const settings = await client.find(DOMAIN_SETTING, { @@ -66,6 +67,37 @@ async function createSpace (tx: TxOperations): Promise { } } +async function fillMigrationCollaborator (tx: TxOperations): Promise { + const h = tx.getHierarchy() + const settings = await tx.findAll(setting.class.Integration, {}) + for (const value of settings) { + if (h.hasMixin(value, notification.mixin.Collaborators)) { + const collabs = h.as(value, notification.mixin.Collaborators) + if (collabs.collaborators === undefined || !collabs.collaborators.includes(collabs.modifiedBy)) { + await tx.updateMixin( + value._id, + value._class, + value.space, + notification.mixin.Collaborators, + { + collaborators: [collabs.createdBy ?? collabs.modifiedBy] + } + ) + } + } else { + await tx.createMixin( + value._id, + setting.class.Integration, + value.space, + notification.mixin.Collaborators, + { + collaborators: [value.createdBy ?? value.modifiedBy] + } + ) + } + } +} + export const settingOperation: MigrateOperation = { async migrate (client: MigrationClient): Promise { await migrateIntegrationsSpace(client) @@ -73,5 +105,6 @@ export const settingOperation: MigrateOperation = { async upgrade (client: MigrationUpgradeClient): Promise { const tx = new TxOperations(client, core.account.System) await createSpace(tx) + await fillMigrationCollaborator(tx) } } diff --git a/models/setting/src/plugin.ts b/models/setting/src/plugin.ts index ccee46614e..bb08c8fdf8 100644 --- a/models/setting/src/plugin.ts +++ b/models/setting/src/plugin.ts @@ -21,6 +21,7 @@ import setting from '@hcengineering/setting-resources/src/plugin' import { AnyComponent } from '@hcengineering/ui' import { Action, ActionCategory, ViewAction } from '@hcengineering/view' import { TemplateFieldFunc } from '@hcengineering/templates' +import { NotificationGroup, NotificationType } from '@hcengineering/notification' export default mergeIds(settingId, setting, { activity: { @@ -29,7 +30,9 @@ export default mergeIds(settingId, setting, { ids: { TxIntegrationDisable: '' as Ref, EnumSetting: '' as Ref, - Configure: '' as Ref + Configure: '' as Ref, + SettingNotificationGroup: '' as Ref, + IntegrationDisabledNotification: '' as Ref }, component: { EnumSetting: '' as AnyComponent, diff --git a/server-plugins/notification-resources/src/index.ts b/server-plugins/notification-resources/src/index.ts index 9b7ee11ab5..2434dc32bc 100644 --- a/server-plugins/notification-resources/src/index.ts +++ b/server-plugins/notification-resources/src/index.ts @@ -214,12 +214,10 @@ async function createEmailNotificationTxes ( ): Promise { const sender = (await control.modelDb.findAll(contact.class.EmployeeAccount, { _id: senderId }))[0] - if (sender === undefined) return - const receiver = (await control.modelDb.findAll(contact.class.EmployeeAccount, { _id: receiverId }))[0] if (receiver === undefined) return - const senderName = formatName(sender.name) + const senderName = sender !== undefined ? formatName(sender.name) : '' const content = await getContent(doc, senderName, type, control, data) diff --git a/server-plugins/setting-resources/src/index.ts b/server-plugins/setting-resources/src/index.ts index 8678d25d23..0a50624abe 100644 --- a/server-plugins/setting-resources/src/index.ts +++ b/server-plugins/setting-resources/src/index.ts @@ -13,72 +13,33 @@ // limitations under the License. // -import core, { - Account, - Data, - Doc, - generateId, - Ref, - Tx, - TxCollectionCUD, - TxCreateDoc, - TxUpdateDoc -} from '@hcengineering/core' +import { Doc } from '@hcengineering/core' +import { translate } from '@hcengineering/platform' import type { TriggerControl } from '@hcengineering/server-core' import setting, { Integration } from '@hcengineering/setting' -import contact, { EmployeeAccount } from '@hcengineering/contact' -import notification, { Notification, NotificationStatus } from '@hcengineering/notification' /** * @public */ -export async function OnIntegrationDisable (tx: Tx, control: TriggerControl): Promise { - if (!control.hierarchy.isDerived(tx._class, core.class.TxUpdateDoc)) return [] - const ctx = tx as TxUpdateDoc - if (!control.hierarchy.isDerived(ctx.objectClass, setting.class.Integration)) return [] - if (ctx.operations.disabled === true) { - const account = ( - await control.modelDb.findAll(core.class.Account, { _id: ctx.objectSpace as string as Ref }) - )[0] - if (account === undefined) return [] - const employeeRef = (account as EmployeeAccount).employee - if (employeeRef === undefined) return [] +export async function integrationHTMLPresenter (doc: Doc, control: TriggerControl): Promise { + const integration = doc as Integration + const type = (await control.modelDb.findAll(setting.class.IntegrationType, { _id: integration.type }))[0] + if (type === undefined) return '' + return await translate(type.label, {}) +} - const createTx: TxCreateDoc = { - objectClass: notification.class.Notification, - objectSpace: notification.space.Notifications, - objectId: generateId(), - modifiedOn: ctx.modifiedOn, - modifiedBy: ctx.modifiedBy, - space: ctx.space, - _id: generateId(), - _class: core.class.TxCreateDoc, - attributes: { - tx: ctx._id, - status: NotificationStatus.New - } as unknown as Data - } - - const createNotificationTx: TxCollectionCUD = { - objectId: employeeRef, - objectClass: contact.class.Employee, - objectSpace: contact.space.Employee, - modifiedOn: ctx.modifiedOn, - space: core.space.Tx, - _class: core.class.TxCollectionCUD, - modifiedBy: ctx.modifiedBy, - _id: generateId(), - collection: 'notifications', - tx: createTx - } - return [createNotificationTx] - } - return [] +/** + * @public + */ +export async function integrationTextPresenter (doc: Doc, control: TriggerControl): Promise { + const integration = doc as Integration + const type = (await control.modelDb.findAll(setting.class.IntegrationType, { _id: integration.type }))[0] + if (type === undefined) return '' + return await translate(type.label, {}) } // eslint-disable-next-line @typescript-eslint/explicit-function-return-type export default async () => ({ - trigger: { - OnIntegrationDisable - } + IntegrationHTMLPresenter: integrationHTMLPresenter, + IntegrationTextPresenter: integrationTextPresenter }) diff --git a/server-plugins/setting/package.json b/server-plugins/setting/package.json index 142a6fc561..95d4eba2ea 100644 --- a/server-plugins/setting/package.json +++ b/server-plugins/setting/package.json @@ -29,6 +29,7 @@ "dependencies": { "@hcengineering/core": "^0.6.23", "@hcengineering/platform": "^0.6.8", + "@hcengineering/server-notification": "^0.6.0", "@hcengineering/server-core": "^0.6.1" } } diff --git a/server-plugins/setting/src/index.ts b/server-plugins/setting/src/index.ts index c0b7cca61c..3a65b482bc 100644 --- a/server-plugins/setting/src/index.ts +++ b/server-plugins/setting/src/index.ts @@ -15,7 +15,7 @@ import type { Plugin, Resource } from '@hcengineering/platform' import { plugin } from '@hcengineering/platform' -import type { TriggerFunc } from '@hcengineering/server-core' +import { Presenter } from '@hcengineering/server-notification' /** * @public @@ -26,7 +26,8 @@ export const serverSettingId = 'server-setting' as Plugin * @public */ export default plugin(serverSettingId, { - trigger: { - OnIntegrationDisable: '' as Resource + function: { + IntegrationHTMLPresenter: '' as Resource, + IntegrationTextPresenter: '' as Resource } })