@messenger-box/platform-server 10.0.3-alpha.2 → 10.0.3-alpha.202
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/lib/channels/ack-reactions.d.ts +46 -0
- package/lib/channels/ack-reactions.js +48 -0
- package/lib/channels/ack-reactions.js.map +1 -0
- package/lib/channels/allowlist-match.d.ts +38 -0
- package/lib/channels/allowlist-match.js +67 -0
- package/lib/channels/allowlist-match.js.map +1 -0
- package/lib/channels/channel-config.d.ts +46 -0
- package/lib/channels/channel-config.js +63 -0
- package/lib/channels/channel-config.js.map +1 -0
- package/lib/channels/command-gating.d.ts +47 -0
- package/lib/channels/command-gating.js +52 -0
- package/lib/channels/command-gating.js.map +1 -0
- package/lib/channels/conversation-label.d.ts +23 -0
- package/lib/channels/conversation-label.js +43 -0
- package/lib/channels/conversation-label.js.map +1 -0
- package/lib/channels/index.d.ts +18 -0
- package/lib/channels/mention-gating.d.ts +50 -0
- package/lib/channels/mention-gating.js +72 -0
- package/lib/channels/mention-gating.js.map +1 -0
- package/lib/channels/registry.d.ts +23 -0
- package/lib/channels/registry.js +282 -0
- package/lib/channels/registry.js.map +1 -0
- package/lib/channels/sender-identity.d.ts +11 -0
- package/lib/channels/sender-identity.js +48 -0
- package/lib/channels/sender-identity.js.map +1 -0
- package/lib/channels/session.d.ts +63 -0
- package/lib/channels/session.js +29 -0
- package/lib/channels/session.js.map +1 -0
- package/lib/channels/types.d.ts +147 -0
- package/lib/channels/types.js +28 -0
- package/lib/channels/types.js.map +1 -0
- package/lib/channels/typing.d.ts +62 -0
- package/lib/channels/typing.js +37 -0
- package/lib/channels/typing.js.map +1 -0
- package/lib/channels/typing.test.d.ts +1 -0
- package/lib/config/env-config.d.ts +7 -0
- package/lib/config/env-config.js +21 -1
- package/lib/config/env-config.js.map +1 -1
- package/lib/constants/default-channel-props.d.ts +11 -0
- package/lib/constants/default-channel-props.js +32 -0
- package/lib/constants/default-channel-props.js.map +1 -0
- package/lib/constants/default-notify-props.js.map +1 -1
- package/lib/constants/index.d.ts +1 -0
- package/lib/constants/query.constants.js.map +1 -1
- package/lib/containers/containers.js +13 -7
- package/lib/containers/containers.js.map +1 -1
- package/lib/containers/context-services-from-container.d.ts +2 -2
- package/lib/containers/context-services-from-container.js +7 -7
- package/lib/containers/context-services-from-container.js.map +1 -1
- package/lib/gateway/channel-registry.d.ts +10 -0
- package/lib/gateway/gateway-service.d.ts +23 -0
- package/lib/gateway/index.d.ts +4 -0
- package/lib/gateway/message-router.d.ts +20 -0
- package/lib/gateway/types.d.ts +270 -0
- package/lib/graphql/resolvers/channel-capabilities.d.ts +13 -0
- package/lib/graphql/resolvers/channel-capabilities.js +179 -0
- package/lib/graphql/resolvers/channel-capabilities.js.map +1 -0
- package/lib/graphql/resolvers/channel-member.d.ts +3 -3
- package/lib/graphql/resolvers/channel-member.js +30 -5
- package/lib/graphql/resolvers/channel-member.js.map +1 -1
- package/lib/graphql/resolvers/channel.d.ts +3 -3
- package/lib/graphql/resolvers/channel.js +348 -55
- package/lib/graphql/resolvers/channel.js.map +1 -1
- package/lib/graphql/resolvers/chat-configuration.d.ts +59 -0
- package/lib/graphql/resolvers/chat-configuration.js +89 -0
- package/lib/graphql/resolvers/chat-configuration.js.map +1 -0
- package/lib/graphql/resolvers/extended-token-account.d.ts +3 -32
- package/lib/graphql/resolvers/extended-token-account.js +90 -23
- package/lib/graphql/resolvers/extended-token-account.js.map +1 -1
- package/lib/graphql/resolvers/gateway.d.ts +18 -0
- package/lib/graphql/resolvers/index.d.ts +47 -26
- package/lib/graphql/resolvers/index.js +1 -1
- package/lib/graphql/resolvers/index.js.map +1 -1
- package/lib/graphql/resolvers/post-thread.d.ts +2 -3
- package/lib/graphql/resolvers/post-thread.js +294 -132
- package/lib/graphql/resolvers/post-thread.js.map +1 -1
- package/lib/graphql/resolvers/post.d.ts +2 -3
- package/lib/graphql/resolvers/post.js +772 -238
- package/lib/graphql/resolvers/post.js.map +1 -1
- package/lib/graphql/resolvers/reaction.d.ts +3 -3
- package/lib/graphql/resolvers/reaction.js +96 -14
- package/lib/graphql/resolvers/reaction.js.map +1 -1
- package/lib/graphql/resolvers/streaming.d.ts +20 -0
- package/lib/graphql/resolvers/streaming.js +147 -0
- package/lib/graphql/resolvers/streaming.js.map +1 -0
- package/lib/graphql/schema/channel-capabilities.graphql +492 -0
- package/lib/graphql/schema/channel-capabilities.graphql.js +1 -0
- package/lib/graphql/schema/channel-capabilities.graphql.js.map +1 -0
- package/lib/graphql/schema/channel-member.graphql +110 -21
- package/lib/graphql/schema/channel-member.graphql.js +1 -1
- package/lib/graphql/schema/channel.graphql +465 -24
- package/lib/graphql/schema/channel.graphql.js +1 -1
- package/lib/graphql/schema/chat-configuration.graphql +77 -0
- package/lib/graphql/schema/chat-configuration.graphql.js +1 -0
- package/lib/graphql/schema/chat-configuration.graphql.js.map +1 -0
- package/lib/graphql/schema/gateway.graphql +363 -0
- package/lib/graphql/schema/index.js +2 -2
- package/lib/graphql/schema/index.js.map +1 -1
- package/lib/graphql/schema/post-thread.graphql +167 -21
- package/lib/graphql/schema/post-thread.graphql.js +1 -1
- package/lib/graphql/schema/post.graphql +440 -36
- package/lib/graphql/schema/post.graphql.js +1 -1
- package/lib/graphql/schema/preferences.graphql +190 -3
- package/lib/graphql/schema/preferences.graphql.js +1 -1
- package/lib/graphql/schema/reaction.graphql +71 -13
- package/lib/graphql/schema/reaction.graphql.js +1 -1
- package/lib/graphql/schema/services.graphql +18 -0
- package/lib/graphql/schema/streaming.graphql +224 -0
- package/lib/graphql/schema/streaming.graphql.js +1 -0
- package/lib/graphql/schema/streaming.graphql.js.map +1 -0
- package/lib/graphql/schema/users.graphql +76 -13
- package/lib/graphql/schema/users.graphql.js +1 -1
- package/lib/graphql/schema/workflow-service.graphql +82 -0
- package/lib/index.d.ts +3 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/interfaces/index.d.ts +0 -2
- package/lib/interfaces/services.d.ts +1 -3
- package/lib/migrations/dbMigrations/AddChannelConfigurationsMigration.d.ts +42 -0
- package/lib/migrations/dbMigrations/AddChannelConfigurationsMigration.js +60 -0
- package/lib/migrations/dbMigrations/AddChannelConfigurationsMigration.js.map +1 -0
- package/lib/migrations/dbMigrations/AddChatConfigurationsMigration.d.ts +21 -0
- package/lib/migrations/dbMigrations/AddChatConfigurationsMigration.js +30 -0
- package/lib/migrations/dbMigrations/AddChatConfigurationsMigration.js.map +1 -0
- package/lib/migrations/dbMigrations/AddPostsConfigurationsMigration.d.ts +17 -0
- package/lib/migrations/dbMigrations/AddPostsConfigurationsMigration.js +44 -0
- package/lib/migrations/dbMigrations/AddPostsConfigurationsMigration.js.map +1 -0
- package/lib/migrations/dbMigrations/index.d.ts +3 -0
- package/lib/migrations/index.d.ts +1 -0
- package/lib/migrations/mail-template-migration.d.ts +3 -6
- package/lib/migrations/mail-template-migration.js +8 -21
- package/lib/migrations/mail-template-migration.js.map +1 -1
- package/lib/migrations/message-notification-template-migration.d.ts +4 -7
- package/lib/migrations/message-notification-template-migration.js +8 -25
- package/lib/migrations/message-notification-template-migration.js.map +1 -1
- package/lib/module.d.ts +1 -1
- package/lib/module.js +3 -10
- package/lib/module.js.map +1 -1
- package/lib/plugins/ChannelMoleculerService.d.ts +39 -0
- package/lib/plugins/ChannelMoleculerService.js +58 -0
- package/lib/plugins/ChannelMoleculerService.js.map +1 -0
- package/lib/plugins/ExtendedTokenAccountMoleculerService.d.ts +65 -0
- package/lib/plugins/ExtendedTokenAccountMoleculerService.js +88 -0
- package/lib/plugins/ExtendedTokenAccountMoleculerService.js.map +1 -0
- package/lib/plugins/MessengerNotificationMoleculerService.d.ts +52 -0
- package/lib/plugins/MessengerNotificationMoleculerService.js +84 -0
- package/lib/plugins/MessengerNotificationMoleculerService.js.map +1 -0
- package/lib/plugins/PostMoleculerService.d.ts +65 -0
- package/lib/plugins/PostMoleculerService.js +87 -0
- package/lib/plugins/PostMoleculerService.js.map +1 -0
- package/lib/plugins/PostThreadMoleculerService.d.ts +40 -0
- package/lib/plugins/PostThreadMoleculerService.js +59 -0
- package/lib/plugins/PostThreadMoleculerService.js.map +1 -0
- package/lib/plugins/ReactionMoleculerService.d.ts +37 -0
- package/lib/plugins/ReactionMoleculerService.js +56 -0
- package/lib/plugins/ReactionMoleculerService.js.map +1 -0
- package/lib/plugins/index.d.ts +18 -6
- package/lib/preferences/permissions/inbox-permission-contribution.js +58 -97
- package/lib/preferences/permissions/inbox-permission-contribution.js.map +1 -1
- package/lib/preferences/permissions/inbox-roles-permission-overwrite.js +144 -144
- package/lib/preferences/permissions/inbox-roles-permission-overwrite.js.map +1 -1
- package/lib/preferences/settings/channel-settings.d.ts +39 -0
- package/lib/preferences/settings/channel-settings.js +180 -0
- package/lib/preferences/settings/channel-settings.js.map +1 -0
- package/lib/preferences/settings/chat-settings.d.ts +248 -0
- package/lib/preferences/settings/chat-settings.js +1152 -0
- package/lib/preferences/settings/chat-settings.js.map +1 -0
- package/lib/preferences/settings/index.d.ts +3 -0
- package/lib/preferences/settings/messenger-channels-contribution.d.ts +39 -0
- package/lib/preferences/settings/messenger-channels-contribution.js +355 -0
- package/lib/preferences/settings/messenger-channels-contribution.js.map +1 -0
- package/lib/preferences/settings/post-settings.d.ts +16 -0
- package/lib/preferences/settings/post-settings.js +75 -3
- package/lib/preferences/settings/post-settings.js.map +1 -1
- package/lib/services/channel-service.d.ts +215 -34
- package/lib/services/channel-service.js +1058 -273
- package/lib/services/channel-service.js.map +1 -1
- package/lib/services/extended-token-account-service.d.ts +175 -20
- package/lib/services/extended-token-account-service.js +636 -56
- package/lib/services/extended-token-account-service.js.map +1 -1
- package/lib/services/messenger-notification-service.d.ts +177 -17
- package/lib/services/messenger-notification-service.js +975 -421
- package/lib/services/messenger-notification-service.js.map +1 -1
- package/lib/services/post-service.d.ts +245 -18
- package/lib/services/post-service.js +1027 -113
- package/lib/services/post-service.js.map +1 -1
- package/lib/services/post-thread-service.d.ts +153 -6
- package/lib/services/post-thread-service.js +475 -9
- package/lib/services/post-thread-service.js.map +1 -1
- package/lib/services/proxy-services/ChannelProxyService.d.ts +27 -0
- package/lib/services/proxy-services/ChannelProxyService.js +31 -0
- package/lib/services/proxy-services/ChannelProxyService.js.map +1 -0
- package/lib/services/proxy-services/ExtendedTokenAccountProxyService.d.ts +42 -0
- package/lib/services/proxy-services/ExtendedTokenAccountProxyService.js +46 -0
- package/lib/services/proxy-services/ExtendedTokenAccountProxyService.js.map +1 -0
- package/lib/services/proxy-services/MessengerNotificationProxyService.d.ts +44 -0
- package/lib/services/proxy-services/MessengerNotificationProxyService.js +54 -0
- package/lib/services/proxy-services/MessengerNotificationProxyService.js.map +1 -0
- package/lib/services/proxy-services/PostProxyService.d.ts +42 -0
- package/lib/services/proxy-services/PostProxyService.js +46 -0
- package/lib/services/proxy-services/PostProxyService.js.map +1 -0
- package/lib/services/proxy-services/PostThreadProxyService.d.ts +32 -0
- package/lib/services/proxy-services/PostThreadProxyService.js +36 -0
- package/lib/services/proxy-services/PostThreadProxyService.js.map +1 -0
- package/lib/services/proxy-services/ReactionProxyService.d.ts +41 -0
- package/lib/services/proxy-services/ReactionProxyService.js +45 -0
- package/lib/services/proxy-services/ReactionProxyService.js.map +1 -0
- package/lib/services/proxy-services/index.d.ts +17 -5
- package/lib/services/reaction-service.d.ts +124 -4
- package/lib/services/reaction-service.js +413 -3
- package/lib/services/reaction-service.js.map +1 -1
- package/lib/store/models/account-token-store.d.ts +1 -1
- package/lib/store/models/account-token-store.js.map +1 -1
- package/lib/store/models/channel.d.ts +2 -3
- package/lib/store/models/channel.js +216 -70
- package/lib/store/models/channel.js.map +1 -1
- package/lib/store/models/post-thread.d.ts +3 -3
- package/lib/store/models/post-thread.js +96 -14
- package/lib/store/models/post-thread.js.map +1 -1
- package/lib/store/models/post.d.ts +2 -3
- package/lib/store/models/post.js +143 -23
- package/lib/store/models/post.js.map +1 -1
- package/lib/store/models/reaction.d.ts +2 -3
- package/lib/store/models/reaction.js +67 -8
- package/lib/store/models/reaction.js.map +1 -1
- package/lib/store/repositories/__tests__/__fixtures__/team-repository.d.ts +3 -3
- package/lib/store/repositories/channel-repository.d.ts +6 -6
- package/lib/store/repositories/channel-repository.js +5 -2
- package/lib/store/repositories/channel-repository.js.map +1 -1
- package/lib/store/repositories/post-repository.d.ts +6 -6
- package/lib/store/repositories/post-repository.js +5 -2
- package/lib/store/repositories/post-repository.js.map +1 -1
- package/lib/store/repositories/post-thread-repository.d.ts +6 -6
- package/lib/store/repositories/post-thread-repository.js +5 -2
- package/lib/store/repositories/post-thread-repository.js.map +1 -1
- package/lib/store/repositories/reaction-repository.d.ts +6 -6
- package/lib/store/repositories/reaction-repository.js +5 -2
- package/lib/store/repositories/reaction-repository.js.map +1 -1
- package/lib/streaming/block-chunker.d.ts +40 -0
- package/lib/streaming/block-chunker.js +103 -0
- package/lib/streaming/block-chunker.js.map +1 -0
- package/lib/streaming/block-chunker.test.d.ts +1 -0
- package/lib/streaming/index.d.ts +4 -0
- package/lib/streaming/stream-service.d.ts +71 -0
- package/lib/streaming/stream-service.js +325 -0
- package/lib/streaming/stream-service.js.map +1 -0
- package/lib/streaming/stream-service.test.d.ts +16 -0
- package/lib/streaming/streaming-post.integration.test.d.ts +10 -0
- package/lib/streaming/types.d.ts +33 -0
- package/lib/streaming/types.js +37 -0
- package/lib/streaming/types.js.map +1 -0
- package/lib/templates/constants/CONTRIBUTION_POINTS.ts.template +78 -0
- package/lib/templates/constants/SERVER_TYPES.ts.template +1 -4
- package/lib/templates/constants/WorkflowNamespace.ts.template +10 -0
- package/lib/templates/repositories/ChannelRepository.ts.template +3 -3
- package/lib/templates/repositories/PostRepository.ts.template +3 -3
- package/lib/templates/repositories/PostThreadRepository.ts.template +3 -3
- package/lib/templates/repositories/ReactionRepository.ts.template +3 -4
- package/lib/templates/services/ChannelService.ts.template +290 -39
- package/lib/templates/services/ExtendedTokenAccountService.ts.template +107 -3
- package/lib/templates/services/MessengerNotificationService.ts.template +94 -19
- package/lib/templates/services/MessengerStreamService.ts.template +131 -0
- package/lib/templates/services/PostService.ts.template +228 -20
- package/lib/templates/services/PostThreadService.ts.template +151 -6
- package/lib/templates/services/ReactionService.ts.template +129 -3
- package/lib/templates/services/RedisCacheManager.ts.template +22 -0
- package/package.json +10 -6
- package/lib/interfaces/context.d.ts +0 -14
- package/lib/plugins/channel-moleculer-service.d.ts +0 -8
- package/lib/plugins/channel-moleculer-service.js +0 -129
- package/lib/plugins/channel-moleculer-service.js.map +0 -1
- package/lib/plugins/extended-token-account-moleculer-service.d.ts +0 -8
- package/lib/plugins/extended-token-account-moleculer-service.js +0 -47
- package/lib/plugins/extended-token-account-moleculer-service.js.map +0 -1
- package/lib/plugins/messenger-notification-moleculer-service.d.ts +0 -9
- package/lib/plugins/messenger-notification-moleculer-service.js +0 -116
- package/lib/plugins/messenger-notification-moleculer-service.js.map +0 -1
- package/lib/plugins/post-moleculer-service.d.ts +0 -35
- package/lib/plugins/post-moleculer-service.js +0 -393
- package/lib/plugins/post-moleculer-service.js.map +0 -1
- package/lib/plugins/post-thread-moleculer-service.d.ts +0 -8
- package/lib/plugins/post-thread-moleculer-service.js +0 -33
- package/lib/plugins/post-thread-moleculer-service.js.map +0 -1
- package/lib/plugins/reaction-moleculer-service.d.ts +0 -8
- package/lib/plugins/reaction-moleculer-service.js +0 -20
- package/lib/plugins/reaction-moleculer-service.js.map +0 -1
- package/lib/services/proxy-services/channel-microservice.d.ts +0 -44
- package/lib/services/proxy-services/channel-microservice.js +0 -199
- package/lib/services/proxy-services/channel-microservice.js.map +0 -1
- package/lib/services/proxy-services/messenger-notification-microservice.d.ts +0 -16
- package/lib/services/proxy-services/messenger-notification-microservice.js +0 -54
- package/lib/services/proxy-services/messenger-notification-microservice.js.map +0 -1
- package/lib/services/proxy-services/post-microservice.d.ts +0 -22
- package/lib/services/proxy-services/post-microservice.js +0 -64
- package/lib/services/proxy-services/post-microservice.js.map +0 -1
- package/lib/services/proxy-services/post-thread-microservice.d.ts +0 -10
- package/lib/services/proxy-services/post-thread-microservice.js +0 -15
- package/lib/services/proxy-services/post-thread-microservice.js.map +0 -1
- package/lib/services/proxy-services/reaction-microservice.d.ts +0 -9
- package/lib/services/proxy-services/reaction-microservice.js +0 -10
- package/lib/services/proxy-services/reaction-microservice.js.map +0 -1
- package/lib/store/models/common-options.js +0 -20
- package/lib/store/models/common-options.js.map +0 -1
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Types — External messaging channel provider interfaces.
|
|
3
|
+
*
|
|
4
|
+
* Designed Go-portable: no Inversify decorators, no Mongoose, no Moleculer.
|
|
5
|
+
* Every interface maps 1:1 to a Go interface. Uses plain constructors,
|
|
6
|
+
* explicit error returns, and typed queues (via EventEmitter or NATS topics).
|
|
7
|
+
*
|
|
8
|
+
* Architecture mapping:
|
|
9
|
+
* openclaw → ChannelProvider / ChannelAccountManager → this file
|
|
10
|
+
* picoclaw → pkg/channels/channel.go → this file
|
|
11
|
+
* clockbook → BOT_TYPES.IChannelRegistry → this file
|
|
12
|
+
*
|
|
13
|
+
* Channel extensions register providers via `contributes.channels` in their
|
|
14
|
+
* package.json and call `channels.registerProvider()` during activation.
|
|
15
|
+
*/
|
|
16
|
+
import type { IChannelCapabilities, IChannelDock, IChannelAccountSnapshot, IChannelStatusIssue } from '../channels/types';
|
|
17
|
+
/** Provider lifecycle state */
|
|
18
|
+
export type ProviderState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';
|
|
19
|
+
/** Direction of a message relative to the gateway */
|
|
20
|
+
export type MessageDirection = 'inbound' | 'outbound';
|
|
21
|
+
/** Media attachment type */
|
|
22
|
+
export type MediaType = 'image' | 'audio' | 'video' | 'document' | 'sticker' | 'location' | 'contact';
|
|
23
|
+
export interface IMediaAttachment {
|
|
24
|
+
type: MediaType;
|
|
25
|
+
url?: string;
|
|
26
|
+
/** Raw bytes (base64 in JSON, []byte in Go) */
|
|
27
|
+
data?: string;
|
|
28
|
+
mimeType?: string;
|
|
29
|
+
filename?: string;
|
|
30
|
+
caption?: string;
|
|
31
|
+
/** Duration in seconds (audio/video) */
|
|
32
|
+
durationSec?: number;
|
|
33
|
+
/** Thumbnail URL or base64 */
|
|
34
|
+
thumbnail?: string;
|
|
35
|
+
}
|
|
36
|
+
/** An inbound message from an external channel into the gateway */
|
|
37
|
+
export interface IInboundMessage {
|
|
38
|
+
/** Unique message ID from the external platform */
|
|
39
|
+
externalId: string;
|
|
40
|
+
/** Channel provider identifier (e.g. 'whatsapp', 'telegram') */
|
|
41
|
+
channelType: string;
|
|
42
|
+
/** Account ID within the channel provider */
|
|
43
|
+
accountId: string;
|
|
44
|
+
/** Sender identifier on the external platform */
|
|
45
|
+
senderId: string;
|
|
46
|
+
/** Sender display name */
|
|
47
|
+
senderName?: string;
|
|
48
|
+
/** Chat/conversation identifier on the external platform */
|
|
49
|
+
chatId: string;
|
|
50
|
+
/** Chat type */
|
|
51
|
+
chatType?: 'direct' | 'group' | 'channel';
|
|
52
|
+
/** Text content */
|
|
53
|
+
text?: string;
|
|
54
|
+
/** Media attachments */
|
|
55
|
+
media?: IMediaAttachment[];
|
|
56
|
+
/** Whether this is a reply to another message */
|
|
57
|
+
replyToExternalId?: string;
|
|
58
|
+
/** Unix timestamp in ms */
|
|
59
|
+
timestamp: number;
|
|
60
|
+
/** Raw payload from the external platform (for debugging/passthrough) */
|
|
61
|
+
raw?: Record<string, unknown>;
|
|
62
|
+
}
|
|
63
|
+
/** An outbound message from the gateway to an external channel */
|
|
64
|
+
export interface IOutboundMessage {
|
|
65
|
+
/** Channel provider identifier */
|
|
66
|
+
channelType: string;
|
|
67
|
+
/** Account ID within the channel provider */
|
|
68
|
+
accountId: string;
|
|
69
|
+
/** Target chat/conversation identifier */
|
|
70
|
+
chatId: string;
|
|
71
|
+
/** Text content */
|
|
72
|
+
text?: string;
|
|
73
|
+
/** Media attachments */
|
|
74
|
+
media?: IMediaAttachment[];
|
|
75
|
+
/** Reply to a specific external message ID */
|
|
76
|
+
replyToExternalId?: string;
|
|
77
|
+
/** Arbitrary metadata */
|
|
78
|
+
metadata?: Record<string, unknown>;
|
|
79
|
+
}
|
|
80
|
+
/** Result of sending an outbound message */
|
|
81
|
+
export interface ISendResult {
|
|
82
|
+
success: boolean;
|
|
83
|
+
/** External message ID assigned by the platform */
|
|
84
|
+
externalId?: string;
|
|
85
|
+
/** Error message if failed */
|
|
86
|
+
error?: string;
|
|
87
|
+
/** Timestamp of delivery (Unix ms) */
|
|
88
|
+
timestamp?: number;
|
|
89
|
+
}
|
|
90
|
+
/** Configuration schema for a channel provider (declared in contributes.channels) */
|
|
91
|
+
export interface IChannelProviderConfig {
|
|
92
|
+
/** Unique provider type identifier (e.g. 'whatsapp', 'telegram') */
|
|
93
|
+
type: string;
|
|
94
|
+
/** Human-readable label */
|
|
95
|
+
label: string;
|
|
96
|
+
/** Provider description */
|
|
97
|
+
description?: string;
|
|
98
|
+
/** Icon name or URL */
|
|
99
|
+
icon?: string;
|
|
100
|
+
/** Provider capabilities */
|
|
101
|
+
capabilities: IChannelCapabilities;
|
|
102
|
+
/** Dock (outbound constraints, streaming, threading config) */
|
|
103
|
+
dock?: Partial<IChannelDock>;
|
|
104
|
+
/** JSON Schema for provider-specific configuration (API keys, tokens, etc.) */
|
|
105
|
+
configSchema?: Record<string, unknown>;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* IExternalChannelProvider — the interface that channel extensions implement.
|
|
109
|
+
*
|
|
110
|
+
* Each extension contributes one provider. The gateway discovers providers
|
|
111
|
+
* via `contributes.channels` in the extension manifest and calls
|
|
112
|
+
* `channels.registerProvider(provider)` during extension activation.
|
|
113
|
+
*
|
|
114
|
+
* Go mapping:
|
|
115
|
+
* type ChannelProvider interface {
|
|
116
|
+
* Type() string
|
|
117
|
+
* Connect(ctx context.Context, accountId string, config map[string]any) error
|
|
118
|
+
* Disconnect(ctx context.Context, accountId string) error
|
|
119
|
+
* Send(ctx context.Context, msg OutboundMessage) (SendResult, error)
|
|
120
|
+
* State(accountId string) ProviderState
|
|
121
|
+
* OnMessage(handler func(InboundMessage))
|
|
122
|
+
* }
|
|
123
|
+
*/
|
|
124
|
+
export interface IExternalChannelProvider {
|
|
125
|
+
/** Provider type identifier (e.g. 'whatsapp') */
|
|
126
|
+
readonly type: string;
|
|
127
|
+
/** Provider configuration */
|
|
128
|
+
readonly config: IChannelProviderConfig;
|
|
129
|
+
/**
|
|
130
|
+
* Connect an account to the external platform.
|
|
131
|
+
* @param accountId - Unique account identifier
|
|
132
|
+
* @param options - Provider-specific connection options (API keys, session data, etc.)
|
|
133
|
+
* @param signal - AbortSignal for cancellation (Go: context.Context)
|
|
134
|
+
*/
|
|
135
|
+
connect(accountId: string, options: Record<string, unknown>, signal?: AbortSignal): Promise<void>;
|
|
136
|
+
/**
|
|
137
|
+
* Disconnect an account from the external platform.
|
|
138
|
+
* @param accountId - Account to disconnect
|
|
139
|
+
*/
|
|
140
|
+
disconnect(accountId: string): Promise<void>;
|
|
141
|
+
/**
|
|
142
|
+
* Send a message to the external platform.
|
|
143
|
+
* @param message - Outbound message to send
|
|
144
|
+
* @returns Send result with external ID on success
|
|
145
|
+
*/
|
|
146
|
+
send(message: IOutboundMessage): Promise<ISendResult>;
|
|
147
|
+
/**
|
|
148
|
+
* Get the current connection state for an account.
|
|
149
|
+
* @param accountId - Account identifier
|
|
150
|
+
*/
|
|
151
|
+
getState(accountId: string): ProviderState;
|
|
152
|
+
/**
|
|
153
|
+
* Get a snapshot of account status (connection info, last message times, etc.)
|
|
154
|
+
* @param accountId - Account identifier
|
|
155
|
+
*/
|
|
156
|
+
getAccountSnapshot(accountId: string): IChannelAccountSnapshot | undefined;
|
|
157
|
+
/**
|
|
158
|
+
* Get any status issues (config problems, auth failures, etc.)
|
|
159
|
+
* @param accountId - Account identifier
|
|
160
|
+
*/
|
|
161
|
+
getStatusIssues(accountId: string): IChannelStatusIssue[];
|
|
162
|
+
/**
|
|
163
|
+
* Register a handler for inbound messages.
|
|
164
|
+
* The gateway calls this once during provider registration.
|
|
165
|
+
* @param handler - Callback invoked for each inbound message
|
|
166
|
+
*/
|
|
167
|
+
onMessage(handler: (message: IInboundMessage) => void): void;
|
|
168
|
+
/**
|
|
169
|
+
* Register a handler for provider state changes.
|
|
170
|
+
* @param handler - Callback invoked when connection state changes
|
|
171
|
+
*/
|
|
172
|
+
onStateChange?(handler: (accountId: string, state: ProviderState) => void): void;
|
|
173
|
+
/**
|
|
174
|
+
* Dispose all resources. Called when the extension is deactivated.
|
|
175
|
+
*/
|
|
176
|
+
dispose(): Promise<void>;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* IExternalChannelRegistry — tracks all registered external channel providers.
|
|
180
|
+
*
|
|
181
|
+
* Providers register themselves via extension activation; the gateway looks
|
|
182
|
+
* them up by type when routing messages.
|
|
183
|
+
*
|
|
184
|
+
* Go mapping:
|
|
185
|
+
* type ChannelRegistry struct { providers map[string]ChannelProvider }
|
|
186
|
+
*/
|
|
187
|
+
export interface IExternalChannelRegistry {
|
|
188
|
+
/** Register a channel provider (called during extension activation) */
|
|
189
|
+
register(provider: IExternalChannelProvider): void;
|
|
190
|
+
/** Unregister a channel provider (called during extension deactivation) */
|
|
191
|
+
unregister(providerType: string): void;
|
|
192
|
+
/** Get a provider by type */
|
|
193
|
+
get(providerType: string): IExternalChannelProvider | undefined;
|
|
194
|
+
/** List all registered provider types */
|
|
195
|
+
listTypes(): string[];
|
|
196
|
+
/** List all providers with their configs */
|
|
197
|
+
listProviders(): IChannelProviderConfig[];
|
|
198
|
+
/** Check if a provider type is registered */
|
|
199
|
+
has(providerType: string): boolean;
|
|
200
|
+
}
|
|
201
|
+
/** Gateway status for a single provider/account pair */
|
|
202
|
+
export interface IGatewayChannelStatus {
|
|
203
|
+
channelType: string;
|
|
204
|
+
accountId: string;
|
|
205
|
+
state: ProviderState;
|
|
206
|
+
label: string;
|
|
207
|
+
snapshot?: IChannelAccountSnapshot;
|
|
208
|
+
issues: IChannelStatusIssue[];
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* IGatewayService — the top-level gateway orchestrator.
|
|
212
|
+
*
|
|
213
|
+
* Owns the channel registry, routes inbound messages to the platform,
|
|
214
|
+
* and dispatches outbound messages to the correct provider.
|
|
215
|
+
*
|
|
216
|
+
* Go mapping:
|
|
217
|
+
* type GatewayService struct {
|
|
218
|
+
* registry *ChannelRegistry
|
|
219
|
+
* router *MessageRouter
|
|
220
|
+
* eventBus *nats.Conn
|
|
221
|
+
* }
|
|
222
|
+
*/
|
|
223
|
+
export interface IGatewayService {
|
|
224
|
+
/** Initialize the gateway (called once at startup) */
|
|
225
|
+
initialize(): Promise<void>;
|
|
226
|
+
/** Shut down the gateway gracefully */
|
|
227
|
+
shutdown(): Promise<void>;
|
|
228
|
+
/** Get the channel registry */
|
|
229
|
+
getRegistry(): IExternalChannelRegistry;
|
|
230
|
+
/** Connect an account on a specific channel */
|
|
231
|
+
connectChannel(channelType: string, accountId: string, options: Record<string, unknown>): Promise<void>;
|
|
232
|
+
/** Disconnect an account on a specific channel */
|
|
233
|
+
disconnectChannel(channelType: string, accountId: string): Promise<void>;
|
|
234
|
+
/** Send an outbound message via the appropriate provider */
|
|
235
|
+
sendMessage(message: IOutboundMessage): Promise<ISendResult>;
|
|
236
|
+
/** Get status for all connected channels/accounts */
|
|
237
|
+
getStatus(): IGatewayChannelStatus[];
|
|
238
|
+
/** Get status for a specific channel type */
|
|
239
|
+
getChannelStatus(channelType: string): IGatewayChannelStatus[];
|
|
240
|
+
/**
|
|
241
|
+
* Register a handler for inbound messages (gateway → platform).
|
|
242
|
+
* The resolver/microservice uses this to feed messages into the platform.
|
|
243
|
+
*/
|
|
244
|
+
onInboundMessage(handler: (message: IInboundMessage) => void): void;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* IMessageRouterService — routes inbound messages to the messenger platform.
|
|
248
|
+
*
|
|
249
|
+
* Sits between external channel providers and the platform's channel/post
|
|
250
|
+
* services. Translates IInboundMessage into platform Post creation.
|
|
251
|
+
*
|
|
252
|
+
* Go mapping:
|
|
253
|
+
* type MessageRouter struct { channelSvc ChannelService; postSvc PostService }
|
|
254
|
+
*/
|
|
255
|
+
export interface IMessageRouterService {
|
|
256
|
+
/** Route an inbound message to the platform */
|
|
257
|
+
routeInbound(message: IInboundMessage): Promise<void>;
|
|
258
|
+
/** Route an outbound message from the platform to the external channel */
|
|
259
|
+
routeOutbound(message: IOutboundMessage): Promise<ISendResult>;
|
|
260
|
+
}
|
|
261
|
+
/** Topic for gateway inbound messages */
|
|
262
|
+
export declare const GATEWAY_INBOUND_TOPIC = "GATEWAY_INBOUND";
|
|
263
|
+
/** Topic for gateway outbound messages */
|
|
264
|
+
export declare const GATEWAY_OUTBOUND_TOPIC = "GATEWAY_OUTBOUND";
|
|
265
|
+
/** Topic for gateway channel status changes */
|
|
266
|
+
export declare const GATEWAY_STATUS_TOPIC = "GATEWAY_STATUS";
|
|
267
|
+
/** Build a scoped topic for a specific channel type */
|
|
268
|
+
export declare function gatewayInboundTopic(channelType: string): string;
|
|
269
|
+
export declare function gatewayOutboundTopic(channelType: string): string;
|
|
270
|
+
export declare function gatewayStatusTopic(channelType: string): string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel Capabilities Resolver
|
|
3
|
+
*
|
|
4
|
+
* Handles GraphQL queries, mutations, and subscriptions for
|
|
5
|
+
* the openclaw-inspired channel capabilities system.
|
|
6
|
+
*
|
|
7
|
+
* All channel feature configuration lives in Channel.settings
|
|
8
|
+
* (schema driven by ChannelSettings preferences). The resolver
|
|
9
|
+
* reads/writes through that single field.
|
|
10
|
+
*/
|
|
11
|
+
import { IResolverOptions } from '@common-stack/server-core';
|
|
12
|
+
import { IResolvers } from 'common/server';
|
|
13
|
+
export declare const channelCapabilitiesResolvers: (options: IResolverOptions) => IResolvers;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import {listChannelDocks,listChannelTypes,normalizeChannelTypeId,getChannelTypeMeta,getChannelCapabilities,getChannelDock}from'../../channels/registry.js';import {TYPING_SUBSCRIPTION_TOPIC}from'../../channels/typing.js';import {validateSenderIdentity}from'../../channels/sender-identity.js';import {resolveAllowlistMatch}from'../../channels/allowlist-match.js';import'../../constants/default-channel-props.js';const PRESENCE_CHANGED_TOPIC = 'PRESENCE_CHANGED';
|
|
2
|
+
const channelCapabilitiesResolvers = options => ({
|
|
3
|
+
Query: {
|
|
4
|
+
channelCapabilities: (_, args) => {
|
|
5
|
+
options.logger.trace('(Query.channelCapabilities) channelType [%s]', args.channelType);
|
|
6
|
+
const typeId = normalizeChannelTypeId(args.channelType);
|
|
7
|
+
if (!typeId) return null;
|
|
8
|
+
return getChannelCapabilities(typeId);
|
|
9
|
+
},
|
|
10
|
+
channelTypeMeta: (_, args) => {
|
|
11
|
+
options.logger.trace('(Query.channelTypeMeta) channelType [%s]', args.channelType);
|
|
12
|
+
const typeId = normalizeChannelTypeId(args.channelType);
|
|
13
|
+
if (!typeId) return null;
|
|
14
|
+
return getChannelTypeMeta(typeId);
|
|
15
|
+
},
|
|
16
|
+
channelDock: (_, args) => {
|
|
17
|
+
options.logger.trace('(Query.channelDock) channelType [%s]', args.channelType);
|
|
18
|
+
const typeId = normalizeChannelTypeId(args.channelType);
|
|
19
|
+
if (!typeId) return null;
|
|
20
|
+
const dock = getChannelDock(typeId);
|
|
21
|
+
return {
|
|
22
|
+
id: dock.id,
|
|
23
|
+
capabilities: dock.capabilities,
|
|
24
|
+
textChunkLimit: dock.outbound?.textChunkLimit,
|
|
25
|
+
threading: dock.threading
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
availableChannelTypes: () => {
|
|
29
|
+
options.logger.trace('(Query.availableChannelTypes)');
|
|
30
|
+
return listChannelTypes();
|
|
31
|
+
},
|
|
32
|
+
availableChannelDocks: () => {
|
|
33
|
+
options.logger.trace('(Query.availableChannelDocks)');
|
|
34
|
+
return listChannelDocks().map(dock => ({
|
|
35
|
+
id: dock.id,
|
|
36
|
+
capabilities: dock.capabilities,
|
|
37
|
+
textChunkLimit: dock.outbound?.textChunkLimit,
|
|
38
|
+
threading: dock.threading
|
|
39
|
+
}));
|
|
40
|
+
},
|
|
41
|
+
checkAllowlist: (_, args) => {
|
|
42
|
+
options.logger.trace('(Query.checkAllowlist) channelId [%s], senderId [%s]', args.channelId, args.senderId);
|
|
43
|
+
// In a full implementation, load the channel then read allowlist from settings:
|
|
44
|
+
// const channel = await channelService.get(args.channelId);
|
|
45
|
+
// const allowlistSettings = getChannelSetting(channel, 'allowlist');
|
|
46
|
+
// For now, return allow-all.
|
|
47
|
+
return resolveAllowlistMatch({
|
|
48
|
+
allowFrom: ['*'],
|
|
49
|
+
senderId: args.senderId,
|
|
50
|
+
senderName: args.senderName,
|
|
51
|
+
senderEmail: args.senderEmail
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
validateSender: (_, args) => {
|
|
55
|
+
options.logger.trace('(Query.validateSender) senderId [%s]', args.senderId);
|
|
56
|
+
const issues = validateSenderIdentity({
|
|
57
|
+
chatType: args.chatType,
|
|
58
|
+
senderId: args.senderId,
|
|
59
|
+
senderName: args.senderName,
|
|
60
|
+
senderUsername: args.senderUsername,
|
|
61
|
+
senderEmail: args.senderEmail
|
|
62
|
+
});
|
|
63
|
+
return {
|
|
64
|
+
valid: issues.length === 0,
|
|
65
|
+
issues
|
|
66
|
+
};
|
|
67
|
+
},
|
|
68
|
+
channelPresence: (_, args) => {
|
|
69
|
+
options.logger.trace('(Query.channelPresence) channelId [%s]', args.channelId);
|
|
70
|
+
// Placeholder: would query active presence from Redis/in-memory store
|
|
71
|
+
return [];
|
|
72
|
+
},
|
|
73
|
+
typingUsers: (_, args) => {
|
|
74
|
+
options.logger.trace('(Query.typingUsers) channelId [%s]', args.channelId);
|
|
75
|
+
// Placeholder: would query active typing users from Redis/in-memory store
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
Mutation: {
|
|
80
|
+
sendTypingIndicator: async (_, args, context) => {
|
|
81
|
+
const userId = context.userContext?.userId || context.user?.id;
|
|
82
|
+
options.logger.trace('(Mutation.sendTypingIndicator) channelId [%s], userId [%s], action [%s]', args.channelId, userId, args.action);
|
|
83
|
+
if (!userId) return false;
|
|
84
|
+
const event = {
|
|
85
|
+
userId,
|
|
86
|
+
channelId: args.channelId,
|
|
87
|
+
threadId: args.threadId,
|
|
88
|
+
action: args.action,
|
|
89
|
+
timestamp: new Date()
|
|
90
|
+
};
|
|
91
|
+
try {
|
|
92
|
+
if (!options.pubsub) {
|
|
93
|
+
options.logger.error('PubSub not available for sendTypingIndicator');
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
await options.pubsub.publish(`${TYPING_SUBSCRIPTION_TOPIC}:${args.channelId}`, {
|
|
97
|
+
typingIndicator: event
|
|
98
|
+
});
|
|
99
|
+
return true;
|
|
100
|
+
} catch (error) {
|
|
101
|
+
options.logger.error('Error publishing typing indicator: %o', error);
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
updatePresence: async (_, args, context) => {
|
|
106
|
+
const userId = context.userContext?.userId || context.user?.id;
|
|
107
|
+
options.logger.trace('(Mutation.updatePresence) userId [%s], status [%s]', userId, args.status);
|
|
108
|
+
const presence = {
|
|
109
|
+
userId,
|
|
110
|
+
status: args.status,
|
|
111
|
+
statusMessage: args.statusMessage,
|
|
112
|
+
statusEmoji: args.statusEmoji,
|
|
113
|
+
lastActiveAt: new Date(),
|
|
114
|
+
expiresAt: args.expiresAt
|
|
115
|
+
};
|
|
116
|
+
try {
|
|
117
|
+
if (!options.pubsub) {
|
|
118
|
+
options.logger.error('PubSub not available for updatePresence');
|
|
119
|
+
return presence;
|
|
120
|
+
}
|
|
121
|
+
await options.pubsub.publish(PRESENCE_CHANGED_TOPIC, {
|
|
122
|
+
presenceChanged: presence
|
|
123
|
+
});
|
|
124
|
+
return presence;
|
|
125
|
+
} catch (error) {
|
|
126
|
+
options.logger.error('Error publishing presence update: %o', error);
|
|
127
|
+
return presence;
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
toggleAckReaction: async (_, args, _context) => {
|
|
131
|
+
options.logger.trace('(Mutation.toggleAckReaction) postId [%s], emoji [%s]', args.postId, args.emoji);
|
|
132
|
+
// In a full implementation:
|
|
133
|
+
// 1. Load the post
|
|
134
|
+
// 2. Read/write ackReaction inside post.props (via PostTypes.ackReaction key)
|
|
135
|
+
// 3. Check channel.settings.ackReaction for gating rules
|
|
136
|
+
return true;
|
|
137
|
+
},
|
|
138
|
+
updateChannelNotifyProps: async (_, args, _context) => {
|
|
139
|
+
options.logger.trace('(Mutation.updateChannelNotifyProps) channelId [%s]', args.channelId);
|
|
140
|
+
// In a full implementation:
|
|
141
|
+
// 1. Load the channel
|
|
142
|
+
// 2. Merge args into channel.settings (typing, ackReaction sub-keys)
|
|
143
|
+
// 3. Save channel
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
Subscription: {
|
|
148
|
+
typingIndicator: {
|
|
149
|
+
subscribe: (_, args) => {
|
|
150
|
+
options.logger.trace('(Subscription.typingIndicator) channelId [%s], threadId [%s]', args.channelId, args.threadId);
|
|
151
|
+
try {
|
|
152
|
+
if (!options.pubsub) {
|
|
153
|
+
options.logger.error('PubSub not available for subscription');
|
|
154
|
+
throw new Error('PubSub not configured');
|
|
155
|
+
}
|
|
156
|
+
return options.pubsub.asyncIterator([`${TYPING_SUBSCRIPTION_TOPIC}:${args.channelId}`]);
|
|
157
|
+
} catch (error) {
|
|
158
|
+
options.logger.error('Error setting up typingIndicator subscription: %o', error);
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
presenceChanged: {
|
|
164
|
+
subscribe: (_, _args) => {
|
|
165
|
+
options.logger.trace('(Subscription.presenceChanged)');
|
|
166
|
+
try {
|
|
167
|
+
if (!options.pubsub) {
|
|
168
|
+
options.logger.error('PubSub not available for subscription');
|
|
169
|
+
throw new Error('PubSub not configured');
|
|
170
|
+
}
|
|
171
|
+
return options.pubsub.asyncIterator([PRESENCE_CHANGED_TOPIC]);
|
|
172
|
+
} catch (error) {
|
|
173
|
+
options.logger.error('Error setting up presenceChanged subscription: %o', error);
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
});export{channelCapabilitiesResolvers};//# sourceMappingURL=channel-capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-capabilities.js","sources":["../../../src/graphql/resolvers/channel-capabilities.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
export declare const channelMemberResolvers: () => IResolvers
|
|
1
|
+
import { IResolverOptions } from '@common-stack/server-core';
|
|
2
|
+
import { IResolvers } from 'common/server';
|
|
3
|
+
export declare const channelMemberResolvers: (options: IResolverOptions) => IResolvers;
|
|
@@ -1,16 +1,41 @@
|
|
|
1
|
-
const channelMemberResolvers =
|
|
1
|
+
const channelMemberResolvers = options => ({
|
|
2
2
|
Channel: {
|
|
3
3
|
creator(src, args, {
|
|
4
|
-
accountService
|
|
4
|
+
accountService,
|
|
5
|
+
accountUserDataLoader
|
|
5
6
|
}) {
|
|
6
|
-
|
|
7
|
+
options.logger.trace('(Channel.creator) src.creator [%s]', src.creator);
|
|
8
|
+
// Check if creator exists and is not null/undefined before calling service
|
|
9
|
+
if (!src.creator || src.creator === null || src.creator === undefined) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return accountUserDataLoader.load(src.creator.toString());
|
|
7
13
|
}
|
|
8
14
|
},
|
|
9
15
|
ChannelMember: {
|
|
16
|
+
id(src) {
|
|
17
|
+
// Handle both virtual 'id' and MongoDB '_id' fields
|
|
18
|
+
const memberId = src.id || src._id;
|
|
19
|
+
if (!memberId) {
|
|
20
|
+
// If neither exists, generate an id based on user and other properties
|
|
21
|
+
// This ensures we always have a unique identifier
|
|
22
|
+
if (src.user) {
|
|
23
|
+
return `${src.user.toString()}-${src.createdAt || Date.now()}`;
|
|
24
|
+
}
|
|
25
|
+
throw new Error('ChannelMember id is required but not provided');
|
|
26
|
+
}
|
|
27
|
+
return memberId.toString();
|
|
28
|
+
},
|
|
10
29
|
user(src, args, {
|
|
11
|
-
accountService
|
|
30
|
+
accountService,
|
|
31
|
+
accountUserDataLoader
|
|
12
32
|
}) {
|
|
13
|
-
|
|
33
|
+
options.logger.trace('(ChannelMember.user) src.user [%s]', src.user);
|
|
34
|
+
// Check if user exists and is not null/undefined before calling service
|
|
35
|
+
if (!src.user || src.user === null || src.user === undefined) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return accountUserDataLoader.load(src.user.toString());
|
|
14
39
|
}
|
|
15
40
|
},
|
|
16
41
|
Query: {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-member.js","sources":["../../../src/graphql/resolvers/channel-member.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"channel-member.js","sources":["../../../src/graphql/resolvers/channel-member.ts"],"sourcesContent":[null],"names":[],"mappings":"MAIa,sBAAsB,GAAG,OAAC,KAAyC;AAC5E,EAAA,OAAA,EAAO;WACH,CAAA,GAAO,MAAM,EAAA;oBACD;;AAGR,KAAA,EAAA;AACI,MAAA,OAAA,CAAA,MAAA,CAAA,MAAW,oCAAC,EAAA,GAAA,CAAA,OAAA,CAAA;;cAGhB,CAAA,OAAO,IAAA,GAAA,CAAA,OAAA,KAAsB,IAAK,IAAI,GAAA,CAAA,OAAQ,KAAQ,SAAwC,EAAA;QAClG,OAAC,IAAA;AACJ,MAAA;AACD,MAAA,OAAA,qBAAe,CAAA,IAAA,CAAA,GAAA,CAAA,OAAA,CAAA,QAAA,EAAA,CAAA;AACX,IAAA;;eAEI,EAAA;YACA;;oBAEI,GAAA,GAAA,CAAA,EAAA,IAAA,GAAA,CAAA,GAAA;AACA,MAAA,IAAA,CAAA,QAAA,EAAI;AACA;;AAEJ,QAAA,IAAA,GAAA,CAAA,IAAA,EAAM;iBACT,CAAA,EAAA,GAAA,CAAA,IAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA,GAAA,CAAA,SAAA,IAAA,IAAA,CAAA,GAAA,EAAA,CAAA,CAAA;AACD,QAAA;QACJ,MAAC,IAAA,KAAA,CAAA,+CAAA,CAAA;;aAEG,QAAQ,CAAA,QAAO,EAAK;;AAGpB,IAAA,IAAA,CAAA,GAAA,EAAA,IAAK,EAAG;AACJ,MAAA,cAAA;;;aAIP,CAAA,MAAA,CAAA,KAAA,CAAA,oCAAA,EAAA,GAAA,CAAA,IAAA,CAAA;AACJ;AACD,MAAA,KAAO,GAAE,CAAA,IAAA,IAAA,GAAA,CAAA,IAAA,KAAA,IAAA,IAAA,GAAA,CAAA,IAAA,KAAA,SAAA,EAAA;AACT,QAAA,OAAU,IAAE;AACf,MAAE;;;;;;"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
export declare const channelResolvers: () => IResolvers
|
|
1
|
+
import { IResolverOptions } from '@common-stack/server-core';
|
|
2
|
+
import { IResolvers } from 'common/server';
|
|
3
|
+
export declare const channelResolvers: (options: IResolverOptions) => IResolvers;
|