import { ID, InboxViewId } from './Conversation'; export declare const CONVERSATION_SUBSCRIPTIONS_COLLECTION = "conversation_subscriptions"; export declare const USER_INBOX_ITEMS_COLLECTION = "user_inbox_items"; export declare const USER_INBOX_COUNTERS_COLLECTION = "user_inbox_counters"; export declare const INBOX_PROCESSOR_RECEIPTS_COLLECTION = "inbox_processor_receipts"; /** * MongoDB indexes for conversation_subscriptions. * * The unique index enforces one current subscription state per * user/conversation. The follower index resolves the active followers that * InboxAudienceResolver receives as input. */ export declare const CONVERSATION_SUBSCRIPTION_INDEXES: readonly [{ readonly name: "uq_subscription_user_conversation"; readonly key: { readonly spaceId: 1; readonly userId: 1; readonly conversationId: 1; }; readonly unique: true; }, { readonly name: "ix_subscription_conversation_followers"; readonly key: { readonly spaceId: 1; readonly conversationId: 1; readonly status: 1; readonly userId: 1; }; }]; /** * MongoDB indexes for user_inbox_items. * * views.viewId is the only array field in each compound index. Do not add * views.visibilityReasons to these indexes: MongoDB compound multikey indexes * must not combine multiple array paths. */ export declare const USER_INBOX_ITEM_INDEXES: readonly [{ readonly name: "uq_inbox_item_user_conversation"; readonly key: { readonly spaceId: 1; readonly userId: 1; readonly conversationId: 1; }; readonly unique: true; }, { readonly name: "ix_inbox_view_activity"; readonly key: { readonly spaceId: 1; readonly userId: 1; readonly 'views.viewId': 1; readonly pinned: -1; readonly sortAt: -1; readonly id: -1; }; }, { readonly name: "ix_inbox_view_priority"; readonly key: { readonly spaceId: 1; readonly userId: 1; readonly 'views.viewId': 1; readonly pinned: -1; readonly priorityScore: -1; readonly sortAt: -1; readonly id: -1; }; }, { readonly name: "ix_inbox_view_status_activity"; readonly key: { readonly spaceId: 1; readonly userId: 1; readonly 'views.viewId': 1; readonly 'snapshot.status': 1; readonly sortAt: -1; readonly id: -1; }; }, { readonly name: "ix_inbox_view_queue_activity"; readonly key: { readonly spaceId: 1; readonly userId: 1; readonly 'views.viewId': 1; readonly 'snapshot.queueId': 1; readonly sortAt: -1; readonly id: -1; }; }]; /** * MongoDB indexes for user_inbox_counters. * * The unique index also serves reads for all views of a user through its * spaceId + userId prefix. */ export declare const USER_INBOX_COUNTER_INDEXES: readonly [{ readonly name: "uq_inbox_counter_user_view"; readonly key: { readonly spaceId: 1; readonly userId: 1; readonly viewId: 1; }; readonly unique: true; }]; /** * MongoDB indexes for durable processor idempotency receipts. */ export declare const INBOX_PROCESSOR_RECEIPT_INDEXES: readonly [{ readonly name: "uq_inbox_processor_source_scope"; readonly key: { readonly processor: 1; readonly sourceEventId: 1; readonly scopeKey: 1; }; readonly unique: true; }]; export type InboxPaginationSort = 'activity' | 'priority'; /** * Seek-pagination cursor matching ix_inbox_view_activity. */ export interface InboxActivityCursor { sort: 'activity'; pinned: boolean; sortAt: Date; id: ID; } /** * Seek-pagination cursor matching ix_inbox_view_priority. */ export interface InboxPriorityCursor { sort: 'priority'; pinned: boolean; priorityScore: number; sortAt: Date; id: ID; } export type InboxPaginationCursor = InboxActivityCursor | InboxPriorityCursor; /** * Query contract for one logical inbox view. * * Implementations must use seek pagination with cursor; skip pagination is not * compatible with frequently changing sortAt values. */ interface InboxPageQueryBase { spaceId: ID; userId: ID; viewId: InboxViewId; limit: number; } export type InboxPageQuery = InboxPageQueryBase & { sort: 'activity'; cursor?: InboxActivityCursor; } | InboxPageQueryBase & { sort: 'priority'; cursor?: InboxPriorityCursor; }; export {};