Api fixes v5 (#55)

Signed-off-by: Kristina Fefelova <kristin.fefelova@gmail.com>
This commit is contained in:
Kristina
2025-05-21 08:01:49 +04:00
committed by GitHub
parent ec243a8ec8
commit d49cea72f6
8 changed files with 29 additions and 46 deletions
+1 -1
View File
@@ -1 +1 @@
0.1.187
0.1.188
+3 -3
View File
@@ -96,7 +96,7 @@ export class CockroachAdapter implements DbAdapter {
data?: MessageData,
externalId?: string,
id?: MessageID
): Promise<MessageID> {
): Promise<{ id: MessageID; created: Date }> {
return await this.message.createMessage(card, type, content, creator, created, data, externalId, id)
}
@@ -340,9 +340,9 @@ class CockroachClient implements SqlClient {
}
cursor<T = SqlRow>(query: string, params?: SqlParams, size?: number): AsyncIterable<NonNullable<T[][number]>[]> {
const sql = params !== undefined && params.length > 0 ? injectVars(query, params) : query
// const sql = params !== undefined && params.length > 0 ? injectVars(query, params) : query
return this.sql.unsafe<T[]>(sql).cursor(size)
return this.sql.unsafe<T[]>(query, params).cursor(size)
}
close(): void {
+5 -5
View File
@@ -97,14 +97,14 @@ export function connect(connectionString: string, database?: string): PostgresCl
if (existing === undefined) {
const sql = postgres(connectionString, {
connection: {
application_name: 'communication'
},
database,
max: 5,
fetch_types: false,
prepare: false,
...extraOptions
prepare: true,
...extraOptions,
connection: {
application_name: 'communication'
}
})
existing = new PostgresClientReferenceImpl(sql, () => {
+12 -3
View File
@@ -65,7 +65,7 @@ export class MessagesDb extends BaseDb {
data?: MessageData,
externalId?: string,
id?: MessageID
): Promise<MessageID> {
): Promise<{ id: MessageID; created: Date }> {
const db: Omit<MessageDb, 'id'> & { id?: MessageID } = {
type,
workspace_id: this.workspace,
@@ -89,13 +89,22 @@ export class MessagesDb extends BaseDb {
}
const placeholders = keys.map((key, i) => `$${i + 1}::${(messageSchema as any)[key]}`)
const conflictClause =
externalId != null
? `ON CONFLICT (workspace_id, card_id, external_id)
DO UPDATE SET external_id = EXCLUDED.external_id`
: ''
const sql = `INSERT INTO ${TableName.Message} (${keys.join(', ')})
VALUES (${placeholders.join(', ')})
RETURNING id::text`
${conflictClause}
RETURNING id::text, created`
const result = await this.execute(sql, values, 'insert message')
const createdR = new Date(result[0].created)
const idR = result[0].id as MessageID
return result.map((it: any) => it.id)[0]
return { id: idR, created: createdR }
}
async removeMessages(card: CardID, query: RemoveMessageQuery): Promise<MessageID[]> {
+4 -2
View File
@@ -44,8 +44,10 @@ function escape(value: any): string {
return `'${value.replace(/'/g, "''")}'`
case 'bigint':
return value.toString()
case 'object':
return `'${JSON.stringify(value)}'`
case 'object': {
const json = JSON.stringify(value).replace(/'/g, "''")
return `'${json}'`
}
default:
throw new Error(`Unsupported value type: ${typeof value}`)
}
+1 -1
View File
@@ -58,7 +58,7 @@ export interface DbAdapter {
data?: MessageData,
externalId?: string,
id?: MessageID
): Promise<MessageID>
): Promise<{ id: MessageID; created: Date }>
removeMessages(card: CardID, query: RemoveMessageQuery): Promise<MessageID[]>
createPatch(
+3 -8
View File
@@ -36,7 +36,6 @@ import {
type CreateFileEvent,
type CreateLabelEvent,
type CreateMessageEvent,
type CreateMessageResult,
type CreateMessagesGroupEvent,
type CreateNotificationContextEvent,
type CreateNotificationEvent,
@@ -235,7 +234,7 @@ export class DatabaseMiddleware extends BaseMiddleware implements Middleware {
private async createMessage(event: CreateMessageEvent): Promise<Result> {
const created = event.created ?? new Date()
const id = await this.db.createMessage(
const result = await this.db.createMessage(
event.card,
event.messageType,
event.content,
@@ -246,12 +245,12 @@ export class DatabaseMiddleware extends BaseMiddleware implements Middleware {
event.id
)
const message: Message = {
id,
id: result.id,
type: event.messageType,
card: event.card,
content: event.content,
creator: event.creator,
created,
created: result.created,
data: event.data,
externalId: event.externalId,
reactions: [],
@@ -263,10 +262,6 @@ export class DatabaseMiddleware extends BaseMiddleware implements Middleware {
cardType: event.cardType,
message
}
const result: CreateMessageResult = {
id,
created
}
return {
responseEvent,
result
-23
View File
@@ -20,7 +20,6 @@ import {
NotificationRequestEventType,
type RequestEvent
} from '@hcengineering/communication-sdk-types'
import type { CardID } from '@hcengineering/communication-types'
import type { TriggerCtx, TriggerFn, Triggers } from '../types'
@@ -46,15 +45,6 @@ async function removeThreads(ctx: TriggerCtx, event: CardRemovedEvent): Promise<
return []
}
async function removeMessages(ctx: TriggerCtx, event: CardRemovedEvent): Promise<RequestEvent[]> {
await ctx.db.removeMessages(event.card, {})
await ctx.db.removePatches(event.card)
await ctx.db.removeFiles(event.card, {})
await removeMessageGroups(ctx, event.card)
return []
}
async function removeNotificationContexts(ctx: TriggerCtx, event: CardRemovedEvent): Promise<RequestEvent[]> {
const result: RequestEvent[] = []
const contexts = await ctx.db.findNotificationContexts({ card: event.card })
@@ -68,24 +58,11 @@ async function removeNotificationContexts(ctx: TriggerCtx, event: CardRemovedEve
return result
}
async function removeMessageGroups(ctx: TriggerCtx, card: CardID): Promise<void> {
while (true) {
const groups = await ctx.db.findMessagesGroups({ card })
if (groups.length === 0) return
for (const group of groups) {
///TODO: delete blob
await ctx.db.removeMessagesGroup(group.card, group.blobId)
}
}
}
const triggers: Triggers = [
['on_card_type_updates', CardResponseEventType.CardTypeUpdated, onCardTypeUpdates as TriggerFn],
['remove_collaborators_on_card_removed', CardResponseEventType.CardRemoved, removeCollaborators as TriggerFn],
['remove_labels_on_card_removed', CardResponseEventType.CardRemoved, removeLabels as TriggerFn],
['remove_threads_on_card_removed', CardResponseEventType.CardRemoved, removeThreads as TriggerFn],
['remove_messages_on_card_removed', CardResponseEventType.CardRemoved, removeMessages as TriggerFn],
[
'remove_notification_contexts_on_card_removed',
CardResponseEventType.CardRemoved,