From 2c714e33fe8aa7d63daed36d2e8a160b4bc49c14 Mon Sep 17 00:00:00 2001 From: Denis Bykhov Date: Mon, 10 Apr 2023 15:15:00 +0600 Subject: [PATCH] TSK-1046 Gmail/telegram messages collaborators TSK-1097 Inbox scroll (#2928) Signed-off-by: Denis Bykhov --- models/contact/src/index.ts | 26 +++++--- models/contact/src/plugin.ts | 4 +- models/gmail/src/index.ts | 2 +- models/server-contact/src/index.ts | 4 ++ models/telegram/package.json | 1 + models/telegram/src/index.ts | 62 ++++++++++++------- models/telegram/src/plugin.ts | 2 + .../src/components/TxView.svelte | 2 +- .../src/components/ChannelPanel.svelte | 45 ++++++++++++++ .../activity/ActivityChannelPresenter.svelte | 43 +++++++++++++ plugins/contact-resources/src/index.ts | 8 ++- plugins/contact/src/index.ts | 3 +- .../src/components/Main.svelte | 2 + .../components/activity/TxWriteMessage.svelte | 2 +- .../src/components/Inbox.svelte | 2 +- .../src/components/TxView.svelte | 13 ++-- .../src/components/Chat.svelte | 2 + .../src/components/activity/TxMessage.svelte | 29 +++++++++ plugins/telegram-resources/src/index.ts | 4 +- plugins/telegram-resources/src/plugin.ts | 4 ++ server-plugins/contact-resources/package.json | 3 +- server-plugins/contact-resources/src/index.ts | 53 +++++++++++++++- server-plugins/contact/src/index.ts | 1 + server-plugins/gmail-resources/package.json | 1 + server-plugins/gmail-resources/src/index.ts | 56 ++++++++++++++--- .../telegram-resources/package.json | 1 + .../telegram-resources/src/index.ts | 57 ++++++++++++++--- 27 files changed, 369 insertions(+), 63 deletions(-) create mode 100644 plugins/contact-resources/src/components/ChannelPanel.svelte create mode 100644 plugins/contact-resources/src/components/activity/ActivityChannelPresenter.svelte create mode 100644 plugins/telegram-resources/src/components/activity/TxMessage.svelte diff --git a/models/contact/src/index.ts b/models/contact/src/index.ts index c0bf70ef74..96733b1fc5 100644 --- a/models/contact/src/index.ts +++ b/models/contact/src/index.ts @@ -13,13 +13,14 @@ // limitations under the License. // +import activity from '@hcengineering/activity' import { AvatarProvider, AvatarType, Channel, ChannelProvider, Contact, - contactId, + ContactsTab, Employee, EmployeeAccount, GetAvatarUrl, @@ -29,10 +30,9 @@ import { Person, Persons, Status, - ContactsTab + contactId } from '@hcengineering/contact' -import activity from '@hcengineering/activity' -import { Class, DateRangeMode, Domain, DOMAIN_MODEL, IndexKind, Ref, Timestamp } from '@hcengineering/core' +import { Class, DOMAIN_MODEL, DateRangeMode, Domain, IndexKind, Ref, Timestamp } from '@hcengineering/core' import { Builder, Collection, @@ -51,13 +51,13 @@ import attachment from '@hcengineering/model-attachment' import chunter from '@hcengineering/model-chunter' import core, { TAccount, TAttachedDoc, TDoc, TSpace } from '@hcengineering/model-core' import presentation from '@hcengineering/model-presentation' -import view, { createAction, ViewAction, Viewlet } from '@hcengineering/model-view' +import view, { ViewAction, Viewlet, createAction } from '@hcengineering/model-view' import workbench from '@hcengineering/model-workbench' +import notification from '@hcengineering/notification' import type { Asset, IntlString, Resource } from '@hcengineering/platform' import setting from '@hcengineering/setting' -import { AnyComponent } from '@hcengineering/ui' -import notification from '@hcengineering/notification' import templates from '@hcengineering/templates' +import { AnyComponent } from '@hcengineering/ui' import contact from './plugin' export const DOMAIN_CONTACT = 'contact' as Domain @@ -327,6 +327,18 @@ export function createModel (builder: Builder): void { fields: [] }) + builder.mixin(contact.class.Channel, core.class.Class, view.mixin.ObjectPanel, { + component: contact.component.ChannelPanel + }) + + builder.mixin(contact.class.Channel, core.class.Class, notification.mixin.ClassCollaborators, { + fields: [] + }) + + builder.mixin(contact.class.Channel, core.class.Class, notification.mixin.NotificationObjectPresenter, { + presenter: contact.component.ActivityChannelPresenter + }) + builder.mixin(contact.class.Member, core.class.Class, view.mixin.ObjectPresenter, { presenter: contact.component.MemberPresenter }) diff --git a/models/contact/src/plugin.ts b/models/contact/src/plugin.ts index a7bb1c8789..290afc1135 100644 --- a/models/contact/src/plugin.ts +++ b/models/contact/src/plugin.ts @@ -50,7 +50,9 @@ export default mergeIds(contactId, contact, { AccountArrayEditor: '' as AnyComponent, ChannelFilter: '' as AnyComponent, MergeEmployee: '' as AnyComponent, - ActivityChannelMessage: '' as AnyComponent + ActivityChannelMessage: '' as AnyComponent, + ChannelPanel: '' as AnyComponent, + ActivityChannelPresenter: '' as AnyComponent }, string: { Persons: '' as IntlString, diff --git a/models/gmail/src/index.ts b/models/gmail/src/index.ts index 639bbe6e23..24ec8ce962 100644 --- a/models/gmail/src/index.ts +++ b/models/gmail/src/index.ts @@ -31,9 +31,9 @@ import { import attachment from '@hcengineering/model-attachment' import contact from '@hcengineering/model-contact' import core, { TAttachedDoc, TDoc } from '@hcengineering/model-core' +import view, { createAction } from '@hcengineering/model-view' import setting from '@hcengineering/setting' import gmail from './plugin' -import view, { createAction } from '@hcengineering/model-view' export const DOMAIN_GMAIL = 'gmail' as Domain diff --git a/models/server-contact/src/index.ts b/models/server-contact/src/index.ts index dd12e80aea..75e5d2c794 100644 --- a/models/server-contact/src/index.ts +++ b/models/server-contact/src/index.ts @@ -43,6 +43,10 @@ export function createModel (builder: Builder): void { trigger: serverContact.trigger.OnContactDelete }) + builder.createDoc(serverCore.class.Trigger, core.space.Model, { + trigger: serverContact.trigger.OnChannelUpdate + }) + builder.createDoc(serverCore.class.AsyncTrigger, core.space.Model, { trigger: serverContact.trigger.OnEmployeeUpdate, classes: [contact.class.Employee] diff --git a/models/telegram/package.json b/models/telegram/package.json index 1b350c468e..91c2229f0a 100644 --- a/models/telegram/package.json +++ b/models/telegram/package.json @@ -32,6 +32,7 @@ "@hcengineering/model-core": "^0.6.0", "@hcengineering/model-attachment": "^0.6.0", "@hcengineering/model-contact": "^0.6.1", + "@hcengineering/view": "^0.6.3", "@hcengineering/contact": "^0.6.12", "@hcengineering/telegram": "^0.6.5", "@hcengineering/telegram-resources": "^0.6.0", diff --git a/models/telegram/src/index.ts b/models/telegram/src/index.ts index 5503cf432b..ebfc333904 100644 --- a/models/telegram/src/index.ts +++ b/models/telegram/src/index.ts @@ -14,31 +14,32 @@ // limitations under the License. // -import { - Builder, - Model, - TypeString, - TypeBoolean, - Prop, - ArrOf, - Index, - Collection, - TypeTimestamp -} from '@hcengineering/model' -import core, { TAttachedDoc } from '@hcengineering/model-core' -import contact from '@hcengineering/model-contact' -import telegram from './plugin' -import type { - TelegramMessage, - NewTelegramMessage, - SharedTelegramMessage, - SharedTelegramMessages -} from '@hcengineering/telegram' -import { Class, Domain, IndexKind, Ref, Timestamp, Type } from '@hcengineering/core' -import setting from '@hcengineering/setting' import activity from '@hcengineering/activity' import { Channel } from '@hcengineering/contact' +import { Class, Domain, IndexKind, Ref, Timestamp, Type } from '@hcengineering/core' +import { + ArrOf, + Builder, + Collection, + Index, + Model, + Prop, + TypeBoolean, + TypeString, + TypeTimestamp +} from '@hcengineering/model' import attachment from '@hcengineering/model-attachment' +import contact from '@hcengineering/model-contact' +import core, { TAttachedDoc } from '@hcengineering/model-core' +import setting from '@hcengineering/setting' +import type { + NewTelegramMessage, + SharedTelegramMessage, + SharedTelegramMessages, + TelegramMessage +} from '@hcengineering/telegram' +import telegram from './plugin' +import view from '@hcengineering/view' export const DOMAIN_TELEGRAM = 'telegram' as Domain @@ -87,6 +88,23 @@ export class TSharedTelegramMessages extends TAttachedDoc implements SharedTeleg export function createModel (builder: Builder): void { builder.createModel(TTelegramMessage, TSharedTelegramMessages, TNewTelegramMessage) + builder.mixin(telegram.class.Message, core.class.Class, view.mixin.ObjectPresenter, { + presenter: telegram.component.MessagePresenter + }) + + builder.createDoc( + activity.class.TxViewlet, + core.space.Model, + { + objectClass: telegram.class.Message, + icon: contact.icon.Telegram, + txClass: core.class.TxCreateDoc, + component: telegram.activity.TxMessage, + display: 'inline' + }, + telegram.ids.TxMessage + ) + builder.createDoc( contact.class.ChannelProvider, core.space.Model, diff --git a/models/telegram/src/plugin.ts b/models/telegram/src/plugin.ts index 4c03a07286..f5b26ca413 100644 --- a/models/telegram/src/plugin.ts +++ b/models/telegram/src/plugin.ts @@ -33,9 +33,11 @@ export default mergeIds(telegramId, telegram, { Status: '' as IntlString }, ids: { + TxMessage: '' as Ref, TxSharedCreate: '' as Ref }, activity: { + TxMessage: '' as AnyComponent, TxSharedCreate: '' as AnyComponent } }) diff --git a/plugins/activity-resources/src/components/TxView.svelte b/plugins/activity-resources/src/components/TxView.svelte index ecb20265db..49441d9c3a 100644 --- a/plugins/activity-resources/src/components/TxView.svelte +++ b/plugins/activity-resources/src/components/TxView.svelte @@ -203,7 +203,7 @@ {/if} {:else if viewlet && viewlet.label} - + {/if} diff --git a/plugins/contact-resources/src/components/ChannelPanel.svelte b/plugins/contact-resources/src/components/ChannelPanel.svelte new file mode 100644 index 0000000000..4ba313949d --- /dev/null +++ b/plugins/contact-resources/src/components/ChannelPanel.svelte @@ -0,0 +1,45 @@ + + + +{#await getPresenter(channel) then presenter} + {#if presenter} + + {/if} +{/await} diff --git a/plugins/contact-resources/src/components/activity/ActivityChannelPresenter.svelte b/plugins/contact-resources/src/components/activity/ActivityChannelPresenter.svelte new file mode 100644 index 0000000000..0852e7901c --- /dev/null +++ b/plugins/contact-resources/src/components/activity/ActivityChannelPresenter.svelte @@ -0,0 +1,43 @@ + + + +
+ {#if provider} + + {/if} + {#if target} +
+ + {getName(target)} + +
+ {/if} +
diff --git a/plugins/contact-resources/src/index.ts b/plugins/contact-resources/src/index.ts index ddba4189eb..3929aea3ea 100644 --- a/plugins/contact-resources/src/index.ts +++ b/plugins/contact-resources/src/index.ts @@ -70,6 +70,9 @@ import UsersPopup from './components/UsersPopup.svelte' import ActivityChannelMessage from './components/activity/ActivityChannelMessage.svelte' import ExpandRightDouble from './components/icons/ExpandRightDouble.svelte' import IconMembers from './components/icons/Members.svelte' +import ChannelPresenter from './components/ChannelPresenter.svelte' +import ChannelPanel from './components/ChannelPanel.svelte' +import ActivityChannelPresenter from './components/activity/ActivityChannelPresenter.svelte' import contact from './plugin' import { @@ -276,7 +279,10 @@ export default async (): Promise => ({ MergeEmployee, Avatar, UserBoxList, - ActivityChannelMessage + ActivityChannelMessage, + ChannelPresenter, + ChannelPanel, + ActivityChannelPresenter }, completion: { EmployeeQuery: async ( diff --git a/plugins/contact/src/index.ts b/plugins/contact/src/index.ts index b77d66b247..cc71b55606 100644 --- a/plugins/contact/src/index.ts +++ b/plugins/contact/src/index.ts @@ -182,7 +182,8 @@ export const contactPlugin = plugin(contactId, { ChannelsPresenter: '' as AnyComponent, MembersPresenter: '' as AnyComponent, Avatar: '' as AnyComponent, - UserBoxList: '' as AnyComponent + UserBoxList: '' as AnyComponent, + ChannelPresenter: '' as AnyComponent }, channelProvider: { Email: '' as Ref, diff --git a/plugins/gmail-resources/src/components/Main.svelte b/plugins/gmail-resources/src/components/Main.svelte index ea24234663..9df7ef10e0 100644 --- a/plugins/gmail-resources/src/components/Main.svelte +++ b/plugins/gmail-resources/src/components/Main.svelte @@ -35,6 +35,7 @@ export let _id: Ref export let _class: Ref> + export let embedded = false export let message: Message | undefined = undefined let object: Contact @@ -112,6 +113,7 @@ isHeader={true} isAside={false} isFullSize + {embedded} on:fullsize on:close={() => { dispatch('close') diff --git a/plugins/gmail-resources/src/components/activity/TxWriteMessage.svelte b/plugins/gmail-resources/src/components/activity/TxWriteMessage.svelte index 39301afb4d..afb84b0e0d 100644 --- a/plugins/gmail-resources/src/components/activity/TxWriteMessage.svelte +++ b/plugins/gmail-resources/src/components/activity/TxWriteMessage.svelte @@ -29,4 +29,4 @@ } -{value.subject} +{value.subject} diff --git a/plugins/notification-resources/src/components/Inbox.svelte b/plugins/notification-resources/src/components/Inbox.svelte index 051e0c4999..0a13538bcc 100644 --- a/plugins/notification-resources/src/components/Inbox.svelte +++ b/plugins/notification-resources/src/components/Inbox.svelte @@ -83,7 +83,7 @@
-
+
{#if loading} diff --git a/plugins/notification-resources/src/components/TxView.svelte b/plugins/notification-resources/src/components/TxView.svelte index f932601eeb..608bbfb8a3 100644 --- a/plugins/notification-resources/src/components/TxView.svelte +++ b/plugins/notification-resources/src/components/TxView.svelte @@ -104,8 +104,8 @@ {#if (viewlet !== undefined && !((viewlet?.hideOnRemove ?? false) && ptx?.removed)) || model.length > 0}
-
-
+
+
{#if viewlet && viewlet?.editable} {#if viewlet.label} @@ -115,12 +115,12 @@ {/if} {:else if viewlet && viewlet.label} - + - {#if viewlet.labelComponent} - - {/if} + {/if} + {#if viewlet && viewlet.labelComponent} + {/if} {#if viewlet === undefined && model.length > 0 && ptx?.updateTx} @@ -248,6 +248,7 @@ } .msgactivity-content__title { display: inline-flex; + flex-wrap: nowrap; align-items: baseline; flex-grow: 1; } diff --git a/plugins/telegram-resources/src/components/Chat.svelte b/plugins/telegram-resources/src/components/Chat.svelte index 4ec0ccc0ca..d16847131a 100644 --- a/plugins/telegram-resources/src/components/Chat.svelte +++ b/plugins/telegram-resources/src/components/Chat.svelte @@ -51,6 +51,7 @@ export let _id: Ref export let _class: Ref> + export let embedded = false let object: Contact let channel: Channel | undefined = undefined @@ -245,6 +246,7 @@ { diff --git a/plugins/telegram-resources/src/components/activity/TxMessage.svelte b/plugins/telegram-resources/src/components/activity/TxMessage.svelte new file mode 100644 index 0000000000..047a542f40 --- /dev/null +++ b/plugins/telegram-resources/src/components/activity/TxMessage.svelte @@ -0,0 +1,29 @@ + + + +
+ +
+ + diff --git a/plugins/telegram-resources/src/index.ts b/plugins/telegram-resources/src/index.ts index e9378b424d..ef05279df0 100644 --- a/plugins/telegram-resources/src/index.ts +++ b/plugins/telegram-resources/src/index.ts @@ -20,6 +20,7 @@ import presentation from '@hcengineering/presentation' import Chat from './components/Chat.svelte' import Connect from './components/Connect.svelte' import Reconnect from './components/Reconnect.svelte' +import TxMessage from './components/activity/TxMessage.svelte' import IconTelegram from './components/icons/TelegramColor.svelte' import TxSharedCreate from './components/activity/TxSharedCreate.svelte' import { concatLink } from '@hcengineering/core' @@ -32,7 +33,8 @@ export default async (): Promise => ({ IconTelegram }, activity: { - TxSharedCreate + TxSharedCreate, + TxMessage }, handler: { DisconnectHandler: async () => { diff --git a/plugins/telegram-resources/src/plugin.ts b/plugins/telegram-resources/src/plugin.ts index 2ccbc48222..cf53d7d9a4 100644 --- a/plugins/telegram-resources/src/plugin.ts +++ b/plugins/telegram-resources/src/plugin.ts @@ -17,6 +17,7 @@ import { IntlString, mergeIds } from '@hcengineering/platform' import telegram, { telegramId } from '@hcengineering/telegram' +import { AnyComponent } from '@hcengineering/ui' export default mergeIds(telegramId, telegram, { string: { @@ -35,5 +36,8 @@ export default mergeIds(telegramId, telegram, { Share: '' as IntlString, PublishSelected: '' as IntlString, MessagesSelected: '' as IntlString + }, + component: { + MessagePresenter: '' as AnyComponent } }) diff --git a/server-plugins/contact-resources/package.json b/server-plugins/contact-resources/package.json index 1d5e4c092a..87a566f46e 100644 --- a/server-plugins/contact-resources/package.json +++ b/server-plugins/contact-resources/package.json @@ -33,6 +33,7 @@ "@hcengineering/view": "^0.6.3", "@hcengineering/login": "^0.6.2", "@hcengineering/workbench": "^0.6.3", - "@hcengineering/minio": "^0.6.0" + "@hcengineering/minio": "^0.6.0", + "@hcengineering/notification": "^0.6.9" } } diff --git a/server-plugins/contact-resources/src/index.ts b/server-plugins/contact-resources/src/index.ts index b2662c9d80..9e7c4381dc 100644 --- a/server-plugins/contact-resources/src/index.ts +++ b/server-plugins/contact-resources/src/index.ts @@ -15,6 +15,7 @@ // import contact, { + Channel, Contact, contactId, Employee, @@ -38,6 +39,7 @@ import core, { TxUpdateDoc, updateAttribute } from '@hcengineering/core' +import notification, { Collaborators } from '@hcengineering/notification' import { getMetadata } from '@hcengineering/platform' import serverCore, { AsyncTriggerControl, TriggerControl } from '@hcengineering/server-core' import { workbenchId } from '@hcengineering/workbench' @@ -275,6 +277,54 @@ export async function OnEmployeeUpdate (tx: Tx, control: AsyncTriggerControl): P return result } +/** + * @public + */ +export async function OnChannelUpdate (tx: Tx, control: TriggerControl): Promise { + if (tx._class !== core.class.TxUpdateDoc) { + return [] + } + + const uTx = tx as TxUpdateDoc + + if (!control.hierarchy.isDerived(uTx.objectClass, contact.class.Channel)) { + return [] + } + + const result: Tx[] = [] + + if (uTx.operations.$inc?.items !== undefined) { + const doc = (await control.findAll(uTx.objectClass, { _id: uTx.objectId }, { limit: 1 }))[0] + if (doc !== undefined) { + if (control.hierarchy.hasMixin(doc, notification.mixin.Collaborators)) { + const collab = control.hierarchy.as(doc, notification.mixin.Collaborators) as Doc as Collaborators + if (collab.collaborators.includes(tx.modifiedBy)) { + result.push( + control.txFactory.createTxMixin(doc._id, doc._class, doc.space, notification.mixin.Collaborators, { + $push: { + collaborators: tx.modifiedBy + } + }) + ) + } + } else { + control.txFactory.createTxMixin( + doc._id, + doc._class, + doc.space, + notification.mixin.Collaborators, + { + collaborators: [tx.modifiedBy] + } + ) + result.push() + } + } + } + + return result +} + /** * @public */ @@ -317,7 +367,8 @@ export function organizationTextPresenter (doc: Doc): string { export default async () => ({ trigger: { OnContactDelete, - OnEmployeeUpdate + OnEmployeeUpdate, + OnChannelUpdate }, function: { PersonHTMLPresenter: personHTMLPresenter, diff --git a/server-plugins/contact/src/index.ts b/server-plugins/contact/src/index.ts index 4b73324d37..bab205c25f 100644 --- a/server-plugins/contact/src/index.ts +++ b/server-plugins/contact/src/index.ts @@ -30,6 +30,7 @@ export const serverContactId = 'server-contact' as Plugin export default plugin(serverContactId, { trigger: { OnContactDelete: '' as Resource, + OnChannelUpdate: '' as Resource, OnEmployeeUpdate: '' as Resource }, function: { diff --git a/server-plugins/gmail-resources/package.json b/server-plugins/gmail-resources/package.json index 0e1dd90b1a..9fa5a1ed3d 100644 --- a/server-plugins/gmail-resources/package.json +++ b/server-plugins/gmail-resources/package.json @@ -29,6 +29,7 @@ "@hcengineering/core": "^0.6.22", "@hcengineering/platform": "^0.6.8", "@hcengineering/server-core": "^0.6.1", + "@hcengineering/notification": "^0.6.9", "@hcengineering/contact": "^0.6.12", "@hcengineering/gmail": "^0.6.5" } diff --git a/server-plugins/gmail-resources/src/index.ts b/server-plugins/gmail-resources/src/index.ts index 92eb22b576..879d9e898e 100644 --- a/server-plugins/gmail-resources/src/index.ts +++ b/server-plugins/gmail-resources/src/index.ts @@ -23,11 +23,13 @@ import core, { Hierarchy, Ref, Tx, + TxCUD, TxCreateDoc, TxProcessor } from '@hcengineering/core' import gmail, { Message } from '@hcengineering/gmail' import { TriggerControl } from '@hcengineering/server-core' +import notification from '@hcengineering/notification' /** * @public @@ -54,6 +56,7 @@ export async function FindMessages ( * @public */ export async function OnMessageCreate (tx: Tx, control: TriggerControl): Promise { + const res: Tx[] = [] const actualTx = TxProcessor.extractTx(tx) if (actualTx._class !== core.class.TxCreateDoc) { return [] @@ -67,16 +70,51 @@ export async function OnMessageCreate (tx: Tx, control: TriggerControl): Promise const message = TxProcessor.createDoc2Doc(createTx) const channel = (await control.findAll(contact.class.Channel, { _id: message.attachedTo }, { limit: 1 }))[0] - if (channel === undefined) { - return [] + if (channel !== undefined) { + if (channel.lastMessage === undefined || channel.lastMessage < message.sendOn) { + const tx = control.txFactory.createTxUpdateDoc(channel._class, channel.space, channel._id, { + lastMessage: message.sendOn + }) + res.push(tx) + } + if (message.incoming) { + const docs = await control.findAll(notification.class.DocUpdates, { + attachedTo: channel._id, + user: message.modifiedBy + }) + for (const doc of docs) { + res.push( + control.txFactory.createTxUpdateDoc(doc._class, doc.space, doc._id, { + $push: { + txes: [tx._id as Ref>, tx.modifiedOn] + } + }) + ) + res.push( + control.txFactory.createTxUpdateDoc(doc._class, doc.space, doc._id, { + lastTx: tx._id as Ref>, + lastTxTime: tx.modifiedOn, + hidden: false + }) + ) + } + if (docs.length === 0) { + res.push( + control.txFactory.createTxCreateDoc(notification.class.DocUpdates, notification.space.Notifications, { + user: tx.modifiedBy, + attachedTo: channel._id, + attachedToClass: channel._class, + hidden: false, + lastTx: tx._id as Ref>, + lastTxTime: tx.modifiedOn, + txes: [[tx._id as Ref>, tx.modifiedOn]] + }) + ) + } + } } - if (channel.lastMessage === undefined || channel.lastMessage < message.sendOn) { - const tx = control.txFactory.createTxUpdateDoc(channel._class, channel.space, channel._id, { - lastMessage: message.sendOn - }) - return [tx] - } - return [] + + return res } // eslint-disable-next-line @typescript-eslint/explicit-function-return-type diff --git a/server-plugins/telegram-resources/package.json b/server-plugins/telegram-resources/package.json index afbfa4d82f..d241b60e0a 100644 --- a/server-plugins/telegram-resources/package.json +++ b/server-plugins/telegram-resources/package.json @@ -30,6 +30,7 @@ "@hcengineering/platform": "^0.6.8", "@hcengineering/server-core": "^0.6.1", "@hcengineering/contact": "^0.6.12", + "@hcengineering/notification": "^0.6.9", "@hcengineering/telegram": "^0.6.5" } } diff --git a/server-plugins/telegram-resources/src/index.ts b/server-plugins/telegram-resources/src/index.ts index 9457d99122..e5e2a46c00 100644 --- a/server-plugins/telegram-resources/src/index.ts +++ b/server-plugins/telegram-resources/src/index.ts @@ -23,11 +23,13 @@ import core, { Hierarchy, Ref, Tx, + TxCUD, TxCreateDoc, TxProcessor } from '@hcengineering/core' import { TriggerControl } from '@hcengineering/server-core' import telegram, { TelegramMessage } from '@hcengineering/telegram' +import notification from '@hcengineering/notification' /** * @public @@ -54,6 +56,7 @@ export async function FindMessages ( * @public */ export async function OnMessageCreate (tx: Tx, control: TriggerControl): Promise { + const res: Tx[] = [] const actualTx = TxProcessor.extractTx(tx) if (actualTx._class !== core.class.TxCreateDoc) { return [] @@ -67,16 +70,52 @@ export async function OnMessageCreate (tx: Tx, control: TriggerControl): Promise const message = TxProcessor.createDoc2Doc(createTx) const channel = (await control.findAll(contact.class.Channel, { _id: message.attachedTo }, { limit: 1 }))[0] - if (channel === undefined) { - return [] + if (channel !== undefined) { + if (channel.lastMessage === undefined || channel.lastMessage < message.sendOn) { + const tx = control.txFactory.createTxUpdateDoc(channel._class, channel.space, channel._id, { + lastMessage: message.sendOn + }) + res.push(tx) + } + + if (message.incoming) { + const docs = await control.findAll(notification.class.DocUpdates, { + attachedTo: channel._id, + user: message.modifiedBy + }) + for (const doc of docs) { + res.push( + control.txFactory.createTxUpdateDoc(doc._class, doc.space, doc._id, { + $push: { + txes: [tx._id as Ref>, tx.modifiedOn] + } + }) + ) + res.push( + control.txFactory.createTxUpdateDoc(doc._class, doc.space, doc._id, { + lastTx: tx._id as Ref>, + lastTxTime: tx.modifiedOn, + hidden: false + }) + ) + } + if (docs.length === 0) { + res.push( + control.txFactory.createTxCreateDoc(notification.class.DocUpdates, notification.space.Notifications, { + user: tx.modifiedBy, + attachedTo: channel._id, + attachedToClass: channel._class, + hidden: false, + lastTx: tx._id as Ref>, + lastTxTime: tx.modifiedOn, + txes: [[tx._id as Ref>, tx.modifiedOn]] + }) + ) + } + } } - if (channel.lastMessage === undefined || channel.lastMessage < message.sendOn) { - const tx = control.txFactory.createTxUpdateDoc(channel._class, channel.space, channel._id, { - lastMessage: message.sendOn - }) - return [tx] - } - return [] + + return res } // eslint-disable-next-line @typescript-eslint/explicit-function-return-type