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
}
})