@hexabot-ai/api 3.1.3-alpha.0 → 3.2.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/analytics/controllers/stats.controller.d.ts +3 -1
- package/dist/analytics/controllers/stats.controller.js +21 -0
- package/dist/analytics/controllers/stats.controller.js.map +1 -1
- package/dist/analytics/dto/stats.dto.d.ts +16 -11
- package/dist/analytics/dto/stats.dto.js +1 -31
- package/dist/analytics/dto/stats.dto.js.map +1 -1
- package/dist/analytics/entities/stats.entity.d.ts +20 -3
- package/dist/analytics/entities/stats.entity.js +3 -3
- package/dist/analytics/entities/stats.entity.js.map +1 -1
- package/dist/analytics/enums/stats-type.enum.d.ts +1 -9
- package/dist/analytics/enums/stats-type.enum.js +2 -10
- package/dist/analytics/enums/stats-type.enum.js.map +1 -1
- package/dist/analytics/repositories/stats.repository.d.ts +1 -1
- package/dist/analytics/repositories/stats.repository.js.map +1 -1
- package/dist/analytics/services/stats.service.d.ts +7 -2
- package/dist/analytics/services/stats.service.js +95 -8
- package/dist/analytics/services/stats.service.js.map +1 -1
- package/dist/app.controller.d.ts +13 -0
- package/dist/app.controller.js +9 -0
- package/dist/app.controller.js.map +1 -1
- package/dist/app.module.js +4 -0
- package/dist/app.module.js.map +1 -1
- package/dist/app.service.d.ts +5 -1
- package/dist/app.service.js +8 -2
- package/dist/app.service.js.map +1 -1
- package/dist/attachment/attachment.module.js +4 -1
- package/dist/attachment/attachment.module.js.map +1 -1
- package/dist/attachment/controllers/attachment.controller.d.ts +65 -2
- package/dist/attachment/controllers/attachment.controller.js.map +1 -1
- package/dist/attachment/dto/attachment.dto.d.ts +4 -23
- package/dist/attachment/dto/attachment.dto.js +1 -72
- package/dist/attachment/dto/attachment.dto.js.map +1 -1
- package/dist/attachment/entities/attachment.entity.d.ts +113 -6
- package/dist/attachment/entities/attachment.entity.js +16 -21
- package/dist/attachment/entities/attachment.entity.js.map +1 -1
- package/dist/attachment/guards/attachment-ability.guard.js.map +1 -1
- package/dist/attachment/mocks/attachment.mock.d.ts +1 -1
- package/dist/attachment/mocks/attachment.mock.js +7 -2
- package/dist/attachment/mocks/attachment.mock.js.map +1 -1
- package/dist/attachment/services/attachment.service.d.ts +2 -1
- package/dist/attachment/services/attachment.service.js.map +1 -1
- package/dist/attachment/types/index.d.ts +1 -15
- package/dist/attachment/types/index.js +5 -19
- package/dist/attachment/types/index.js.map +1 -1
- package/dist/audit/audit-core.module.d.ts +2 -0
- package/dist/audit/audit-core.module.js +39 -0
- package/dist/audit/audit-core.module.js.map +1 -0
- package/dist/audit/audit.module.d.ts +2 -0
- package/dist/audit/audit.module.js +62 -0
- package/dist/audit/audit.module.js.map +1 -0
- package/dist/audit/controllers/audit-log.controller.d.ts +16 -0
- package/dist/audit/controllers/audit-log.controller.js +85 -0
- package/dist/audit/controllers/audit-log.controller.js.map +1 -0
- package/dist/audit/decorators/audit-label.decorator.d.ts +4 -0
- package/dist/audit/decorators/audit-label.decorator.js +23 -0
- package/dist/audit/decorators/audit-label.decorator.js.map +1 -0
- package/dist/audit/decorators/audit-log.decorators.d.ts +2 -0
- package/dist/audit/decorators/audit-log.decorators.js +31 -0
- package/dist/audit/decorators/audit-log.decorators.js.map +1 -0
- package/dist/audit/dto/audit-log.dto.d.ts +33 -0
- package/dist/audit/dto/audit-log.dto.js +132 -0
- package/dist/audit/dto/audit-log.dto.js.map +1 -0
- package/dist/audit/entities/audit-log.entity.d.ts +76 -0
- package/dist/audit/entities/audit-log.entity.js +104 -0
- package/dist/audit/entities/audit-log.entity.js.map +1 -0
- package/dist/audit/exporters/audit-backend.factory.d.ts +10 -0
- package/dist/audit/exporters/audit-backend.factory.js +60 -0
- package/dist/audit/exporters/audit-backend.factory.js.map +1 -0
- package/dist/audit/exporters/audit-database.exporter.d.ts +13 -0
- package/dist/audit/exporters/audit-database.exporter.js +89 -0
- package/dist/audit/exporters/audit-database.exporter.js.map +1 -0
- package/dist/audit/exporters/audit-noop.exporter.d.ts +8 -0
- package/dist/audit/exporters/audit-noop.exporter.js +22 -0
- package/dist/audit/exporters/audit-noop.exporter.js.map +1 -0
- package/dist/audit/exporters/audit-safe.exporter.d.ts +14 -0
- package/dist/audit/exporters/audit-safe.exporter.js +38 -0
- package/dist/audit/exporters/audit-safe.exporter.js.map +1 -0
- package/dist/audit/index.d.ts +9 -0
- package/dist/audit/index.js +26 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/interceptors/audit-context.interceptor.d.ts +8 -0
- package/dist/audit/interceptors/audit-context.interceptor.js +32 -0
- package/dist/audit/interceptors/audit-context.interceptor.js.map +1 -0
- package/dist/audit/repositories/audit-log.repository.d.ts +6 -0
- package/dist/audit/repositories/audit-log.repository.js +32 -0
- package/dist/audit/repositories/audit-log.repository.js.map +1 -0
- package/dist/audit/services/audit-context.service.d.ts +13 -0
- package/dist/audit/services/audit-context.service.js +84 -0
- package/dist/audit/services/audit-context.service.js.map +1 -0
- package/dist/audit/services/audit-log-record.service.d.ts +16 -0
- package/dist/audit/services/audit-log-record.service.js +69 -0
- package/dist/audit/services/audit-log-record.service.js.map +1 -0
- package/dist/audit/subscribers/audit-log.subscriber.d.ts +25 -0
- package/dist/audit/subscribers/audit-log.subscriber.js +209 -0
- package/dist/audit/subscribers/audit-log.subscriber.js.map +1 -0
- package/dist/audit/types/audit-context.type.d.ts +13 -0
- package/dist/audit/types/audit-context.type.js +3 -0
- package/dist/audit/types/audit-context.type.js.map +1 -0
- package/dist/audit/utils/request-context.d.ts +5 -0
- package/dist/audit/utils/request-context.js +33 -0
- package/dist/audit/utils/request-context.js.map +1 -0
- package/dist/channel/channel.controller.d.ts +5 -4
- package/dist/channel/channel.controller.js +11 -3
- package/dist/channel/channel.controller.js.map +1 -1
- package/dist/channel/channel.module.js +22 -3
- package/dist/channel/channel.module.js.map +1 -1
- package/dist/channel/channel.service.d.ts +15 -8
- package/dist/channel/channel.service.js +74 -59
- package/dist/channel/channel.service.js.map +1 -1
- package/dist/channel/dto/source.dto.d.ts +20 -0
- package/dist/channel/dto/source.dto.js +66 -0
- package/dist/channel/dto/source.dto.js.map +1 -0
- package/dist/channel/entities/source.entity.d.ts +85 -0
- package/dist/channel/entities/source.entity.js +63 -0
- package/dist/channel/entities/source.entity.js.map +1 -0
- package/dist/channel/index.d.ts +12 -0
- package/dist/channel/index.js +12 -0
- package/dist/channel/index.js.map +1 -1
- package/dist/channel/lib/Handler.d.ts +21 -15
- package/dist/channel/lib/Handler.js +43 -24
- package/dist/channel/lib/Handler.js.map +1 -1
- package/dist/channel/lib/__test__/common.mock.d.ts +7 -7
- package/dist/channel/lib/__test__/common.mock.js +12 -14
- package/dist/channel/lib/__test__/common.mock.js.map +1 -1
- package/dist/channel/lib/__test__/label.mock.d.ts +1 -1
- package/dist/channel/lib/__test__/subscriber.mock.d.ts +1 -1
- package/dist/channel/lib/__test__/subscriber.mock.js +1 -0
- package/dist/channel/lib/__test__/subscriber.mock.js.map +1 -1
- package/dist/channel/lib/channel-capabilities.d.ts +12 -0
- package/dist/channel/lib/channel-capabilities.js +15 -0
- package/dist/channel/lib/channel-capabilities.js.map +1 -0
- package/dist/channel/lib/channel-codec.d.ts +7 -0
- package/dist/channel/lib/channel-codec.js +3 -0
- package/dist/channel/lib/channel-codec.js.map +1 -0
- package/dist/channel/lib/channel-event-bus.d.ts +22 -0
- package/dist/channel/lib/channel-event-bus.js +47 -0
- package/dist/channel/lib/channel-event-bus.js.map +1 -0
- package/dist/channel/lib/extension-inject.decorator.d.ts +9 -0
- package/dist/channel/lib/extension-inject.decorator.js +25 -0
- package/dist/channel/lib/extension-inject.decorator.js.map +1 -0
- package/dist/channel/lib/inbound-events/channel-inbound-event-context.d.ts +7 -1
- package/dist/channel/lib/inbound-events/channel-inbound-event-context.js +15 -1
- package/dist/channel/lib/inbound-events/channel-inbound-event-context.js.map +1 -1
- package/dist/channel/lib/inbound-events/channel-inbound-event.d.ts +6 -2
- package/dist/channel/lib/inbound-events/channel-inbound-event.js +19 -0
- package/dist/channel/lib/inbound-events/channel-inbound-event.js.map +1 -1
- package/dist/channel/lib/inbound-events/message-inbound-event.d.ts +1 -2
- package/dist/channel/lib/inbound-events/message-inbound-event.js +8 -6
- package/dist/channel/lib/inbound-events/message-inbound-event.js.map +1 -1
- package/dist/channel/lib/inbound-events/synthetic-message-inbound-event.d.ts +1 -2
- package/dist/channel/lib/inbound-events/synthetic-message-inbound-event.js +23 -24
- package/dist/channel/lib/inbound-events/synthetic-message-inbound-event.js.map +1 -1
- package/dist/channel/lib/outbound/channel-outbound-encoder.d.ts +21 -10
- package/dist/channel/lib/outbound/channel-outbound-encoder.js +19 -55
- package/dist/channel/lib/outbound/channel-outbound-encoder.js.map +1 -1
- package/dist/channel/lib/transports/http-channel-handler.d.ts +17 -0
- package/dist/channel/lib/transports/http-channel-handler.js +85 -0
- package/dist/channel/lib/transports/http-channel-handler.js.map +1 -0
- package/dist/channel/lib/transports/index.d.ts +2 -0
- package/dist/channel/lib/transports/index.js +19 -0
- package/dist/channel/lib/transports/index.js.map +1 -0
- package/dist/channel/lib/transports/websocket-channel-handler.d.ts +17 -0
- package/dist/channel/lib/transports/websocket-channel-handler.js +65 -0
- package/dist/channel/lib/transports/websocket-channel-handler.js.map +1 -0
- package/dist/channel/repositories/source.repository.d.ts +6 -0
- package/dist/channel/repositories/source.repository.js +32 -0
- package/dist/channel/repositories/source.repository.js.map +1 -0
- package/dist/channel/services/channel-attachment.service.d.ts +3 -3
- package/dist/channel/services/channel-attachment.service.js +19 -13
- package/dist/channel/services/channel-attachment.service.js.map +1 -1
- package/dist/channel/services/channel-download.service.d.ts +4 -2
- package/dist/channel/services/channel-download.service.js +7 -3
- package/dist/channel/services/channel-download.service.js.map +1 -1
- package/dist/channel/services/channel-registry.service.d.ts +9 -0
- package/dist/channel/services/channel-registry.service.js +36 -0
- package/dist/channel/services/channel-registry.service.js.map +1 -0
- package/dist/channel/services/source.service.d.ts +28 -0
- package/dist/channel/services/source.service.js +145 -0
- package/dist/channel/services/source.service.js.map +1 -0
- package/dist/channel/services/subscriber-resolver.service.d.ts +15 -0
- package/dist/channel/services/subscriber-resolver.service.js +48 -0
- package/dist/channel/services/subscriber-resolver.service.js.map +1 -0
- package/dist/channel/source.controller.d.ts +27 -0
- package/dist/channel/source.controller.js +102 -0
- package/dist/channel/source.controller.js.map +1 -0
- package/dist/channel/types.d.ts +10 -4
- package/dist/channel/webhook.controller.d.ts +8 -10
- package/dist/channel/webhook.controller.js +30 -38
- package/dist/channel/webhook.controller.js.map +1 -1
- package/dist/chat/controllers/label-group.controller.d.ts +2 -1
- package/dist/chat/controllers/label-group.controller.js.map +1 -1
- package/dist/chat/controllers/label.controller.d.ts +2 -1
- package/dist/chat/controllers/label.controller.js.map +1 -1
- package/dist/chat/controllers/message.controller.d.ts +3 -2
- package/dist/chat/controllers/message.controller.js +13 -11
- package/dist/chat/controllers/message.controller.js.map +1 -1
- package/dist/chat/controllers/subscriber.controller.d.ts +26 -2
- package/dist/chat/controllers/subscriber.controller.js +1 -0
- package/dist/chat/controllers/subscriber.controller.js.map +1 -1
- package/dist/chat/controllers/thread.controller.d.ts +14 -2
- package/dist/chat/controllers/thread.controller.js +4 -0
- package/dist/chat/controllers/thread.controller.js.map +1 -1
- package/dist/chat/dto/label-group.dto.d.ts +4 -13
- package/dist/chat/dto/label-group.dto.js +1 -35
- package/dist/chat/dto/label-group.dto.js.map +1 -1
- package/dist/chat/dto/label.dto.d.ts +4 -20
- package/dist/chat/dto/label.dto.js +1 -63
- package/dist/chat/dto/label.dto.js.map +1 -1
- package/dist/chat/dto/message.dto.d.ts +7 -26
- package/dist/chat/dto/message.dto.js +13 -83
- package/dist/chat/dto/message.dto.js.map +1 -1
- package/dist/chat/dto/subscriber.dto.d.ts +6 -27
- package/dist/chat/dto/subscriber.dto.js +11 -83
- package/dist/chat/dto/subscriber.dto.js.map +1 -1
- package/dist/chat/dto/thread.dto.d.ts +5 -17
- package/dist/chat/dto/thread.dto.js +11 -54
- package/dist/chat/dto/thread.dto.js.map +1 -1
- package/dist/chat/entities/label-group.entity.d.ts +37 -3
- package/dist/chat/entities/label-group.entity.js +5 -3
- package/dist/chat/entities/label-group.entity.js.map +1 -1
- package/dist/chat/entities/label.entity.d.ts +88 -3
- package/dist/chat/entities/label.entity.js +5 -3
- package/dist/chat/entities/label.entity.js.map +1 -1
- package/dist/chat/entities/message.entity.d.ts +824 -4
- package/dist/chat/entities/message.entity.js +3 -3
- package/dist/chat/entities/message.entity.js.map +1 -1
- package/dist/chat/entities/subscriber.entity.d.ts +9 -7
- package/dist/chat/entities/subscriber.entity.js +19 -4
- package/dist/chat/entities/subscriber.entity.js.map +1 -1
- package/dist/chat/entities/thread.entity.d.ts +109 -3
- package/dist/chat/entities/thread.entity.js +19 -3
- package/dist/chat/entities/thread.entity.js.map +1 -1
- package/dist/chat/helpers/envelope-builder.d.ts +7 -7
- package/dist/chat/helpers/envelope-builder.js +26 -26
- package/dist/chat/helpers/envelope-builder.js.map +1 -1
- package/dist/chat/helpers/envelope-factory.d.ts +132 -42
- package/dist/chat/helpers/envelope-factory.js +11 -12
- package/dist/chat/helpers/envelope-factory.js.map +1 -1
- package/dist/chat/index.d.ts +0 -5
- package/dist/chat/index.js +0 -5
- package/dist/chat/index.js.map +1 -1
- package/dist/chat/repositories/message.repository.d.ts +1 -2
- package/dist/chat/repositories/message.repository.js.map +1 -1
- package/dist/chat/repositories/subscriber.repository.d.ts +8 -6
- package/dist/chat/repositories/subscriber.repository.js +18 -16
- package/dist/chat/repositories/subscriber.repository.js.map +1 -1
- package/dist/chat/repositories/thread.repository.d.ts +1 -1
- package/dist/chat/repositories/thread.repository.js +1 -1
- package/dist/chat/repositories/thread.repository.js.map +1 -1
- package/dist/chat/services/chat.service.js +17 -7
- package/dist/chat/services/chat.service.js.map +1 -1
- package/dist/chat/services/message.service.d.ts +1 -2
- package/dist/chat/services/message.service.js.map +1 -1
- package/dist/chat/services/subscriber.service.d.ts +214 -8
- package/dist/chat/services/subscriber.service.js +11 -12
- package/dist/chat/services/subscriber.service.js.map +1 -1
- package/dist/chat/services/thread.service.d.ts +77 -9
- package/dist/chat/services/thread.service.js +54 -8
- package/dist/chat/services/thread.service.js.map +1 -1
- package/dist/cms/controllers/content-type.controller.d.ts +15 -2
- package/dist/cms/controllers/content-type.controller.js.map +1 -1
- package/dist/cms/controllers/content.controller.d.ts +62 -4
- package/dist/cms/controllers/content.controller.js.map +1 -1
- package/dist/cms/controllers/menu.controller.d.ts +22 -3
- package/dist/cms/controllers/menu.controller.js.map +1 -1
- package/dist/cms/dto/content.dto.d.ts +4 -16
- package/dist/cms/dto/content.dto.js +1 -47
- package/dist/cms/dto/content.dto.js.map +1 -1
- package/dist/cms/dto/contentType.dto.d.ts +4 -11
- package/dist/cms/dto/contentType.dto.js +1 -29
- package/dist/cms/dto/contentType.dto.js.map +1 -1
- package/dist/cms/dto/menu.dto.d.ts +4 -16
- package/dist/cms/dto/menu.dto.js +1 -51
- package/dist/cms/dto/menu.dto.js.map +1 -1
- package/dist/cms/entities/content-type.entity.d.ts +15 -3
- package/dist/cms/entities/content-type.entity.js +5 -3
- package/dist/cms/entities/content-type.entity.js.map +1 -1
- package/dist/cms/entities/content.entity.d.ts +37 -4
- package/dist/cms/entities/content.entity.js +5 -3
- package/dist/cms/entities/content.entity.js.map +1 -1
- package/dist/cms/entities/menu.entity.d.ts +67 -3
- package/dist/cms/entities/menu.entity.js +5 -3
- package/dist/cms/entities/menu.entity.js.map +1 -1
- package/dist/cms/enums/menu-type.enum.d.ts +1 -5
- package/dist/cms/enums/menu-type.enum.js +2 -6
- package/dist/cms/enums/menu-type.enum.js.map +1 -1
- package/dist/cms/repositories/content.repository.d.ts +1 -1
- package/dist/cms/repositories/content.repository.js.map +1 -1
- package/dist/cms/services/content-type.service.d.ts +1 -1
- package/dist/cms/services/content-type.service.js.map +1 -1
- package/dist/cms/services/content.service.d.ts +12 -6
- package/dist/cms/services/content.service.js.map +1 -1
- package/dist/cms/services/rag-indexer.service.js.map +1 -1
- package/dist/cms/types/menu-types.d.ts +1 -1
- package/dist/cms/utilities/verifyTree.js.map +1 -1
- package/dist/config/i18n/en/chatbot_settings.json +15 -15
- package/dist/config/i18n/en/contact.json +21 -21
- package/dist/config/i18n/en/messages.json +11 -11
- package/dist/config/i18n/en/rag_settings.json +19 -19
- package/dist/config/i18n/fr/chatbot_settings.json +15 -15
- package/dist/config/i18n/fr/contact.json +21 -21
- package/dist/config/i18n/fr/messages.json +11 -11
- package/dist/config/i18n/fr/rag_settings.json +19 -19
- package/dist/config/index.js +63 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.d.ts +22 -0
- package/dist/database/entities/base.entity.d.ts +3 -0
- package/dist/database/entities/base.entity.js +33 -7
- package/dist/database/entities/base.entity.js.map +1 -1
- package/dist/extension/cleanup.service.d.ts +2 -5
- package/dist/extension/cleanup.service.js +2 -12
- package/dist/extension/cleanup.service.js.map +1 -1
- package/dist/extension/types.d.ts +5 -6
- package/dist/extensions/actions/ai/ai-base.action.d.ts +1 -2
- package/dist/extensions/actions/ai/ai-base.action.js +15 -6
- package/dist/extensions/actions/ai/ai-base.action.js.map +1 -1
- package/dist/extensions/actions/ai/i18n/en.translations.json +164 -164
- package/dist/extensions/actions/ai/i18n/fr.translations.json +164 -164
- package/dist/extensions/actions/ai/model.binding.d.ts +2 -2
- package/dist/extensions/actions/ai/retrieve-content-rag.action.d.ts +9 -1
- package/dist/extensions/actions/memory/i18n/en.translations.json +3 -3
- package/dist/extensions/actions/memory/i18n/fr.translations.json +3 -3
- package/dist/extensions/actions/messaging/attachment.action.d.ts +3 -1
- package/dist/extensions/actions/messaging/attachment.action.js +4 -5
- package/dist/extensions/actions/messaging/attachment.action.js.map +1 -1
- package/dist/extensions/actions/messaging/await-reply.action.d.ts +100 -56
- package/dist/extensions/actions/messaging/buttons.action.d.ts +1 -1
- package/dist/extensions/actions/messaging/buttons.action.js +4 -4
- package/dist/extensions/actions/messaging/buttons.action.js.map +1 -1
- package/dist/extensions/actions/messaging/i18n/en.translations.json +174 -174
- package/dist/extensions/actions/messaging/i18n/fr.translations.json +174 -174
- package/dist/extensions/actions/messaging/list.action.d.ts +4 -4
- package/dist/extensions/actions/messaging/list.action.js +6 -8
- package/dist/extensions/actions/messaging/list.action.js.map +1 -1
- package/dist/extensions/actions/messaging/message-action.base.d.ts +243 -120
- package/dist/extensions/actions/messaging/message-action.base.js +10 -10
- package/dist/extensions/actions/messaging/message-action.base.js.map +1 -1
- package/dist/extensions/actions/messaging/quick-replies.action.js +2 -2
- package/dist/extensions/actions/messaging/quick-replies.action.js.map +1 -1
- package/dist/extensions/actions/subscriber/i18n/en.translations.json +14 -14
- package/dist/extensions/actions/subscriber/i18n/fr.translations.json +14 -14
- package/dist/extensions/actions/web/http-request.action.d.ts +9 -1
- package/dist/extensions/actions/web/i18n/en.translations.json +27 -27
- package/dist/extensions/actions/web/i18n/fr.translations.json +27 -27
- package/dist/extensions/channels/console/i18n/en.translations.json +22 -22
- package/dist/extensions/channels/console/i18n/fr.translations.json +22 -22
- package/dist/extensions/channels/console/index.channel.d.ts +1 -1
- package/dist/extensions/channels/console/index.channel.js +2 -2
- package/dist/extensions/channels/console/index.channel.js.map +1 -1
- package/dist/extensions/channels/console/settings.schema.d.ts +14 -0
- package/dist/extensions/channels/console/{console-channel.settings.js → settings.schema.js} +3 -16
- package/dist/extensions/channels/console/settings.schema.js.map +1 -0
- package/dist/extensions/channels/web/__test__/data.mock.js +16 -17
- package/dist/extensions/channels/web/__test__/data.mock.js.map +1 -1
- package/dist/extensions/channels/web/__test__/events.mock.js +21 -22
- package/dist/extensions/channels/web/__test__/events.mock.js.map +1 -1
- package/dist/extensions/channels/web/base-web-channel.d.ts +25 -42
- package/dist/extensions/channels/web/base-web-channel.js +204 -398
- package/dist/extensions/channels/web/base-web-channel.js.map +1 -1
- package/dist/extensions/channels/web/i18n/en.translations.json +26 -26
- package/dist/extensions/channels/web/i18n/fr.translations.json +26 -26
- package/dist/extensions/channels/web/inbound/events/delivery.event.d.ts +1 -1
- package/dist/extensions/channels/web/inbound/events/delivery.event.js +2 -2
- package/dist/extensions/channels/web/inbound/events/delivery.event.js.map +1 -1
- package/dist/extensions/channels/web/inbound/events/messages/attachment.event.d.ts +2 -4
- package/dist/extensions/channels/web/inbound/events/messages/attachment.event.js +11 -10
- package/dist/extensions/channels/web/inbound/events/messages/attachment.event.js.map +1 -1
- package/dist/extensions/channels/web/inbound/events/messages/location.event.d.ts +1 -2
- package/dist/extensions/channels/web/inbound/events/messages/location.event.js +9 -8
- package/dist/extensions/channels/web/inbound/events/messages/location.event.js.map +1 -1
- package/dist/extensions/channels/web/inbound/events/messages/payload.event.d.ts +2 -3
- package/dist/extensions/channels/web/inbound/events/messages/payload.event.js +5 -2
- package/dist/extensions/channels/web/inbound/events/messages/payload.event.js.map +1 -1
- package/dist/extensions/channels/web/inbound/events/messages/postback.event.js +2 -2
- package/dist/extensions/channels/web/inbound/events/messages/postback.event.js.map +1 -1
- package/dist/extensions/channels/web/inbound/events/messages/quick-reply.event.js +2 -2
- package/dist/extensions/channels/web/inbound/events/messages/quick-reply.event.js.map +1 -1
- package/dist/extensions/channels/web/inbound/events/messages/text.event.d.ts +1 -1
- package/dist/extensions/channels/web/inbound/events/messages/text.event.js +6 -3
- package/dist/extensions/channels/web/inbound/events/messages/text.event.js.map +1 -1
- package/dist/extensions/channels/web/inbound/events/read.event.d.ts +1 -1
- package/dist/extensions/channels/web/inbound/events/read.event.js +2 -2
- package/dist/extensions/channels/web/inbound/events/read.event.js.map +1 -1
- package/dist/extensions/channels/web/inbound/events/typing.event.d.ts +1 -1
- package/dist/extensions/channels/web/inbound/events/typing.event.js +2 -2
- package/dist/extensions/channels/web/inbound/events/typing.event.js.map +1 -1
- package/dist/extensions/channels/web/inbound/events/unsupported.event.d.ts +1 -1
- package/dist/extensions/channels/web/inbound/events/unsupported.event.js +2 -2
- package/dist/extensions/channels/web/inbound/events/unsupported.event.js.map +1 -1
- package/dist/extensions/channels/web/inbound/index.d.ts +1 -0
- package/dist/extensions/channels/web/inbound/index.js +1 -0
- package/dist/extensions/channels/web/inbound/index.js.map +1 -1
- package/dist/extensions/channels/web/inbound/web-inbound-message-encoder.d.ts +11 -0
- package/dist/extensions/channels/web/inbound/web-inbound-message-encoder.js +80 -0
- package/dist/extensions/channels/web/inbound/web-inbound-message-encoder.js.map +1 -0
- package/dist/extensions/channels/web/index.channel.d.ts +1 -1
- package/dist/extensions/channels/web/index.channel.js +2 -2
- package/dist/extensions/channels/web/index.channel.js.map +1 -1
- package/dist/extensions/channels/web/outbound/web-outbound-message-encoder.d.ts +15 -16
- package/dist/extensions/channels/web/outbound/web-outbound-message-encoder.js +26 -25
- package/dist/extensions/channels/web/outbound/web-outbound-message-encoder.js.map +1 -1
- package/dist/extensions/channels/web/services/web-history.service.d.ts +22 -0
- package/dist/extensions/channels/web/services/web-history.service.js +81 -0
- package/dist/extensions/channels/web/services/web-history.service.js.map +1 -0
- package/dist/extensions/channels/web/services/web-session.service.d.ts +22 -0
- package/dist/extensions/channels/web/services/web-session.service.js +146 -0
- package/dist/extensions/channels/web/services/web-session.service.js.map +1 -0
- package/dist/extensions/channels/web/settings.schema.d.ts +16 -0
- package/dist/extensions/channels/web/{web-channel.settings.js → settings.schema.js} +3 -16
- package/dist/extensions/channels/web/settings.schema.js.map +1 -0
- package/dist/extensions/channels/web/types.d.ts +2 -4
- package/dist/extensions/channels/web/types.js +2 -2
- package/dist/extensions/channels/web/types.js.map +1 -1
- package/dist/extensions/helpers/local-storage/i18n/en.translations.json +4 -4
- package/dist/extensions/helpers/local-storage/i18n/fr.translations.json +4 -4
- package/dist/extensions/helpers/local-storage/index.helper.d.ts +2 -1
- package/dist/extensions/helpers/local-storage/index.helper.js.map +1 -1
- package/dist/extensions/index.d.ts +2 -2
- package/dist/extensions/index.js +2 -2
- package/dist/extensions/index.js.map +1 -1
- package/dist/health/health.service.d.ts +18 -0
- package/dist/health/health.service.js +190 -0
- package/dist/health/health.service.js.map +1 -0
- package/dist/helper/lib/base-llm-helper.d.ts +1 -1
- package/dist/helper/lib/base-storage-helper.d.ts +2 -1
- package/dist/i18n/controllers/language.controller.d.ts +11 -2
- package/dist/i18n/controllers/language.controller.js.map +1 -1
- package/dist/i18n/controllers/translation.controller.d.ts +21 -3
- package/dist/i18n/dto/language.dto.d.ts +4 -11
- package/dist/i18n/dto/language.dto.js +1 -31
- package/dist/i18n/dto/language.dto.js.map +1 -1
- package/dist/i18n/dto/translation.dto.d.ts +4 -9
- package/dist/i18n/dto/translation.dto.js +1 -23
- package/dist/i18n/dto/translation.dto.js.map +1 -1
- package/dist/i18n/entities/language.entity.d.ts +19 -3
- package/dist/i18n/entities/language.entity.js +5 -3
- package/dist/i18n/entities/language.entity.js.map +1 -1
- package/dist/i18n/entities/translation.entity.d.ts +15 -3
- package/dist/i18n/entities/translation.entity.js +5 -3
- package/dist/i18n/entities/translation.entity.js.map +1 -1
- package/dist/i18n/services/language.service.d.ts +18 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/seeder.js +1 -1
- package/dist/seeder.js.map +1 -1
- package/dist/setting/controllers/setting.controller.d.ts +11 -2
- package/dist/setting/controllers/setting.controller.js.map +1 -1
- package/dist/setting/dto/metadata.dto.d.ts +4 -9
- package/dist/setting/dto/metadata.dto.js +1 -23
- package/dist/setting/dto/metadata.dto.js.map +1 -1
- package/dist/setting/dto/setting.dto.d.ts +4 -11
- package/dist/setting/dto/setting.dto.js +1 -31
- package/dist/setting/dto/setting.dto.js.map +1 -1
- package/dist/setting/entities/metadata.entity.d.ts +15 -3
- package/dist/setting/entities/metadata.entity.js +5 -3
- package/dist/setting/entities/metadata.entity.js.map +1 -1
- package/dist/setting/entities/setting.entity.d.ts +19 -3
- package/dist/setting/entities/setting.entity.js +5 -3
- package/dist/setting/entities/setting.entity.js.map +1 -1
- package/dist/setting/runtime-settings.d.ts +1 -1
- package/dist/setting/runtime-settings.js.map +1 -1
- package/dist/setting/runtime-settings.seed.d.ts +1 -1
- package/dist/setting/runtime-settings.seed.js +1 -3
- package/dist/setting/runtime-settings.seed.js.map +1 -1
- package/dist/setting/services/metadata.service.d.ts +2 -1
- package/dist/setting/services/metadata.service.js.map +1 -1
- package/dist/setting/services/setting.service.d.ts +2 -1
- package/dist/setting/services/setting.service.js.map +1 -1
- package/dist/setting/setting.module.js.map +1 -1
- package/dist/setting/types/index.d.ts +2 -9
- package/dist/setting/types/index.js +2 -9
- package/dist/setting/types/index.js.map +1 -1
- package/dist/static/assets/{cssMode-EfTI32jH.js → cssMode-B4TecieE.js} +1 -1
- package/dist/static/assets/{freemarker2-Bp36bqQu.js → freemarker2-BVMU7I_j.js} +1 -1
- package/dist/static/assets/{handlebars-DFcsacT2.js → handlebars-BHhJ0REg.js} +1 -1
- package/dist/static/assets/{html-DoteNmPg.js → html-C0xYW7UH.js} +1 -1
- package/dist/static/assets/{htmlMode-D4qDYA_c.js → htmlMode-DKBoSSUf.js} +1 -1
- package/dist/static/assets/{index-B0zbJ-Gv.css → index-3E05C6mQ.css} +1 -1
- package/dist/static/assets/{index-Da34FzWk.js → index-Q16skETC.js} +2165 -2165
- package/dist/static/assets/{javascript-hq-XZ18j.js → javascript-BmG42Qtz.js} +1 -1
- package/dist/static/assets/{jsonMode-gxldbTjQ.js → jsonMode-COpdryGy.js} +1 -1
- package/dist/static/assets/{liquid-VombxSUL.js → liquid-t7wU_We6.js} +1 -1
- package/dist/static/assets/{lspLanguageFeatures-DjxTnuCT.js → lspLanguageFeatures-nYoOHLBU.js} +1 -1
- package/dist/static/assets/{mdx-Bv744ltm.js → mdx-CXAOQEUW.js} +1 -1
- package/dist/static/assets/{python-BB7rtHwG.js → python-CnD9oLZg.js} +1 -1
- package/dist/static/assets/{razor-BoLELWC9.js → razor-D1-qfmFa.js} +1 -1
- package/dist/static/assets/{tsMode-DLSApW05.js → tsMode-Dm0heYbf.js} +1 -1
- package/dist/static/assets/{typescript-qlBdudA6.js → typescript-DSKhH6ZE.js} +1 -1
- package/dist/static/assets/{xml-DMdTu6Mm.js → xml-CzpJrCkR.js} +1 -1
- package/dist/static/assets/{yaml-C9JqXvOt.js → yaml-Bby4uDCt.js} +1 -1
- package/dist/static/index.html +2 -2
- package/dist/static/locales/en/translation.json +141 -2
- package/dist/static/locales/fr/translation.json +141 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/express-session.d.ts +1 -0
- package/dist/user/controllers/auth.controller.js +3 -0
- package/dist/user/controllers/auth.controller.js.map +1 -1
- package/dist/user/controllers/credential.controller.d.ts +2 -1
- package/dist/user/controllers/credential.controller.js.map +1 -1
- package/dist/user/controllers/model.controller.d.ts +26 -1
- package/dist/user/controllers/permission.controller.d.ts +40 -2
- package/dist/user/controllers/role.controller.d.ts +128 -4
- package/dist/user/controllers/role.controller.js.map +1 -1
- package/dist/user/controllers/user.controller.d.ts +374 -8
- package/dist/user/dto/credential.dto.d.ts +4 -13
- package/dist/user/dto/credential.dto.js +1 -35
- package/dist/user/dto/credential.dto.js.map +1 -1
- package/dist/user/dto/model.dto.d.ts +4 -15
- package/dist/user/dto/model.dto.js +1 -43
- package/dist/user/dto/model.dto.js.map +1 -1
- package/dist/user/dto/permission.dto.d.ts +4 -17
- package/dist/user/dto/permission.dto.js +1 -49
- package/dist/user/dto/permission.dto.js.map +1 -1
- package/dist/user/dto/role.dto.d.ts +4 -18
- package/dist/user/dto/role.dto.js +1 -53
- package/dist/user/dto/role.dto.js.map +1 -1
- package/dist/user/dto/user-profile.dto.d.ts +4 -9
- package/dist/user/dto/user-profile.dto.js +1 -29
- package/dist/user/dto/user-profile.dto.js.map +1 -1
- package/dist/user/dto/user.dto.d.ts +5 -38
- package/dist/user/dto/user.dto.js +1 -125
- package/dist/user/dto/user.dto.js.map +1 -1
- package/dist/user/entities/credential.entity.d.ts +87 -3
- package/dist/user/entities/credential.entity.js +5 -3
- package/dist/user/entities/credential.entity.js.map +1 -1
- package/dist/user/entities/model.entity.d.ts +98 -3
- package/dist/user/entities/model.entity.js +5 -3
- package/dist/user/entities/model.entity.js.map +1 -1
- package/dist/user/entities/permission.entity.d.ts +75 -3
- package/dist/user/entities/permission.entity.js +3 -3
- package/dist/user/entities/permission.entity.js.map +1 -1
- package/dist/user/entities/role.entity.d.ts +100 -3
- package/dist/user/entities/role.entity.js +5 -3
- package/dist/user/entities/role.entity.js.map +1 -1
- package/dist/user/entities/user-profile.entity.d.ts +5 -5
- package/dist/user/entities/user-profile.entity.js +3 -3
- package/dist/user/entities/user-profile.entity.js.map +1 -1
- package/dist/user/entities/user.entity.d.ts +234 -4
- package/dist/user/entities/user.entity.js +5 -3
- package/dist/user/entities/user.entity.js.map +1 -1
- package/dist/user/guards/ability.guard.js.map +1 -1
- package/dist/user/guards/local-auth.guard.d.ts +9 -0
- package/dist/user/guards/local-auth.guard.js +84 -4
- package/dist/user/guards/local-auth.guard.js.map +1 -1
- package/dist/user/passport/session.serializer.d.ts +1 -1
- package/dist/user/passport/session.serializer.js.map +1 -1
- package/dist/user/repositories/credential.repository.js.map +1 -1
- package/dist/user/seeds/model.seed-model.js +10 -0
- package/dist/user/seeds/model.seed-model.js.map +1 -1
- package/dist/user/services/auth.service.d.ts +34 -2
- package/dist/user/services/auth.service.js.map +1 -1
- package/dist/user/services/permission.service.d.ts +1 -1
- package/dist/user/services/permission.service.js.map +1 -1
- package/dist/user/types/action.type.d.ts +1 -12
- package/dist/user/types/action.type.js +3 -14
- package/dist/user/types/action.type.js.map +1 -1
- package/dist/user/types/index.type.d.ts +1 -1
- package/dist/user/types/model.type.d.ts +1 -1
- package/dist/user/types/permission.type.d.ts +1 -5
- package/dist/user/types/user-provider.type.d.ts +1 -4
- package/dist/utils/test/dummy/dto/dummy.dto.d.ts +4 -9
- package/dist/utils/test/dummy/dto/dummy.dto.js +1 -22
- package/dist/utils/test/dummy/dto/dummy.dto.js.map +1 -1
- package/dist/utils/test/dummy/dummy.action.d.ts +9 -1
- package/dist/utils/test/dummy/entities/dummy.entity.d.ts +15 -3
- package/dist/utils/test/dummy/entities/dummy.entity.js +3 -3
- package/dist/utils/test/dummy/entities/dummy.entity.js.map +1 -1
- package/dist/utils/test/fixtures/content.d.ts +12 -2
- package/dist/utils/test/fixtures/content.js.map +1 -1
- package/dist/utils/test/fixtures/contenttype.d.ts +9 -2
- package/dist/utils/test/fixtures/contenttype.js.map +1 -1
- package/dist/utils/test/fixtures/label-group.d.ts +14 -2
- package/dist/utils/test/fixtures/label-group.js.map +1 -1
- package/dist/utils/test/fixtures/label.d.ts +14 -2
- package/dist/utils/test/fixtures/label.js.map +1 -1
- package/dist/utils/test/fixtures/message.d.ts +162 -2
- package/dist/utils/test/fixtures/message.js +61 -3
- package/dist/utils/test/fixtures/message.js.map +1 -1
- package/dist/utils/test/fixtures/setting.js +0 -7
- package/dist/utils/test/fixtures/setting.js.map +1 -1
- package/dist/utils/test/fixtures/subscriber.d.ts +27 -3
- package/dist/utils/test/fixtures/subscriber.js +37 -2
- package/dist/utils/test/fixtures/subscriber.js.map +1 -1
- package/dist/utils/test/fixtures/user.d.ts +2 -1
- package/dist/utils/test/fixtures/user.js.map +1 -1
- package/dist/utils/test/mocks/subscriber.d.ts +1 -1
- package/dist/utils/test/mocks/subscriber.js +11 -0
- package/dist/utils/test/mocks/subscriber.js.map +1 -1
- package/dist/utils/types/dto.types.d.ts +8 -12
- package/dist/utils/types/dto.types.js +1 -39
- package/dist/utils/types/dto.types.js.map +1 -1
- package/dist/websocket/services/socket-event-dispatcher.service.d.ts +4 -1
- package/dist/websocket/services/socket-event-dispatcher.service.js +62 -5
- package/dist/websocket/services/socket-event-dispatcher.service.js.map +1 -1
- package/dist/websocket/utils/socket-request.d.ts +2 -1
- package/dist/websocket/utils/socket-request.js +1 -0
- package/dist/websocket/utils/socket-request.js.map +1 -1
- package/dist/websocket/websocket.gateway.d.ts +6 -3
- package/dist/websocket/websocket.gateway.js +63 -4
- package/dist/websocket/websocket.gateway.js.map +1 -1
- package/dist/workflow/contexts/workflow-context-factory.d.ts +1 -1
- package/dist/workflow/contexts/workflow-context-factory.js +5 -1
- package/dist/workflow/contexts/workflow-context-factory.js.map +1 -1
- package/dist/workflow/contexts/workflow-runtime.context.d.ts +1 -1
- package/dist/workflow/contexts/workflow-runtime.context.js +5 -1
- package/dist/workflow/contexts/workflow-runtime.context.js.map +1 -1
- package/dist/workflow/controllers/mcp-server.controller.d.ts +2 -1
- package/dist/workflow/controllers/mcp-server.controller.js.map +1 -1
- package/dist/workflow/controllers/memory-definition.controller.d.ts +12 -2
- package/dist/workflow/controllers/memory-definition.controller.js.map +1 -1
- package/dist/workflow/controllers/workflow-run.controller.d.ts +1 -1
- package/dist/workflow/controllers/workflow-run.controller.js.map +1 -1
- package/dist/workflow/controllers/workflow-version.controller.d.ts +179 -3
- package/dist/workflow/controllers/workflow-version.controller.js.map +1 -1
- package/dist/workflow/controllers/workflow.controller.d.ts +97 -2
- package/dist/workflow/controllers/workflow.controller.js +6 -1
- package/dist/workflow/controllers/workflow.controller.js.map +1 -1
- package/dist/workflow/dto/mcp-server.dto.d.ts +4 -19
- package/dist/workflow/dto/mcp-server.dto.js +1 -60
- package/dist/workflow/dto/mcp-server.dto.js.map +1 -1
- package/dist/workflow/dto/memory-definition.dto.d.ts +4 -14
- package/dist/workflow/dto/memory-definition.dto.js +1 -41
- package/dist/workflow/dto/memory-definition.dto.js.map +1 -1
- package/dist/workflow/dto/memory-record.dto.d.ts +4 -28
- package/dist/workflow/dto/memory-record.dto.js +1 -86
- package/dist/workflow/dto/memory-record.dto.js.map +1 -1
- package/dist/workflow/dto/workflow-run.dto.d.ts +5 -44
- package/dist/workflow/dto/workflow-run.dto.js +4 -149
- package/dist/workflow/dto/workflow-run.dto.js.map +1 -1
- package/dist/workflow/dto/workflow-version.dto.d.ts +4 -22
- package/dist/workflow/dto/workflow-version.dto.js +1 -70
- package/dist/workflow/dto/workflow-version.dto.js.map +1 -1
- package/dist/workflow/dto/workflow.dto.d.ts +153 -26
- package/dist/workflow/dto/workflow.dto.js +10 -121
- package/dist/workflow/dto/workflow.dto.js.map +1 -1
- package/dist/workflow/entities/mcp-server.entity.d.ts +51 -3
- package/dist/workflow/entities/mcp-server.entity.js +10 -8
- package/dist/workflow/entities/mcp-server.entity.js.map +1 -1
- package/dist/workflow/entities/memory-definition.entity.d.ts +21 -3
- package/dist/workflow/entities/memory-definition.entity.js +7 -5
- package/dist/workflow/entities/memory-definition.entity.js.map +1 -1
- package/dist/workflow/entities/memory-record.entity.d.ts +272 -3
- package/dist/workflow/entities/memory-record.entity.js +3 -3
- package/dist/workflow/entities/memory-record.entity.js.map +1 -1
- package/dist/workflow/entities/workflow-run.entity.d.ts +308 -5
- package/dist/workflow/entities/workflow-run.entity.js +9 -12
- package/dist/workflow/entities/workflow-run.entity.js.map +1 -1
- package/dist/workflow/entities/workflow-version.entity.d.ts +165 -3
- package/dist/workflow/entities/workflow-version.entity.js +5 -5
- package/dist/workflow/entities/workflow-version.entity.js.map +1 -1
- package/dist/workflow/entities/workflow.entity.d.ts +192 -4
- package/dist/workflow/entities/workflow.entity.js +12 -9
- package/dist/workflow/entities/workflow.entity.js.map +1 -1
- package/dist/workflow/lib/trigger-event-wrapper.d.ts +1 -2
- package/dist/workflow/schemas/workflow-input-schemas.d.ts +52 -30
- package/dist/workflow/schemas/workflow-input-schemas.js +4 -5
- package/dist/workflow/schemas/workflow-input-schemas.js.map +1 -1
- package/dist/workflow/services/agentic.service.js.map +1 -1
- package/dist/workflow/services/mcp-client-pool.service.js.map +1 -1
- package/dist/workflow/services/memory-definition.service.d.ts +1 -1
- package/dist/workflow/services/memory-definition.service.js.map +1 -1
- package/dist/workflow/services/memory-record.service.d.ts +1 -2
- package/dist/workflow/services/memory-record.service.js.map +1 -1
- package/dist/workflow/services/workflow-run.service.d.ts +1 -1
- package/dist/workflow/services/workflow-run.service.js.map +1 -1
- package/dist/workflow/services/workflow-version.service.d.ts +16 -2
- package/dist/workflow/services/workflow-version.service.js.map +1 -1
- package/dist/workflow/services/workflow.service.d.ts +2 -1
- package/dist/workflow/services/workflow.service.js.map +1 -1
- package/dist/workflow/types.d.ts +2 -28
- package/dist/workflow/types.js +7 -31
- package/dist/workflow/types.js.map +1 -1
- package/dist/workflow/utils/memory-store.d.ts +1 -2
- package/dist/workflow/utils/memory-store.js.map +1 -1
- package/package.json +8 -5
- package/src/analytics/controllers/stats.controller.ts +38 -1
- package/src/analytics/dto/stats.dto.ts +27 -26
- package/src/analytics/entities/stats.entity.ts +4 -3
- package/src/analytics/enums/stats-type.enum.ts +1 -9
- package/src/analytics/repositories/stats.repository.ts +1 -1
- package/src/analytics/services/stats.service.ts +125 -9
- package/src/app.controller.ts +5 -0
- package/src/app.module.ts +4 -0
- package/src/app.service.ts +7 -0
- package/src/attachment/attachment.module.ts +5 -2
- package/src/attachment/controllers/attachment.controller.ts +1 -2
- package/src/attachment/dto/attachment.dto.ts +5 -51
- package/src/attachment/entities/attachment.entity.ts +12 -13
- package/src/attachment/guards/attachment-ability.guard.ts +1 -1
- package/src/attachment/mocks/attachment.mock.ts +10 -5
- package/src/attachment/services/attachment.service.ts +2 -5
- package/src/attachment/types/index.ts +5 -25
- package/src/audit/README.md +559 -0
- package/src/audit/audit-core.module.ts +33 -0
- package/src/audit/audit.module.ts +63 -0
- package/src/audit/controllers/audit-log.controller.ts +77 -0
- package/src/audit/decorators/audit-label.decorator.ts +37 -0
- package/src/audit/decorators/audit-log.decorators.ts +35 -0
- package/src/audit/dto/audit-log.dto.ts +125 -0
- package/src/audit/entities/audit-log.entity.ts +78 -0
- package/src/audit/exporters/audit-backend.factory.ts +74 -0
- package/src/audit/exporters/audit-database.exporter.ts +93 -0
- package/src/audit/exporters/audit-noop.exporter.ts +29 -0
- package/src/audit/exporters/audit-safe.exporter.ts +53 -0
- package/src/audit/index.ts +23 -0
- package/src/audit/interceptors/audit-context.interceptor.ts +30 -0
- package/src/audit/repositories/audit-log.repository.ts +23 -0
- package/src/audit/services/audit-context.service.ts +123 -0
- package/src/audit/services/audit-log-record.service.ts +97 -0
- package/src/audit/subscribers/audit-log.subscriber.ts +322 -0
- package/src/audit/types/audit-context.type.ts +20 -0
- package/src/audit/utils/request-context.ts +44 -0
- package/src/channel/README.md +313 -0
- package/src/channel/channel.controller.ts +19 -3
- package/src/channel/channel.module.ts +22 -3
- package/src/channel/channel.service.ts +108 -119
- package/src/channel/dto/source.dto.ts +72 -0
- package/src/channel/entities/source.entity.ts +56 -0
- package/src/channel/index.ts +24 -0
- package/src/channel/lib/Handler.ts +102 -27
- package/src/channel/lib/__test__/common.mock.ts +18 -17
- package/src/channel/lib/__test__/label.mock.ts +1 -1
- package/src/channel/lib/__test__/subscriber.mock.ts +2 -1
- package/src/channel/lib/channel-capabilities.ts +37 -0
- package/src/channel/lib/channel-codec.ts +48 -0
- package/src/channel/lib/channel-event-bus.ts +70 -0
- package/src/channel/lib/extension-inject.decorator.ts +67 -0
- package/src/channel/lib/inbound-events/channel-inbound-event-context.ts +18 -0
- package/src/channel/lib/inbound-events/channel-inbound-event.ts +39 -2
- package/src/channel/lib/inbound-events/message-inbound-event.ts +11 -6
- package/src/channel/lib/inbound-events/synthetic-message-inbound-event.ts +31 -27
- package/src/channel/lib/outbound/channel-outbound-encoder.ts +51 -86
- package/src/channel/lib/transports/http-channel-handler.ts +187 -0
- package/src/channel/lib/transports/index.ts +9 -0
- package/src/channel/lib/transports/websocket-channel-handler.ts +142 -0
- package/src/channel/repositories/source.repository.ts +23 -0
- package/src/channel/services/channel-attachment.service.ts +29 -19
- package/src/channel/services/channel-download.service.ts +5 -2
- package/src/channel/services/channel-registry.service.ts +41 -0
- package/src/channel/services/source.service.ts +224 -0
- package/src/channel/services/subscriber-resolver.service.ts +85 -0
- package/src/channel/source.controller.ts +87 -0
- package/src/channel/types.ts +14 -8
- package/src/channel/webhook.controller.ts +34 -77
- package/src/chat/controllers/label-group.controller.ts +1 -2
- package/src/chat/controllers/label.controller.ts +2 -6
- package/src/chat/controllers/message.controller.ts +27 -22
- package/src/chat/controllers/subscriber.controller.ts +3 -5
- package/src/chat/controllers/thread.controller.ts +18 -7
- package/src/chat/dto/label-group.dto.ts +4 -25
- package/src/chat/dto/label.dto.ts +4 -47
- package/src/chat/dto/message.dto.ts +19 -68
- package/src/chat/dto/subscriber.dto.ts +13 -66
- package/src/chat/dto/thread.dto.ts +15 -42
- package/src/chat/entities/label-group.entity.ts +6 -7
- package/src/chat/entities/label.entity.ts +6 -3
- package/src/chat/entities/message.entity.ts +9 -4
- package/src/chat/entities/subscriber.entity.ts +31 -11
- package/src/chat/entities/thread.entity.ts +18 -3
- package/src/chat/helpers/README.md +7 -7
- package/src/chat/helpers/envelope-builder.ts +52 -58
- package/src/chat/helpers/envelope-factory.ts +23 -22
- package/src/chat/index.ts +0 -10
- package/src/chat/repositories/message.repository.ts +1 -2
- package/src/chat/repositories/subscriber.repository.ts +27 -18
- package/src/chat/repositories/thread.repository.ts +2 -2
- package/src/chat/services/chat.service.ts +26 -7
- package/src/chat/services/message.service.ts +1 -2
- package/src/chat/services/subscriber.service.ts +30 -11
- package/src/chat/services/thread.service.ts +95 -7
- package/src/cms/controllers/content-type.controller.ts +1 -1
- package/src/cms/controllers/content.controller.ts +2 -5
- package/src/cms/controllers/menu.controller.ts +2 -1
- package/src/cms/dto/content.dto.ts +4 -34
- package/src/cms/dto/contentType.dto.ts +4 -19
- package/src/cms/dto/menu.dto.ts +4 -36
- package/src/cms/entities/content-type.entity.ts +6 -7
- package/src/cms/entities/content.entity.ts +11 -4
- package/src/cms/entities/menu.entity.ts +6 -3
- package/src/cms/enums/menu-type.enum.ts +1 -5
- package/src/cms/repositories/content.repository.ts +1 -1
- package/src/cms/services/content-type.service.ts +1 -1
- package/src/cms/services/content.service.ts +8 -5
- package/src/cms/services/rag-indexer.service.ts +1 -2
- package/src/cms/types/menu-types.ts +2 -1
- package/src/cms/utilities/verifyTree.ts +2 -1
- package/src/config/index.ts +81 -0
- package/src/config/types.ts +26 -0
- package/src/database/entities/base.entity.ts +54 -7
- package/src/extension/cleanup.service.ts +2 -17
- package/src/extension/types.ts +5 -8
- package/src/extensions/actions/ai/ai-base.action.ts +25 -10
- package/src/extensions/actions/messaging/attachment.action.ts +5 -2
- package/src/extensions/actions/messaging/buttons.action.ts +1 -1
- package/src/extensions/actions/messaging/list.action.ts +9 -6
- package/src/extensions/actions/messaging/message-action.base.ts +15 -15
- package/src/extensions/actions/messaging/quick-replies.action.ts +1 -1
- package/src/extensions/channels/console/globals.d.ts +5 -3
- package/src/extensions/channels/console/index.channel.ts +5 -2
- package/src/extensions/channels/console/{console-channel.settings.ts → settings.schema.ts} +1 -28
- package/src/extensions/channels/web/__test__/data.mock.ts +2 -2
- package/src/extensions/channels/web/__test__/events.mock.ts +6 -7
- package/src/extensions/channels/web/base-web-channel.ts +294 -655
- package/src/extensions/channels/web/globals.d.ts +5 -3
- package/src/extensions/channels/web/inbound/events/delivery.event.ts +2 -1
- package/src/extensions/channels/web/inbound/events/messages/attachment.event.ts +19 -13
- package/src/extensions/channels/web/inbound/events/messages/location.event.ts +13 -7
- package/src/extensions/channels/web/inbound/events/messages/payload.event.ts +12 -5
- package/src/extensions/channels/web/inbound/events/messages/postback.event.ts +2 -1
- package/src/extensions/channels/web/inbound/events/messages/quick-reply.event.ts +3 -2
- package/src/extensions/channels/web/inbound/events/messages/text.event.ts +7 -3
- package/src/extensions/channels/web/inbound/events/read.event.ts +2 -1
- package/src/extensions/channels/web/inbound/events/typing.event.ts +2 -1
- package/src/extensions/channels/web/inbound/events/unsupported.event.ts +2 -1
- package/src/extensions/channels/web/inbound/index.ts +2 -0
- package/src/extensions/channels/web/inbound/web-inbound-message-encoder.ts +92 -0
- package/src/extensions/channels/web/index.channel.ts +5 -2
- package/src/extensions/channels/web/outbound/web-outbound-message-encoder.ts +48 -43
- package/src/extensions/channels/web/services/web-history.service.ts +158 -0
- package/src/extensions/channels/web/services/web-session.service.ts +235 -0
- package/src/extensions/channels/web/{web-channel.settings.ts → settings.schema.ts} +1 -28
- package/src/extensions/channels/web/types.ts +8 -5
- package/src/extensions/helpers/local-storage/index.helper.ts +1 -1
- package/src/extensions/index.ts +2 -2
- package/src/health/health.service.ts +237 -0
- package/src/helper/lib/base-llm-helper.ts +1 -1
- package/src/helper/lib/base-storage-helper.ts +1 -1
- package/src/i18n/controllers/language.controller.ts +2 -5
- package/src/i18n/dto/language.dto.ts +4 -22
- package/src/i18n/dto/translation.dto.ts +4 -16
- package/src/i18n/entities/language.entity.ts +6 -3
- package/src/i18n/entities/translation.entity.ts +6 -3
- package/src/index.ts +2 -0
- package/src/seeder.ts +2 -2
- package/src/setting/controllers/setting.controller.ts +2 -1
- package/src/setting/dto/metadata.dto.ts +4 -16
- package/src/setting/dto/setting.dto.ts +4 -22
- package/src/setting/entities/metadata.entity.ts +6 -3
- package/src/setting/entities/setting.entity.ts +6 -3
- package/src/setting/globals.d.ts +0 -1
- package/src/setting/runtime-settings.seed.ts +2 -4
- package/src/setting/runtime-settings.ts +1 -5
- package/src/setting/services/metadata.service.ts +2 -1
- package/src/setting/services/setting.service.ts +2 -5
- package/src/setting/setting.module.ts +2 -1
- package/src/setting/types/index.ts +2 -9
- package/src/user/controllers/auth.controller.ts +3 -0
- package/src/user/controllers/credential.controller.ts +1 -2
- package/src/user/controllers/role.controller.ts +1 -1
- package/src/user/dto/credential.dto.ts +4 -25
- package/src/user/dto/model.dto.ts +4 -31
- package/src/user/dto/permission.dto.ts +4 -36
- package/src/user/dto/role.dto.ts +4 -39
- package/src/user/dto/user-profile.dto.ts +4 -19
- package/src/user/dto/user.dto.ts +8 -99
- package/src/user/entities/credential.entity.ts +6 -7
- package/src/user/entities/model.entity.ts +6 -3
- package/src/user/entities/permission.entity.ts +4 -7
- package/src/user/entities/role.entity.ts +6 -3
- package/src/user/entities/user-profile.entity.ts +8 -5
- package/src/user/entities/user.entity.ts +7 -4
- package/src/user/guards/ability.guard.ts +1 -1
- package/src/user/guards/local-auth.guard.ts +100 -5
- package/src/user/passport/session.serializer.ts +1 -1
- package/src/user/repositories/credential.repository.ts +0 -6
- package/src/user/seeds/model.seed-model.ts +10 -0
- package/src/user/services/auth.service.ts +1 -1
- package/src/user/services/permission.service.ts +1 -1
- package/src/user/types/action.type.ts +1 -13
- package/src/user/types/index.type.ts +1 -1
- package/src/user/types/model.type.ts +1 -29
- package/src/user/types/permission.type.ts +4 -6
- package/src/user/types/user-provider.type.ts +1 -4
- package/src/utils/test/dummy/dto/dummy.dto.ts +4 -16
- package/src/utils/test/dummy/entities/dummy.entity.ts +4 -3
- package/src/utils/test/fixtures/content.ts +2 -1
- package/src/utils/test/fixtures/contenttype.ts +2 -1
- package/src/utils/test/fixtures/label-group.ts +2 -1
- package/src/utils/test/fixtures/label.ts +2 -1
- package/src/utils/test/fixtures/message.ts +78 -4
- package/src/utils/test/fixtures/setting.ts +0 -7
- package/src/utils/test/fixtures/subscriber.ts +51 -2
- package/src/utils/test/fixtures/user.ts +2 -1
- package/src/utils/test/mocks/subscriber.ts +13 -1
- package/src/utils/types/dto.types.ts +12 -26
- package/src/websocket/services/socket-event-dispatcher.service.ts +90 -6
- package/src/websocket/utils/socket-request.ts +4 -1
- package/src/websocket/websocket.gateway.ts +84 -5
- package/src/workflow/contexts/workflow-context-factory.ts +6 -2
- package/src/workflow/contexts/workflow-runtime.context.ts +6 -2
- package/src/workflow/controllers/mcp-server.controller.ts +2 -6
- package/src/workflow/controllers/memory-definition.controller.ts +1 -1
- package/src/workflow/controllers/workflow-run.controller.ts +1 -1
- package/src/workflow/controllers/workflow-version.controller.ts +1 -1
- package/src/workflow/controllers/workflow.controller.ts +9 -7
- package/src/workflow/dto/mcp-server.dto.ts +4 -43
- package/src/workflow/dto/memory-definition.dto.ts +7 -28
- package/src/workflow/dto/memory-record.dto.ts +5 -69
- package/src/workflow/dto/workflow-run.dto.ts +9 -120
- package/src/workflow/dto/workflow-version.dto.ts +7 -52
- package/src/workflow/dto/workflow.dto.ts +10 -92
- package/src/workflow/entities/mcp-server.entity.ts +6 -3
- package/src/workflow/entities/memory-definition.entity.ts +9 -7
- package/src/workflow/entities/memory-record.entity.ts +4 -7
- package/src/workflow/entities/workflow-run.entity.ts +13 -19
- package/src/workflow/entities/workflow-version.entity.ts +7 -7
- package/src/workflow/entities/workflow.entity.ts +6 -3
- package/src/workflow/lib/trigger-event-wrapper.ts +2 -2
- package/src/workflow/schemas/workflow-input-schemas.ts +4 -4
- package/src/workflow/services/agentic.service.ts +1 -2
- package/src/workflow/services/mcp-client-pool.service.ts +1 -1
- package/src/workflow/services/memory-definition.service.ts +1 -1
- package/src/workflow/services/memory-record.service.ts +1 -2
- package/src/workflow/services/workflow-run.service.ts +1 -1
- package/src/workflow/services/workflow-version.service.ts +2 -4
- package/src/workflow/services/workflow.service.ts +2 -1
- package/src/workflow/types.ts +17 -32
- package/src/workflow/utils/memory-store.ts +1 -2
- package/types/express-session.d.ts +1 -0
- package/dist/chat/types/attachment.d.ts +0 -27
- package/dist/chat/types/attachment.js +0 -26
- package/dist/chat/types/attachment.js.map +0 -1
- package/dist/chat/types/button.d.ts +0 -28
- package/dist/chat/types/button.js +0 -66
- package/dist/chat/types/button.js.map +0 -1
- package/dist/chat/types/message.d.ts +0 -508
- package/dist/chat/types/message.js +0 -149
- package/dist/chat/types/message.js.map +0 -1
- package/dist/chat/types/options.d.ts +0 -63
- package/dist/chat/types/options.js +0 -118
- package/dist/chat/types/options.js.map +0 -1
- package/dist/chat/types/quick-reply.d.ts +0 -29
- package/dist/chat/types/quick-reply.js +0 -31
- package/dist/chat/types/quick-reply.js.map +0 -1
- package/dist/extensions/channels/console/console-channel.settings.d.ts +0 -34
- package/dist/extensions/channels/console/console-channel.settings.js.map +0 -1
- package/dist/extensions/channels/web/web-channel.settings.d.ts +0 -38
- package/dist/extensions/channels/web/web-channel.settings.js.map +0 -1
- package/dist/i18n/localize-schema-metadata.d.ts +0 -8
- package/dist/i18n/localize-schema-metadata.js +0 -34
- package/dist/i18n/localize-schema-metadata.js.map +0 -1
- package/dist/user/dto/assigned-profile.dto.d.ts +0 -25
- package/dist/user/dto/assigned-profile.dto.js +0 -97
- package/dist/user/dto/assigned-profile.dto.js.map +0 -1
- package/dist/workflow/utils/workflow-run-duration.d.ts +0 -9
- package/dist/workflow/utils/workflow-run-duration.js +0 -28
- package/dist/workflow/utils/workflow-run-duration.js.map +0 -1
- package/src/chat/types/attachment.ts +0 -47
- package/src/chat/types/button.ts +0 -86
- package/src/chat/types/message.ts +0 -282
- package/src/chat/types/options.ts +0 -130
- package/src/chat/types/quick-reply.ts +0 -41
- package/src/i18n/localize-schema-metadata.ts +0 -63
- package/src/user/dto/assigned-profile.dto.ts +0 -76
- package/src/workflow/utils/workflow-run-duration.ts +0 -45
|
@@ -4,6 +4,17 @@
|
|
|
4
4
|
* Full terms: see LICENSE.md.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import type {
|
|
8
|
+
Attachment,
|
|
9
|
+
Source,
|
|
10
|
+
StdOutgoingMessageEnvelope,
|
|
11
|
+
Subscriber,
|
|
12
|
+
} from '@hexabot-ai/types';
|
|
13
|
+
import {
|
|
14
|
+
ActionOptions,
|
|
15
|
+
OutgoingMessageType,
|
|
16
|
+
StdEventType,
|
|
17
|
+
} from '@hexabot-ai/types';
|
|
7
18
|
import {
|
|
8
19
|
HttpException,
|
|
9
20
|
HttpStatus,
|
|
@@ -15,157 +26,197 @@ import { OnEvent } from '@nestjs/event-emitter';
|
|
|
15
26
|
import { Request, Response } from 'express';
|
|
16
27
|
import { Socket } from 'socket.io';
|
|
17
28
|
import { v4 as uuidv4 } from 'uuid';
|
|
29
|
+
import type { z } from 'zod';
|
|
18
30
|
|
|
19
|
-
import { Attachment } from '@/attachment/dto/attachment.dto';
|
|
20
31
|
import { AttachmentOrmEntity } from '@/attachment/entities/attachment.entity';
|
|
21
32
|
import {
|
|
22
33
|
AttachmentAccess,
|
|
23
34
|
AttachmentCreatedByRef,
|
|
24
35
|
AttachmentResourceRef,
|
|
25
36
|
} from '@/attachment/types';
|
|
26
|
-
import ChannelHandler from '@/channel/lib/Handler';
|
|
27
|
-
import { MessageInboundEvent } from '@/channel/lib/inbound-events';
|
|
28
37
|
import {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
38
|
+
ChannelCapabilities,
|
|
39
|
+
DEFAULT_CHANNEL_CAPABILITIES,
|
|
40
|
+
ExtensionInject,
|
|
41
|
+
WebSocketChannelHandler,
|
|
42
|
+
} from '@/channel';
|
|
43
|
+
import { MessageInboundEvent } from '@/channel/lib/inbound-events';
|
|
44
|
+
import { SourceService } from '@/channel/services/source.service';
|
|
33
45
|
import { ChannelName } from '@/channel/types';
|
|
46
|
+
import { SubscriberChannelData } from '@/chat';
|
|
34
47
|
import { MessageCreateDto } from '@/chat/dto/message.dto';
|
|
35
|
-
import {
|
|
36
|
-
import { Thread } from '@/chat/dto/thread.dto';
|
|
48
|
+
import { SubscriberCreateDto } from '@/chat/dto/subscriber.dto';
|
|
37
49
|
import { MessageService } from '@/chat/services/message.service';
|
|
38
|
-
import { SubscriberService } from '@/chat/services/subscriber.service';
|
|
39
|
-
import { ThreadService } from '@/chat/services/thread.service';
|
|
40
|
-
import { PayloadType } from '@/chat/types/button';
|
|
41
|
-
import {
|
|
42
|
-
AnyMessage,
|
|
43
|
-
IncomingMessage,
|
|
44
|
-
OutgoingMessage,
|
|
45
|
-
OutgoingMessageFormat,
|
|
46
|
-
StdEventType,
|
|
47
|
-
StdOutgoingEnvelope,
|
|
48
|
-
StdOutgoingMessage,
|
|
49
|
-
} from '@/chat/types/message';
|
|
50
|
-
import { ActionOptions } from '@/chat/types/options';
|
|
51
50
|
import { MenuService } from '@/cms/services/menu.service';
|
|
52
51
|
import { config } from '@/config';
|
|
53
52
|
import { SocketRequest } from '@/websocket/utils/socket-request';
|
|
54
53
|
import { SocketResponse } from '@/websocket/utils/socket-response';
|
|
55
|
-
import { WebsocketGateway } from '@/websocket/websocket.gateway';
|
|
56
54
|
|
|
57
55
|
import {
|
|
58
56
|
AttachmentMessageInboundEvent,
|
|
59
57
|
BaseWebInboundEvent,
|
|
60
58
|
createWebInboundEventDecoder,
|
|
59
|
+
createWebInboundMessageEncoder,
|
|
61
60
|
WebInboundEventDecoder,
|
|
61
|
+
WebInboundMessageEncoder,
|
|
62
62
|
WebMessageInboundEvent,
|
|
63
63
|
} from './inbound';
|
|
64
64
|
import {
|
|
65
65
|
createWebOutboundMessageEncoder,
|
|
66
66
|
WebOutboundMessageEncoder,
|
|
67
67
|
} from './outbound';
|
|
68
|
+
import {
|
|
69
|
+
WebFormatContext,
|
|
70
|
+
WebHistoryService,
|
|
71
|
+
} from './services/web-history.service';
|
|
72
|
+
import { WebSessionService } from './services/web-session.service';
|
|
73
|
+
import { WEB_CHANNEL_NAME } from './settings.schema';
|
|
68
74
|
import { Web } from './types';
|
|
69
|
-
import { WEB_CHANNEL_NAME } from './web-channel.settings';
|
|
70
75
|
|
|
76
|
+
/**
|
|
77
|
+
* Base handler for the Socket.IO-backed "web" channel.
|
|
78
|
+
*
|
|
79
|
+
* Responsibilities:
|
|
80
|
+
* - resolves per-channel helpers via `@ExtensionInject()` (encoder/decoder, session, history)
|
|
81
|
+
* - enforces web-channel CORS rules for the HTTP socket transport endpoints
|
|
82
|
+
* - manages web session bootstrap and thread resolution
|
|
83
|
+
* - decodes inbound web events and broadcasts outbound messages over Socket.IO
|
|
84
|
+
*/
|
|
71
85
|
@Injectable()
|
|
72
86
|
export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
73
|
-
extends
|
|
87
|
+
extends WebSocketChannelHandler<N>
|
|
74
88
|
implements OnModuleInit
|
|
75
89
|
{
|
|
76
|
-
@Inject(
|
|
77
|
-
|
|
90
|
+
@Inject(MenuService)
|
|
91
|
+
private readonly menuService: MenuService;
|
|
78
92
|
|
|
79
93
|
@Inject(MessageService)
|
|
80
|
-
|
|
94
|
+
private readonly messageService: MessageService;
|
|
81
95
|
|
|
82
|
-
@Inject(
|
|
83
|
-
|
|
96
|
+
@Inject(SourceService)
|
|
97
|
+
private readonly sourceService: SourceService;
|
|
84
98
|
|
|
85
|
-
@
|
|
86
|
-
|
|
99
|
+
@ExtensionInject((name) => createWebOutboundMessageEncoder(name))
|
|
100
|
+
private outboundMessageEncoder!: WebOutboundMessageEncoder;
|
|
87
101
|
|
|
88
|
-
@
|
|
89
|
-
|
|
102
|
+
@ExtensionInject((name) => createWebInboundMessageEncoder(name))
|
|
103
|
+
private inboundMessageEncoder!: WebInboundMessageEncoder;
|
|
90
104
|
|
|
91
|
-
@
|
|
92
|
-
|
|
105
|
+
@ExtensionInject((name) => createWebInboundEventDecoder(name))
|
|
106
|
+
private inboundEventDecoder!: WebInboundEventDecoder<N>;
|
|
93
107
|
|
|
94
|
-
|
|
108
|
+
@ExtensionInject(WebSessionService)
|
|
109
|
+
private sessionService!: WebSessionService;
|
|
95
110
|
|
|
96
|
-
|
|
111
|
+
@ExtensionInject(WebHistoryService)
|
|
112
|
+
private historyService!: WebHistoryService;
|
|
97
113
|
|
|
98
|
-
constructor(name: N) {
|
|
99
|
-
super(name);
|
|
114
|
+
constructor(name: N, sourceSettingsSchema?: z.ZodTypeAny) {
|
|
115
|
+
super(name, sourceSettingsSchema);
|
|
100
116
|
}
|
|
101
117
|
|
|
102
118
|
async onModuleInit() {
|
|
103
119
|
await super.onModuleInit();
|
|
104
|
-
const OutboundMessageEncoderProvider = createWebOutboundMessageEncoder(
|
|
105
|
-
this.getName(),
|
|
106
|
-
);
|
|
107
|
-
const InboundEventDecoderProvider = createWebInboundEventDecoder(
|
|
108
|
-
this.getName(),
|
|
109
|
-
);
|
|
110
|
-
[this.outboundMessageEncoder, this.inboundEventDecoder] = await Promise.all(
|
|
111
|
-
[
|
|
112
|
-
this.createModuleRef(OutboundMessageEncoderProvider),
|
|
113
|
-
this.createModuleRef(InboundEventDecoderProvider) as Promise<
|
|
114
|
-
WebInboundEventDecoder<N>
|
|
115
|
-
>,
|
|
116
|
-
],
|
|
117
|
-
);
|
|
118
120
|
this.logger.debug('initialization ...');
|
|
119
121
|
}
|
|
120
122
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
123
|
+
getCapabilities(): ChannelCapabilities {
|
|
124
|
+
return { ...DEFAULT_CHANNEL_CAPABILITIES, typingIndicator: true };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
generateId(): string {
|
|
128
|
+
return `${this.name}-${uuidv4()}`;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
getChannelAttributes(
|
|
132
|
+
req: SocketRequest,
|
|
133
|
+
): SubscriberChannelDict[typeof WEB_CHANNEL_NAME] {
|
|
134
|
+
return {
|
|
135
|
+
isSocket: true,
|
|
136
|
+
ipAddress: this.getIpAddress(req),
|
|
137
|
+
agent: req.headers['user-agent'] || 'browser',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private formatCtx(sourceId: string): WebFormatContext {
|
|
142
|
+
return {
|
|
143
|
+
inboundEncoder: this.inboundMessageEncoder,
|
|
144
|
+
outboundEncoder: this.outboundMessageEncoder,
|
|
145
|
+
generateId: () => this.generateId(),
|
|
146
|
+
sourceId,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
private getSourceIdFromHandshake(client: Socket): string | null {
|
|
151
|
+
const rawSourceId = client.handshake.query.source_id;
|
|
152
|
+
const sourceId = Array.isArray(rawSourceId) ? rawSourceId[0] : rawSourceId;
|
|
153
|
+
|
|
154
|
+
if (typeof sourceId !== 'string') {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const normalizedSourceId = sourceId.trim();
|
|
159
|
+
|
|
160
|
+
return normalizedSourceId.length > 0 ? normalizedSourceId : null;
|
|
161
|
+
}
|
|
162
|
+
|
|
126
163
|
@OnEvent('hook:websocket:connection', { async: true })
|
|
127
164
|
async onWebSocketConnection(client: Socket) {
|
|
128
165
|
try {
|
|
129
|
-
const
|
|
130
|
-
|
|
166
|
+
const sourceId = this.getSourceIdFromHandshake(client);
|
|
167
|
+
|
|
168
|
+
if (!sourceId) {
|
|
169
|
+
if (client.request.session.passport?.user?.id) {
|
|
170
|
+
// Core websocket connection for system notifications (not the web/console channel one)
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
this.logger.warn('Missing source_id in websocket handshake');
|
|
175
|
+
client.disconnect();
|
|
176
|
+
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const source = await this.sourceService.findActiveById(sourceId);
|
|
131
181
|
const profile = client.request.session.web?.profile;
|
|
132
182
|
|
|
133
|
-
if (channel !== this.getName()) {
|
|
183
|
+
if (source.channel !== this.getName()) {
|
|
134
184
|
return;
|
|
135
185
|
}
|
|
136
186
|
|
|
187
|
+
client.request.session.web = {
|
|
188
|
+
...client.request.session.web,
|
|
189
|
+
sourceId,
|
|
190
|
+
};
|
|
191
|
+
|
|
137
192
|
let messages: Web.Message[] | undefined;
|
|
138
193
|
let threadId: string | undefined;
|
|
139
194
|
|
|
140
195
|
if (profile?.foreignId) {
|
|
141
196
|
await client.join(profile.foreignId);
|
|
142
|
-
const thread = await this.
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
197
|
+
const thread = await this.sessionService.resolveThread(
|
|
198
|
+
profile.id,
|
|
199
|
+
client.request.session.web?.threadId,
|
|
200
|
+
);
|
|
146
201
|
threadId = thread?.id;
|
|
147
|
-
const currentWebSession = client.request.session.web;
|
|
148
202
|
client.request.session.web = {
|
|
149
|
-
profile:
|
|
203
|
+
profile: client.request.session.web?.profile,
|
|
150
204
|
threadId,
|
|
205
|
+
sourceId,
|
|
151
206
|
};
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
} else {
|
|
159
|
-
messages = [];
|
|
160
|
-
}
|
|
207
|
+
messages = thread
|
|
208
|
+
? await this.historyService.fetchHistory(
|
|
209
|
+
thread,
|
|
210
|
+
this.formatCtx(source.id),
|
|
211
|
+
)
|
|
212
|
+
: [];
|
|
161
213
|
}
|
|
162
214
|
|
|
163
215
|
this.logger.debug('WS connected .. sending settings');
|
|
164
|
-
const settings =
|
|
216
|
+
const settings = source.settings;
|
|
165
217
|
|
|
166
218
|
try {
|
|
167
219
|
const menu = await this.menuService.getTree();
|
|
168
|
-
|
|
169
220
|
client.emit('settings', {
|
|
170
221
|
menu,
|
|
171
222
|
profile,
|
|
@@ -199,202 +250,19 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
199
250
|
}
|
|
200
251
|
) as SocketResponse;
|
|
201
252
|
const subscriber = socket.request.session.web?.profile;
|
|
253
|
+
const sourceId = this.getSourceIdFromHandshake(socket);
|
|
202
254
|
|
|
203
|
-
if (
|
|
255
|
+
if (
|
|
256
|
+
!sourceId ||
|
|
257
|
+
socket.request.session.web?.sourceId !== sourceId ||
|
|
258
|
+
!subscriber
|
|
259
|
+
) {
|
|
204
260
|
return;
|
|
205
261
|
}
|
|
206
262
|
|
|
207
263
|
this.broadcast(subscriber, StdEventType.error, response, [socket.id]);
|
|
208
264
|
}
|
|
209
265
|
|
|
210
|
-
/**
|
|
211
|
-
* Adapt incoming message structure for web channel
|
|
212
|
-
*
|
|
213
|
-
* @param incoming - Incoming message
|
|
214
|
-
* @returns Formatted web message
|
|
215
|
-
*/
|
|
216
|
-
private async formatIncomingHistoryMessage(
|
|
217
|
-
incoming: IncomingMessage,
|
|
218
|
-
): Promise<Web.InboundMessageBase> {
|
|
219
|
-
// Format incoming message
|
|
220
|
-
if ('type' in incoming.message) {
|
|
221
|
-
if (incoming.message.type === PayloadType.location) {
|
|
222
|
-
const coordinates = incoming.message.coordinates;
|
|
223
|
-
|
|
224
|
-
return {
|
|
225
|
-
type: Web.InboundMessageType.location,
|
|
226
|
-
data: {
|
|
227
|
-
coordinates: {
|
|
228
|
-
lat: coordinates.lat,
|
|
229
|
-
lng: coordinates.lon,
|
|
230
|
-
},
|
|
231
|
-
},
|
|
232
|
-
};
|
|
233
|
-
} else {
|
|
234
|
-
// @TODO : handle multiple files
|
|
235
|
-
const attachmentPayload = Array.isArray(incoming.message.attachment)
|
|
236
|
-
? incoming.message.attachment[0]
|
|
237
|
-
: incoming.message.attachment;
|
|
238
|
-
|
|
239
|
-
return {
|
|
240
|
-
type: Web.InboundMessageType.file,
|
|
241
|
-
data: {
|
|
242
|
-
type: attachmentPayload.type,
|
|
243
|
-
url: await this.channelAttachmentService.getPublicUrl(
|
|
244
|
-
this.getName(),
|
|
245
|
-
attachmentPayload.payload,
|
|
246
|
-
),
|
|
247
|
-
},
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
} else {
|
|
251
|
-
return {
|
|
252
|
-
type: Web.InboundMessageType.text,
|
|
253
|
-
data: incoming.message,
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Adapt the outgoing message structure for web channel
|
|
260
|
-
*
|
|
261
|
-
* @param outgoing - The outgoing message
|
|
262
|
-
* @returns Formatted web message
|
|
263
|
-
*/
|
|
264
|
-
private async formatOutgoingHistoryMessage(
|
|
265
|
-
outgoing: OutgoingMessage,
|
|
266
|
-
): Promise<Web.OutboundMessageBase> {
|
|
267
|
-
const envelope = inferOutgoingMessageEnvelope(outgoing.message);
|
|
268
|
-
const options: ActionOptions =
|
|
269
|
-
'options' in outgoing.message
|
|
270
|
-
? {
|
|
271
|
-
content: outgoing.message.options,
|
|
272
|
-
}
|
|
273
|
-
: {};
|
|
274
|
-
|
|
275
|
-
return await this.outboundMessageEncoder.encode(envelope, options);
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* Checks if a given message is an IncomingMessage
|
|
280
|
-
*
|
|
281
|
-
* @param message Any type of message
|
|
282
|
-
* @returns True, if it's a incoming message
|
|
283
|
-
*/
|
|
284
|
-
private isIncomingMessage(message: AnyMessage): message is IncomingMessage {
|
|
285
|
-
return 'sender' in message && !!message.sender;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* Adapt the message structure for web channel
|
|
290
|
-
*
|
|
291
|
-
* @param messages - The messages to be formatted
|
|
292
|
-
*
|
|
293
|
-
* @returns Formatted message
|
|
294
|
-
*/
|
|
295
|
-
protected async formatMessages(
|
|
296
|
-
messages: AnyMessage[],
|
|
297
|
-
): Promise<Web.Message[]> {
|
|
298
|
-
const formattedMessages: Web.Message[] = [];
|
|
299
|
-
|
|
300
|
-
for (const anyMessage of messages) {
|
|
301
|
-
const messageMid = anyMessage.mid ?? this.generateId();
|
|
302
|
-
if (this.isIncomingMessage(anyMessage)) {
|
|
303
|
-
const message = await this.formatIncomingHistoryMessage(anyMessage);
|
|
304
|
-
formattedMessages.push({
|
|
305
|
-
...message,
|
|
306
|
-
author: anyMessage.sender,
|
|
307
|
-
read: true, // Temporary fix as read is false in the bd
|
|
308
|
-
mid: messageMid,
|
|
309
|
-
createdAt: anyMessage.createdAt,
|
|
310
|
-
});
|
|
311
|
-
} else {
|
|
312
|
-
const message = await this.formatOutgoingHistoryMessage(anyMessage);
|
|
313
|
-
formattedMessages.push({
|
|
314
|
-
...message,
|
|
315
|
-
author: 'chatbot',
|
|
316
|
-
read: true, // Temporary fix as read is false in the bd
|
|
317
|
-
mid: messageMid,
|
|
318
|
-
handover: !!anyMessage.handover,
|
|
319
|
-
createdAt: anyMessage.createdAt,
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
return formattedMessages;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
private normalizeThreadId(raw: unknown): string | undefined {
|
|
328
|
-
if (typeof raw !== 'string') {
|
|
329
|
-
return undefined;
|
|
330
|
-
}
|
|
331
|
-
const value = raw.trim();
|
|
332
|
-
|
|
333
|
-
return value.length > 0 ? value : undefined;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
private getThreadIdFromQuery(req: SocketRequest): string | undefined {
|
|
337
|
-
const raw = req.query.thread_id;
|
|
338
|
-
const candidate = Array.isArray(raw) ? raw[0] : raw;
|
|
339
|
-
|
|
340
|
-
return this.normalizeThreadId(candidate);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
private getThreadIdFromBody(req: SocketRequest): string | undefined {
|
|
344
|
-
const body = req.body as { thread_id?: unknown } | undefined;
|
|
345
|
-
|
|
346
|
-
return this.normalizeThreadId(body?.thread_id);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
private async resolveThreadForHistory(
|
|
350
|
-
req: SocketRequest,
|
|
351
|
-
): Promise<Thread | null> {
|
|
352
|
-
const profile = req.session.web?.profile;
|
|
353
|
-
if (!profile?.id) {
|
|
354
|
-
return null;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
const explicitThreadId =
|
|
358
|
-
this.getThreadIdFromQuery(req) ?? this.getThreadIdFromBody(req);
|
|
359
|
-
const thread = await this.threadService.resolveThread({
|
|
360
|
-
subscriberId: profile.id,
|
|
361
|
-
explicitThreadId,
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
if (req.session.web) {
|
|
365
|
-
req.session.web.threadId = thread?.id;
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
return thread;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
/**
|
|
372
|
-
* Fetches the messaging history from the DB.
|
|
373
|
-
* @param req - Either an HTTP Express request or a WS SocketRequest (synthetic)
|
|
374
|
-
* @param [until=new Date()] - Date before which to fetch
|
|
375
|
-
* @param [n=30] - Number of messages to fetch
|
|
376
|
-
* @returns Promise resolving to an array of messages.
|
|
377
|
-
* Fetches the last 'n' messages for the session profile up to the given date.
|
|
378
|
-
*/
|
|
379
|
-
protected async fetchHistory(
|
|
380
|
-
req: SocketRequest,
|
|
381
|
-
until: Date = new Date(),
|
|
382
|
-
n: number = 30,
|
|
383
|
-
): Promise<Web.Message[]> {
|
|
384
|
-
const thread = await this.resolveThreadForHistory(req);
|
|
385
|
-
if (thread) {
|
|
386
|
-
const messages = await this.messageService.findHistoryUntilDate(
|
|
387
|
-
thread,
|
|
388
|
-
until,
|
|
389
|
-
n,
|
|
390
|
-
);
|
|
391
|
-
|
|
392
|
-
return await this.formatMessages(messages.reverse() as AnyMessage[]);
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
return [];
|
|
396
|
-
}
|
|
397
|
-
|
|
398
266
|
/**
|
|
399
267
|
* Verify the origin against whitelisted domains.
|
|
400
268
|
*
|
|
@@ -404,173 +272,45 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
404
272
|
private async ensureValidCors(
|
|
405
273
|
req: SocketRequest,
|
|
406
274
|
res: Response | SocketResponse,
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
const originUrl = new URL(req.headers.origin);
|
|
415
|
-
const allowedProtocols = new Set(['http:', 'https:']);
|
|
416
|
-
if (!allowedProtocols.has(originUrl.protocol)) {
|
|
417
|
-
throw new Error('CORS - Invalid origin!');
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
const settings = await this.getSettings<typeof WEB_CHANNEL_NAME>();
|
|
421
|
-
// Get the allowed origins
|
|
422
|
-
const origins: string[] = settings.allowed_domains.split(',');
|
|
423
|
-
const foundOrigin = origins
|
|
424
|
-
.filter((origin) => origin.trim() !== '*') // Skip "*"
|
|
425
|
-
.map((origin) => {
|
|
426
|
-
try {
|
|
427
|
-
return new URL(origin.trim()).origin;
|
|
428
|
-
} catch (error) {
|
|
429
|
-
this.logger.error(`Invalid URL in allowed domains: ${origin}`, error);
|
|
430
|
-
|
|
431
|
-
return null;
|
|
432
|
-
}
|
|
433
|
-
})
|
|
434
|
-
.filter(
|
|
435
|
-
(normalizedOrigin): normalizedOrigin is string =>
|
|
436
|
-
normalizedOrigin !== null,
|
|
437
|
-
)
|
|
438
|
-
.some((origin: string) => {
|
|
439
|
-
// If we find a whitelisted origin, send the Access-Control-Allow-Origin header
|
|
440
|
-
// to greenlight the request.
|
|
441
|
-
return origin === originUrl.origin;
|
|
442
|
-
});
|
|
275
|
+
source: Source,
|
|
276
|
+
): Promise<void> {
|
|
277
|
+
const allowedDomains =
|
|
278
|
+
typeof source.settings.allowed_domains === 'string'
|
|
279
|
+
? source.settings.allowed_domains
|
|
280
|
+
: '*';
|
|
443
281
|
|
|
444
|
-
|
|
445
|
-
// For HTTP requests, set the Access-Control-Allow-Origin header to '', which the browser will
|
|
446
|
-
// interpret as, 'no way Jose.'
|
|
447
|
-
res.set('Access-Control-Allow-Origin', '');
|
|
448
|
-
this.logger.debug('No origin found ', req.headers.origin);
|
|
449
|
-
throw new Error('CORS - Domain not allowed!');
|
|
450
|
-
} else {
|
|
451
|
-
res.set('Access-Control-Allow-Origin', originUrl.origin);
|
|
452
|
-
}
|
|
453
|
-
// Determine whether or not to allow cookies to be passed cross-origin
|
|
454
|
-
res.set('Access-Control-Allow-Credentials', 'true');
|
|
455
|
-
// This header lets a server whitelist headers that browsers are allowed to access
|
|
456
|
-
res.set('Access-Control-Expose-Headers', '');
|
|
457
|
-
// Handle preflight requests
|
|
458
|
-
if (req.method == 'OPTIONS') {
|
|
459
|
-
res.set('Access-Control-Allow-Methods', 'GET, POST');
|
|
460
|
-
res.set('Access-Control-Allow-Headers', 'content-type');
|
|
461
|
-
}
|
|
282
|
+
await this.sessionService.validateCors(req, res, allowedDomains);
|
|
462
283
|
}
|
|
463
284
|
|
|
464
|
-
|
|
465
|
-
* Makes sure that message request is legitimate.
|
|
466
|
-
*
|
|
467
|
-
* @param req
|
|
468
|
-
* @param res
|
|
469
|
-
*/
|
|
470
|
-
private async validateSession(
|
|
285
|
+
protected async getOrCreateSession(
|
|
471
286
|
req: SocketRequest,
|
|
472
|
-
|
|
473
|
-
): Promise<Subscriber
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
const body = req.body as { author?: unknown; data?: unknown } | undefined;
|
|
479
|
-
const authorForeignId =
|
|
480
|
-
typeof body?.author === 'string' && body.author.trim().length > 0
|
|
481
|
-
? body.author.trim()
|
|
482
|
-
: undefined;
|
|
287
|
+
source: Source,
|
|
288
|
+
): Promise<Subscriber> {
|
|
289
|
+
return this.sessionService.getOrCreateSession(req, source.id, () => {
|
|
290
|
+
const data = req.query;
|
|
483
291
|
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
this.logger.warn(
|
|
507
|
-
`Unable to recover missing session from author ${authorForeignId}`,
|
|
508
|
-
error,
|
|
509
|
-
);
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
this.logger.warn('No session ID to be found!', req.session);
|
|
514
|
-
res.status(403).json({ err: 'Web Channel Handler : Unauthorized!' });
|
|
515
|
-
|
|
516
|
-
return null;
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
/**
|
|
520
|
-
* Get or create a session profile for the subscriber
|
|
521
|
-
*
|
|
522
|
-
* @param req
|
|
523
|
-
*
|
|
524
|
-
* @returns Subscriber's profile
|
|
525
|
-
*/
|
|
526
|
-
protected async getOrCreateSession(req: SocketRequest): Promise<Subscriber> {
|
|
527
|
-
const data = req.query;
|
|
528
|
-
// Subscriber has already a session
|
|
529
|
-
const sessionProfile = req.session.web?.profile;
|
|
530
|
-
if (sessionProfile) {
|
|
531
|
-
const subscriber = await this.subscriberService.findOne(
|
|
532
|
-
sessionProfile.id,
|
|
533
|
-
);
|
|
534
|
-
if (!subscriber || !req.session.web) {
|
|
535
|
-
throw new Error('Subscriber session was not persisted in DB');
|
|
536
|
-
}
|
|
537
|
-
const thread = await this.threadService.resolveThread({
|
|
538
|
-
subscriberId: subscriber.id,
|
|
539
|
-
explicitThreadId: req.session.web.threadId,
|
|
540
|
-
});
|
|
541
|
-
req.session.web.profile = subscriber;
|
|
542
|
-
req.session.web.threadId = thread?.id;
|
|
543
|
-
|
|
544
|
-
return subscriber;
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
const newProfile: SubscriberCreateDto = {
|
|
548
|
-
foreignId: this.generateId(),
|
|
549
|
-
firstName: data.first_name ? data.first_name.toString() : 'Anon.',
|
|
550
|
-
lastName: data.last_name ? data.last_name.toString() : 'Web User',
|
|
551
|
-
assignedTo: null,
|
|
552
|
-
assignedAt: null,
|
|
553
|
-
lastvisit: new Date(),
|
|
554
|
-
retainedFrom: new Date(),
|
|
555
|
-
avatar: null,
|
|
556
|
-
channel: {
|
|
557
|
-
name: this.getName(),
|
|
558
|
-
data: this.getChannelAttributes(req),
|
|
559
|
-
},
|
|
560
|
-
language: '',
|
|
561
|
-
locale: '',
|
|
562
|
-
timezone: 0,
|
|
563
|
-
gender: 'male',
|
|
564
|
-
country: '',
|
|
565
|
-
labels: [],
|
|
566
|
-
};
|
|
567
|
-
const profile = await this.subscriberService.create(newProfile);
|
|
568
|
-
|
|
569
|
-
req.session.web = {
|
|
570
|
-
profile,
|
|
571
|
-
};
|
|
572
|
-
|
|
573
|
-
return profile;
|
|
292
|
+
return {
|
|
293
|
+
foreignId: this.generateId(),
|
|
294
|
+
firstName: data.first_name ? String(data.first_name) : 'Anon.',
|
|
295
|
+
lastName: data.last_name ? String(data.last_name) : 'Web User',
|
|
296
|
+
assignedTo: null,
|
|
297
|
+
assignedAt: null,
|
|
298
|
+
lastvisit: new Date(),
|
|
299
|
+
retainedFrom: new Date(),
|
|
300
|
+
avatar: null,
|
|
301
|
+
channel: {
|
|
302
|
+
name: this.getName(),
|
|
303
|
+
data: this.getChannelAttributes(req),
|
|
304
|
+
},
|
|
305
|
+
language: '',
|
|
306
|
+
locale: '',
|
|
307
|
+
timezone: 0,
|
|
308
|
+
gender: 'male',
|
|
309
|
+
country: '',
|
|
310
|
+
labels: [],
|
|
311
|
+
source: source.id,
|
|
312
|
+
};
|
|
313
|
+
});
|
|
574
314
|
}
|
|
575
315
|
|
|
576
316
|
/**
|
|
@@ -582,29 +322,37 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
582
322
|
protected async subscribe(
|
|
583
323
|
req: SocketRequest,
|
|
584
324
|
res: Response | SocketResponse,
|
|
585
|
-
|
|
325
|
+
source: Source,
|
|
326
|
+
): Promise<void> {
|
|
586
327
|
this.logger.debug('subscribe (isSocket=true)');
|
|
587
328
|
try {
|
|
588
|
-
const profile = await this.getOrCreateSession(req);
|
|
329
|
+
const profile = await this.getOrCreateSession(req, source);
|
|
330
|
+
const profileForeignId = profile.foreignId;
|
|
331
|
+
if (!profileForeignId) {
|
|
332
|
+
throw new Error('Session profile foreignId is missing');
|
|
333
|
+
}
|
|
589
334
|
try {
|
|
590
|
-
await req.socket.join(
|
|
335
|
+
await req.socket.join(profileForeignId);
|
|
591
336
|
} catch (err) {
|
|
592
337
|
this.logger.error('Unable to subscribe via websocket', err);
|
|
593
338
|
}
|
|
594
|
-
// Fetch message history
|
|
595
339
|
const criteria =
|
|
596
|
-
'since' in req.query ? req.query.since : req.body?.since
|
|
597
|
-
const messages = await this.
|
|
340
|
+
'since' in req.query ? req.query.since : (req.body?.since ?? undefined);
|
|
341
|
+
const messages = await this.historyService.fetchHistoryForRequest(
|
|
342
|
+
req,
|
|
343
|
+
this.sessionService,
|
|
344
|
+
this.formatCtx(source.id),
|
|
345
|
+
criteria,
|
|
346
|
+
);
|
|
598
347
|
|
|
599
|
-
|
|
348
|
+
res.status(200).json({
|
|
600
349
|
profile,
|
|
601
350
|
messages,
|
|
602
351
|
thread_id: req.session.web?.threadId ?? null,
|
|
603
352
|
});
|
|
604
353
|
} catch (err) {
|
|
605
354
|
this.logger.warn('Unable to subscribe ', err);
|
|
606
|
-
|
|
607
|
-
return res.status(500).json({ err: 'Unable to subscribe' });
|
|
355
|
+
res.status(500).json({ err: 'Unable to subscribe' });
|
|
608
356
|
}
|
|
609
357
|
}
|
|
610
358
|
|
|
@@ -614,6 +362,7 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
614
362
|
* @param req - The WebSocket request containing the session and the file data.
|
|
615
363
|
* @returns A Promise that resolves to the stored `Attachment`, or `null` if
|
|
616
364
|
* the session is invalid or no file is provided.
|
|
365
|
+
* @throws Error if missing file payload.
|
|
617
366
|
* @throws Error if the max upload size is exceeded.
|
|
618
367
|
* @throws Error when storing the uploaded file fails.
|
|
619
368
|
*/
|
|
@@ -626,8 +375,6 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
626
375
|
|
|
627
376
|
return null;
|
|
628
377
|
}
|
|
629
|
-
|
|
630
|
-
// Check if any file is provided
|
|
631
378
|
if (type !== Web.InboundMessageType.file) {
|
|
632
379
|
this.logger.debug('No files provided');
|
|
633
380
|
|
|
@@ -637,6 +384,10 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
637
384
|
throw new Error('File payload is missing');
|
|
638
385
|
}
|
|
639
386
|
|
|
387
|
+
const { name: fileName, type: mimeType } = data as {
|
|
388
|
+
name: string;
|
|
389
|
+
type: string;
|
|
390
|
+
};
|
|
640
391
|
const size = Buffer.byteLength(data.file);
|
|
641
392
|
|
|
642
393
|
if (size > config.parameters.maxUploadSize) {
|
|
@@ -644,9 +395,9 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
644
395
|
}
|
|
645
396
|
|
|
646
397
|
return await this.attachmentService.store(data.file, {
|
|
647
|
-
name:
|
|
398
|
+
name: fileName,
|
|
648
399
|
size,
|
|
649
|
-
type:
|
|
400
|
+
type: mimeType,
|
|
650
401
|
resourceRef: AttachmentResourceRef.MessageAttachment,
|
|
651
402
|
access: AttachmentAccess.Private,
|
|
652
403
|
createdByRef: AttachmentCreatedByRef.Subscriber,
|
|
@@ -658,43 +409,16 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
658
409
|
}
|
|
659
410
|
}
|
|
660
411
|
|
|
661
|
-
/**
|
|
662
|
-
* Returns the request client IP address
|
|
663
|
-
*
|
|
664
|
-
* @param req Either a HTTP request or a WS Request (Synthetic object)
|
|
665
|
-
*
|
|
666
|
-
* @returns IP Address
|
|
667
|
-
*/
|
|
668
|
-
protected getIpAddress(req: SocketRequest): string {
|
|
669
|
-
return req.socket.handshake.address;
|
|
670
|
-
}
|
|
671
|
-
|
|
672
|
-
/**
|
|
673
|
-
* Return subscriber channel specific attributes
|
|
674
|
-
*
|
|
675
|
-
* @param req Either a HTTP Express request or a WS request (Synthetic Object)
|
|
676
|
-
*
|
|
677
|
-
* @returns The subscriber channel's attributes
|
|
678
|
-
*/
|
|
679
|
-
getChannelAttributes(
|
|
680
|
-
req: SocketRequest,
|
|
681
|
-
): SubscriberChannelDict[typeof WEB_CHANNEL_NAME] {
|
|
682
|
-
return {
|
|
683
|
-
isSocket: true,
|
|
684
|
-
ipAddress: this.getIpAddress(req),
|
|
685
|
-
agent: req.headers['user-agent'] || 'browser',
|
|
686
|
-
};
|
|
687
|
-
}
|
|
688
|
-
|
|
689
412
|
/**
|
|
690
413
|
* Handle channel event (probably a message)
|
|
691
414
|
*
|
|
692
|
-
* @param req
|
|
693
|
-
* @param res Either a HTTP Express response or a WS response (Synthetic Object)
|
|
415
|
+
* @param req - WS request (Synthetic Object)
|
|
416
|
+
* @param res - Either a HTTP Express response or a WS response (Synthetic Object)
|
|
694
417
|
*/
|
|
695
418
|
async handleEvent(
|
|
696
419
|
req: SocketRequest,
|
|
697
420
|
res: Response | SocketResponse,
|
|
421
|
+
source: Source,
|
|
698
422
|
workflowId?: string,
|
|
699
423
|
): Promise<void> {
|
|
700
424
|
if (!req.body) {
|
|
@@ -702,12 +426,13 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
702
426
|
res.status(400).json({ err: 'Web Channel Handler : Bad Request!' });
|
|
703
427
|
|
|
704
428
|
return;
|
|
705
|
-
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
if (
|
|
706
432
|
typeof req.body === 'object' &&
|
|
707
433
|
req.body !== null &&
|
|
708
434
|
'data' in req.body
|
|
709
435
|
) {
|
|
710
|
-
// Parse json form data (in case of content-type multipart/form-data)
|
|
711
436
|
const payload = req.body as { data?: unknown };
|
|
712
437
|
payload.data =
|
|
713
438
|
typeof payload.data === 'string'
|
|
@@ -715,10 +440,13 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
715
440
|
: payload.data;
|
|
716
441
|
}
|
|
717
442
|
|
|
718
|
-
const profile = await this.validateSession(
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
443
|
+
const profile = await this.sessionService.validateSession(
|
|
444
|
+
req,
|
|
445
|
+
res,
|
|
446
|
+
source.id,
|
|
447
|
+
);
|
|
448
|
+
if (!profile) return;
|
|
449
|
+
|
|
722
450
|
const channelAttrs = this.getChannelAttributes(req);
|
|
723
451
|
let events: Array<
|
|
724
452
|
BaseWebInboundEvent<N> | WebMessageInboundEvent<N, Web.InboundMessage>
|
|
@@ -745,16 +473,15 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
745
473
|
}
|
|
746
474
|
|
|
747
475
|
const explicitThreadId =
|
|
748
|
-
this.getThreadIdFromBody(req) ??
|
|
749
|
-
this.getThreadIdFromQuery(req) ??
|
|
476
|
+
this.sessionService.getThreadIdFromBody(req) ??
|
|
477
|
+
this.sessionService.getThreadIdFromQuery(req) ??
|
|
750
478
|
req.session.web?.threadId;
|
|
751
479
|
const responseBody = events[0].getRaw();
|
|
752
480
|
|
|
753
481
|
for (const event of events) {
|
|
754
482
|
event.setHandler(this);
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
}
|
|
483
|
+
event.setSourceContext(source.id, source.settings);
|
|
484
|
+
if (explicitThreadId) event.setThreadId(explicitThreadId);
|
|
758
485
|
event.setInitiator(profile);
|
|
759
486
|
event.setWorkflowId(workflowId);
|
|
760
487
|
|
|
@@ -764,17 +491,15 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
764
491
|
Web.InboundMessage
|
|
765
492
|
>;
|
|
766
493
|
|
|
767
|
-
// Handle upload when files are provided
|
|
768
494
|
if (messageEvent instanceof AttachmentMessageInboundEvent) {
|
|
769
495
|
try {
|
|
770
496
|
const attachment = await this.handleWsUpload(req);
|
|
771
|
-
|
|
772
497
|
if (attachment) {
|
|
773
498
|
messageEvent.setUploadedAttachment(attachment);
|
|
774
499
|
messageEvent.setUploadedRawData(
|
|
775
500
|
AttachmentOrmEntity.getTypeByMime(attachment.type),
|
|
776
501
|
await this.channelAttachmentService.getPublicUrl(
|
|
777
|
-
|
|
502
|
+
source.id,
|
|
778
503
|
attachment,
|
|
779
504
|
),
|
|
780
505
|
);
|
|
@@ -788,55 +513,47 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
788
513
|
}
|
|
789
514
|
}
|
|
790
515
|
|
|
791
|
-
// Handle sync message sent by chatbot
|
|
792
516
|
if (messageEvent.isSyncFromChatbot()) {
|
|
793
|
-
const thread = await this.
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
517
|
+
const thread = await this.sessionService.resolveThreadForHistory(
|
|
518
|
+
req,
|
|
519
|
+
profile.id,
|
|
520
|
+
);
|
|
797
521
|
if (!thread) {
|
|
798
522
|
return void res.status(409).json({
|
|
799
523
|
err: 'Web Channel Handler : No thread available before first user message',
|
|
800
524
|
});
|
|
801
525
|
}
|
|
802
|
-
|
|
803
526
|
messageEvent.setThreadId(thread.id);
|
|
804
|
-
if (req.session.web)
|
|
805
|
-
|
|
806
|
-
}
|
|
527
|
+
if (req.session.web) req.session.web.threadId = thread.id;
|
|
528
|
+
|
|
807
529
|
const sentMessage: MessageCreateDto = {
|
|
808
530
|
mid: messageEvent.getId(),
|
|
809
|
-
message:
|
|
531
|
+
message: {
|
|
532
|
+
type: OutgoingMessageType.text,
|
|
533
|
+
data: { text: messageEvent.getText() },
|
|
534
|
+
},
|
|
810
535
|
recipient: profile.id,
|
|
811
536
|
thread: thread.id,
|
|
812
537
|
read: true,
|
|
813
538
|
delivery: true,
|
|
814
539
|
};
|
|
815
|
-
this.
|
|
816
|
-
'hook:chatbot:sent',
|
|
817
|
-
sentMessage,
|
|
818
|
-
messageEvent,
|
|
819
|
-
);
|
|
820
|
-
|
|
540
|
+
this.channelEventBus.emitSent(sentMessage, messageEvent);
|
|
821
541
|
continue;
|
|
822
542
|
}
|
|
823
543
|
|
|
824
|
-
// Generate unique ID and handle message
|
|
825
544
|
messageEvent.setMessageId(this.generateId());
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
545
|
+
if (profile.foreignId) {
|
|
546
|
+
messageEvent.setAuthorForeignId(profile.foreignId);
|
|
547
|
+
}
|
|
829
548
|
messageEvent.setCreatedAt(new Date());
|
|
830
549
|
|
|
831
550
|
this.broadcast(profile, StdEventType.message, messageEvent.getRaw());
|
|
832
|
-
await this.
|
|
833
|
-
const resolvedThreadId = messageEvent.getThreadId();
|
|
551
|
+
await this.channelEventBus.emitMessage(messageEvent);
|
|
834
552
|
|
|
553
|
+
const resolvedThreadId = messageEvent.getThreadId();
|
|
835
554
|
if (resolvedThreadId) {
|
|
836
555
|
messageEvent.setThreadIdOnRaw(resolvedThreadId);
|
|
837
|
-
if (req.session.web)
|
|
838
|
-
req.session.web.threadId = resolvedThreadId;
|
|
839
|
-
}
|
|
556
|
+
if (req.session.web) req.session.web.threadId = resolvedThreadId;
|
|
840
557
|
}
|
|
841
558
|
|
|
842
559
|
continue;
|
|
@@ -844,120 +561,65 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
844
561
|
|
|
845
562
|
const type = event.getEventType();
|
|
846
563
|
const threadId = event.getThreadId();
|
|
847
|
-
|
|
848
|
-
if (threadId) {
|
|
849
|
-
event.setThreadIdOnRaw(threadId);
|
|
850
|
-
}
|
|
564
|
+
if (threadId) event.setThreadIdOnRaw(threadId);
|
|
851
565
|
this.broadcast(profile, type, event.getRaw());
|
|
852
|
-
this.
|
|
566
|
+
this.channelEventBus.emitStatusEvent(event);
|
|
853
567
|
}
|
|
854
568
|
|
|
855
569
|
res.status(200).json(responseBody);
|
|
856
570
|
}
|
|
857
571
|
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
*
|
|
861
|
-
* @param req Either a HTTP express request or a WS request
|
|
862
|
-
* @returns True if it's a WS request
|
|
863
|
-
*/
|
|
864
|
-
isSocketRequest(req: Request | SocketRequest): req is SocketRequest {
|
|
865
|
-
return 'isSocket' in req && req.isSocket;
|
|
866
|
-
}
|
|
867
|
-
|
|
868
|
-
/**
|
|
869
|
-
* Process incoming Web Channel data (finding out its type and assigning it to its proper handler)
|
|
870
|
-
*
|
|
871
|
-
* @param req Either a HTTP Express request or a WS request (Synthetic Object)
|
|
872
|
-
* @param res Either a HTTP Express response or a WS response (Synthetic Object)
|
|
873
|
-
*/
|
|
874
|
-
async handle(
|
|
875
|
-
req: Request | SocketRequest,
|
|
572
|
+
protected async processSocketGet(
|
|
573
|
+
req: SocketRequest,
|
|
876
574
|
res: Response | SocketResponse,
|
|
877
|
-
|
|
878
|
-
) {
|
|
879
|
-
if (!this.isSocketRequest(req)) {
|
|
880
|
-
this.logger.warn(
|
|
881
|
-
'Web channel over HTTP is no longer supported. Use Socket.IO transport.',
|
|
882
|
-
);
|
|
883
|
-
|
|
884
|
-
return res
|
|
885
|
-
.status(403)
|
|
886
|
-
.json({ err: 'Web Channel Handler : Unauthorized!' });
|
|
887
|
-
}
|
|
888
|
-
|
|
575
|
+
source: Source,
|
|
576
|
+
): Promise<void> {
|
|
889
577
|
try {
|
|
890
|
-
await this.ensureValidCors(req, res);
|
|
891
|
-
if (req.
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
return res.status(200).json({ _disconnect: true });
|
|
896
|
-
} else {
|
|
897
|
-
// Handle webhook subscribe requests
|
|
898
|
-
return await this.subscribe(req, res);
|
|
899
|
-
}
|
|
900
|
-
} else {
|
|
901
|
-
// Handle incoming messages (through POST)
|
|
902
|
-
return this.handleEvent(req, res, workflowId);
|
|
578
|
+
await this.ensureValidCors(req, res, source);
|
|
579
|
+
if (req.query._disconnect) {
|
|
580
|
+
req.session.web = undefined;
|
|
581
|
+
|
|
582
|
+
return void res.status(200).json({ _disconnect: true });
|
|
903
583
|
}
|
|
584
|
+
await this.subscribe(req, res, source);
|
|
904
585
|
} catch (err) {
|
|
905
586
|
this.logger.warn('Request check failed', err);
|
|
906
|
-
|
|
907
|
-
return res
|
|
908
|
-
.status(403)
|
|
909
|
-
.json({ err: 'Web Channel Handler : Unauthorized!' });
|
|
587
|
+
res.status(403).json({ err: 'Web Channel Handler : Unauthorized!' });
|
|
910
588
|
}
|
|
911
589
|
}
|
|
912
590
|
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
* @param type - The message to be sent (message, typing, ...)
|
|
927
|
-
* @param content - The message payload contain additional settings
|
|
928
|
-
* @param [excludedRooms=[]] - Array of room names to exclude from receiving the message.
|
|
929
|
-
*/
|
|
930
|
-
private broadcast(
|
|
931
|
-
subscriber: Subscriber,
|
|
932
|
-
type: StdEventType,
|
|
933
|
-
content: any,
|
|
934
|
-
excludedRooms: string[] = [],
|
|
935
|
-
): void {
|
|
936
|
-
this.websocketGateway.broadcast(subscriber, type, content, excludedRooms);
|
|
591
|
+
protected async processSocketPost(
|
|
592
|
+
req: SocketRequest,
|
|
593
|
+
res: Response | SocketResponse,
|
|
594
|
+
source: Source,
|
|
595
|
+
workflowId?: string,
|
|
596
|
+
): Promise<void> {
|
|
597
|
+
try {
|
|
598
|
+
await this.ensureValidCors(req, res, source);
|
|
599
|
+
await this.handleEvent(req, res, source, workflowId);
|
|
600
|
+
} catch (err) {
|
|
601
|
+
this.logger.warn('Request check failed', err);
|
|
602
|
+
res.status(403).json({ err: 'Web Channel Handler : Unauthorized!' });
|
|
603
|
+
}
|
|
937
604
|
}
|
|
938
605
|
|
|
939
|
-
|
|
940
|
-
* Send a Web Channel Message to the end-user
|
|
941
|
-
*
|
|
942
|
-
* @param event - Incoming event/message being responded to
|
|
943
|
-
* @param envelope - The message to be sent {format, message}
|
|
944
|
-
* @param options - Might contain additional settings
|
|
945
|
-
*
|
|
946
|
-
* @returns The web's response, otherwise an error
|
|
947
|
-
*/
|
|
948
|
-
async sendMessage(
|
|
606
|
+
protected async doSendMessage(
|
|
949
607
|
event: MessageInboundEvent<N>,
|
|
950
|
-
envelope:
|
|
608
|
+
envelope: StdOutgoingMessageEnvelope,
|
|
951
609
|
options: ActionOptions,
|
|
952
610
|
): Promise<{ mid: string }> {
|
|
953
|
-
|
|
954
|
-
|
|
611
|
+
const sourceId = event.getSourceId();
|
|
612
|
+
|
|
613
|
+
if (!sourceId) {
|
|
614
|
+
throw new Error(
|
|
615
|
+
`Missing sourceId while sending ${this.getName()} outbound message`,
|
|
616
|
+
);
|
|
955
617
|
}
|
|
956
618
|
|
|
957
|
-
const messageBase = await this.outboundMessageEncoder.encode(
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
);
|
|
619
|
+
const messageBase = await this.outboundMessageEncoder.encode(envelope, {
|
|
620
|
+
...(options ?? {}),
|
|
621
|
+
sourceId,
|
|
622
|
+
});
|
|
961
623
|
const subscriber = event.getInitiator();
|
|
962
624
|
const message: Web.OutboundMessage = {
|
|
963
625
|
...messageBase,
|
|
@@ -967,15 +629,15 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
967
629
|
createdAt: new Date(),
|
|
968
630
|
handover: !!(options && options.assignTo),
|
|
969
631
|
};
|
|
970
|
-
const
|
|
632
|
+
const send = async (): Promise<{ mid: string }> => {
|
|
971
633
|
this.broadcast(subscriber, StdEventType.message, message);
|
|
972
634
|
|
|
973
635
|
return { mid: message.mid };
|
|
974
636
|
};
|
|
975
637
|
|
|
976
|
-
if (options
|
|
638
|
+
if (options?.typing) {
|
|
977
639
|
const autoTimeout =
|
|
978
|
-
message
|
|
640
|
+
message?.data && 'text' in message.data
|
|
979
641
|
? message.data.text.length * 10
|
|
980
642
|
: 1000;
|
|
981
643
|
const timeout =
|
|
@@ -983,37 +645,13 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
983
645
|
try {
|
|
984
646
|
await this.sendTypingIndicator(subscriber, timeout);
|
|
985
647
|
|
|
986
|
-
return
|
|
648
|
+
return send();
|
|
987
649
|
} catch (err) {
|
|
988
650
|
this.logger.error('Failed in sending typing indicator ', err);
|
|
989
651
|
}
|
|
990
652
|
}
|
|
991
653
|
|
|
992
|
-
return
|
|
993
|
-
}
|
|
994
|
-
|
|
995
|
-
/**
|
|
996
|
-
* Send a typing indicator (waterline) to the end user for a given duration
|
|
997
|
-
*
|
|
998
|
-
* @param recipient - The end-user object
|
|
999
|
-
* @param timeout - Duration of the typing indicator in milliseconds
|
|
1000
|
-
*/
|
|
1001
|
-
async sendTypingIndicator(
|
|
1002
|
-
recipient: Subscriber,
|
|
1003
|
-
timeout: number,
|
|
1004
|
-
): Promise<void> {
|
|
1005
|
-
return new Promise((resolve, reject) => {
|
|
1006
|
-
try {
|
|
1007
|
-
this.broadcast(recipient, StdEventType.typing, true);
|
|
1008
|
-
setTimeout(() => {
|
|
1009
|
-
this.broadcast(recipient, StdEventType.typing, false);
|
|
1010
|
-
|
|
1011
|
-
return resolve();
|
|
1012
|
-
}, timeout);
|
|
1013
|
-
} catch (err) {
|
|
1014
|
-
reject(err);
|
|
1015
|
-
}
|
|
1016
|
-
});
|
|
654
|
+
return send();
|
|
1017
655
|
}
|
|
1018
656
|
|
|
1019
657
|
/**
|
|
@@ -1027,22 +665,22 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
1027
665
|
event: MessageInboundEvent<N>,
|
|
1028
666
|
): Promise<SubscriberCreateDto> {
|
|
1029
667
|
const sender = event.getInitiator();
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
const subscriber: SubscriberCreateDto = {
|
|
668
|
+
if (!sender.source) {
|
|
669
|
+
throw new Error('Unable to resolve subscriber source for web channel');
|
|
670
|
+
}
|
|
671
|
+
const { id: _id, createdAt: _c, updatedAt: _u, ...rest } = sender;
|
|
672
|
+
|
|
673
|
+
return {
|
|
1037
674
|
...rest,
|
|
1038
|
-
|
|
675
|
+
source: sender.source,
|
|
676
|
+
channel: sender.channel as SubscriberChannelData<N>,
|
|
1039
677
|
};
|
|
1040
|
-
|
|
1041
|
-
return subscriber;
|
|
1042
678
|
}
|
|
1043
679
|
|
|
1044
680
|
/**
|
|
1045
681
|
* Checks if the request is authorized to download a given attachment file.
|
|
682
|
+
* Can be overridden by the channel handler to customize, by default it shouldn't
|
|
683
|
+
* allow any client to download a subscriber attachment for example.
|
|
1046
684
|
*
|
|
1047
685
|
* @param attachment The attachment object
|
|
1048
686
|
* @param req - The HTTP express request object.
|
|
@@ -1050,26 +688,27 @@ export default abstract class BaseWebChannelHandler<N extends ChannelName>
|
|
|
1050
688
|
*/
|
|
1051
689
|
public async hasDownloadAccess(attachment: Attachment, req: Request) {
|
|
1052
690
|
const subscriberId = req.session.web?.profile?.id;
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
691
|
+
|
|
692
|
+
if (attachment.access === AttachmentAccess.Public) return true;
|
|
693
|
+
|
|
694
|
+
if (!subscriberId) {
|
|
1056
695
|
this.logger.warn(
|
|
1057
696
|
`Unauthorized access attempt to attachment ${attachment.id}`,
|
|
1058
697
|
);
|
|
1059
698
|
|
|
1060
699
|
return false;
|
|
1061
|
-
}
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
if (
|
|
1062
703
|
attachment.createdByRef === AttachmentCreatedByRef.Subscriber &&
|
|
1063
704
|
subscriberId === attachment.createdBy
|
|
1064
705
|
) {
|
|
1065
|
-
// Either subscriber wants to access the attachment he sent
|
|
1066
706
|
return true;
|
|
1067
|
-
} else {
|
|
1068
|
-
// Or, he would like to access an attachment sent to him privately
|
|
1069
|
-
return await this.messageService.isAttachmentAccessibleBySubscriber(
|
|
1070
|
-
subscriberId,
|
|
1071
|
-
attachment.id,
|
|
1072
|
-
);
|
|
1073
707
|
}
|
|
708
|
+
|
|
709
|
+
return this.messageService.isAttachmentAccessibleBySubscriber(
|
|
710
|
+
subscriberId,
|
|
711
|
+
attachment.id,
|
|
712
|
+
);
|
|
1074
713
|
}
|
|
1075
714
|
}
|