From a8d58f18bb68e4cd4e3a97526af11eb800fb9fc3 Mon Sep 17 00:00:00 2001 From: Kristina Date: Fri, 29 Aug 2025 09:05:47 +0400 Subject: [PATCH] Fix query (#99) Signed-off-by: Kristina Fefelova --- packages/query/src/messages/query.ts | 29 ++++++++++++++++++++++++---- packages/query/src/types.ts | 2 ++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/packages/query/src/messages/query.ts b/packages/query/src/messages/query.ts index 9a0f673a82..97cc634960 100644 --- a/packages/query/src/messages/query.ts +++ b/packages/query/src/messages/query.ts @@ -21,20 +21,20 @@ import { type MessagesGroup, type ParsedFile, type Patch, + PatchType, SortingOrder, - type WorkspaceID, - PatchType + type WorkspaceID } from '@hcengineering/communication-types' import { + CardEventType, type CreateMessageEvent, type CreateMessageResult, + type Event, type EventResult, type FindClient, MessageEventType, type PagedQueryCallback, - type Event, PatchEvent, - CardEventType, RemoveCardEvent } from '@hcengineering/communication-sdk-types' import { applyPatches, MessageProcessor } from '@hcengineering/communication-shared' @@ -195,6 +195,7 @@ export class MessagesQuery implements PagedQuery { async onCreateMessageRequest (event: CreateMessageEvent, promise: Promise): Promise { if (this.params.card !== event.cardId) return + if (this.params.strict === true) return const eventId = event._id if (eventId == null || event.socialId == null) return @@ -701,6 +702,7 @@ export class MessagesQuery implements PagedQuery { private async find (params: FindMessagesParams): Promise { delete (params as any).from + delete (params as any).strict return await this.client.findMessages(params, this.id) } @@ -736,6 +738,7 @@ export class MessagesQuery implements PagedQuery { private async onMessageCreatedEvent (event: CreateMessageEvent): Promise { if (this.params.card !== event.cardId || event.messageId == null) return if (this.result instanceof Promise) this.result = await this.result + let message = MessageProcessor.createFromEvent(event) const exists = this.result.get(message.id) @@ -747,6 +750,24 @@ export class MessagesQuery implements PagedQuery { message = this.patchMessage(message) + if (this.params.strict === true && this.params.limit != null && this.result.length >= this.params.limit) { + this.result.unshift(message) + this.result.sort((a, b) => + this.params.order === SortingOrder.Ascending + ? a.created.getTime() - b.created.getTime() + : b.created.getTime() - a.created.getTime() + ) + if (this.params.order === SortingOrder.Descending && this.result.length > this.params.limit) { + this.result.pop() + } else if (this.params.order === SortingOrder.Ascending && this.result.length > this.params.limit) { + this.result.shift() + } + + await this.notify() + + return + } + if (this.result.isTail()) { const eventId = event._id if (eventId != null) { diff --git a/packages/query/src/types.ts b/packages/query/src/types.ts index 25201d3793..0dae53f32a 100644 --- a/packages/query/src/types.ts +++ b/packages/query/src/types.ts @@ -97,12 +97,14 @@ interface BaseMessageQueryParams { export interface ManyMessagesQueryParams extends BaseMessageQueryParams { from?: Date + strict?: boolean } export interface OneMessageQueryParams extends BaseMessageQueryParams { id: MessageID created: Date from?: never + strict?: never } export type MessageQueryParams = OneMessageQueryParams | ManyMessagesQueryParams