diff --git a/common/changes/@hcengineering/communication-cockroach/fix-peers_2025-10-24-13-01.json b/common/changes/@hcengineering/communication-cockroach/fix-peers_2025-10-24-13-01.json new file mode 100644 index 0000000..1e51dbe --- /dev/null +++ b/common/changes/@hcengineering/communication-cockroach/fix-peers_2025-10-24-13-01.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@hcengineering/communication-cockroach", + "comment": "Fix peer create", + "type": "patch" + } + ], + "packageName": "@hcengineering/communication-cockroach" +} \ No newline at end of file diff --git a/common/changes/@hcengineering/communication-sdk-types/fix-peers_2025-10-24-13-01.json b/common/changes/@hcengineering/communication-sdk-types/fix-peers_2025-10-24-13-01.json new file mode 100644 index 0000000..c3ea5b1 --- /dev/null +++ b/common/changes/@hcengineering/communication-sdk-types/fix-peers_2025-10-24-13-01.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@hcengineering/communication-sdk-types", + "comment": "Fix peer create event", + "type": "patch" + } + ], + "packageName": "@hcengineering/communication-sdk-types" +} \ No newline at end of file diff --git a/common/changes/@hcengineering/communication-server/fix-peers_2025-10-24-13-01.json b/common/changes/@hcengineering/communication-server/fix-peers_2025-10-24-13-01.json new file mode 100644 index 0000000..ef3dc11 --- /dev/null +++ b/common/changes/@hcengineering/communication-server/fix-peers_2025-10-24-13-01.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@hcengineering/communication-server", + "comment": "Fix peer create", + "type": "patch" + } + ], + "packageName": "@hcengineering/communication-server" +} \ No newline at end of file diff --git a/packages/cockroach/src/adapter.ts b/packages/cockroach/src/adapter.ts index e598ba3..1c7629f 100644 --- a/packages/cockroach/src/adapter.ts +++ b/packages/cockroach/src/adapter.ts @@ -233,9 +233,10 @@ export class CockroachAdapter implements DbAdapter { kind: PeerKind, value: string, extra: PeerExtra, - date: Date + date: Date, + options?: {newValue?: boolean} ): Promise { - await this.peer.createPeer(workspaceId, cardId, kind, value, extra, date) + await this.peer.createPeer(workspaceId, cardId, kind, value, extra, date, options) } async removePeer (workspaceId: WorkspaceUuid, diff --git a/packages/cockroach/src/db/peer.ts b/packages/cockroach/src/db/peer.ts index b9a6e1d..d102ce8 100644 --- a/packages/cockroach/src/db/peer.ts +++ b/packages/cockroach/src/db/peer.ts @@ -35,7 +35,8 @@ export class PeersDb extends BaseDb { kind: PeerKind, value: string, extra: PeerExtra, - date: Date + date: Date, + options?: { newValue?: boolean } ): Promise { const db: DbModel = { workspace_id: workspaceId, @@ -45,8 +46,22 @@ export class PeersDb extends BaseDb { extra, created: date } - const { sql, values } = this.getInsertSql(Domain.Peer, db, []) - await this.execute(sql, values, 'insert peer') + + if (options?.newValue === true) { + const { sql, values } = this.getInsertSql(Domain.Peer, db, [], { + conflictColumns: ['workspace_id', 'kind', 'value'], + conflictAction: 'DO NOTHING' + }) + const result = await this.execute(sql, values, 'insert peer') + const count = result?.count ?? 0 + + if (count === 0) { + throw Error('Peer value already exists') + } + } else { + const { sql, values } = this.getInsertSql(Domain.Peer, db, []) + await this.execute(sql, values, 'insert peer') + } } async removePeer (workspaceId: WorkspaceUuid, cardId: CardID, kind: PeerKind, value: string): Promise { diff --git a/packages/sdk-types/src/db.ts b/packages/sdk-types/src/db.ts index 51e7aca..43cb1b3 100644 --- a/packages/sdk-types/src/db.ts +++ b/packages/sdk-types/src/db.ts @@ -70,7 +70,8 @@ export interface DbAdapter { kind: PeerKind, value: string, extra: PeerExtra, - date: Date + date: Date, + options?: {newValue?: boolean} ) => Promise removePeer: (workspaceId: WorkspaceUuid, cardId: CardID, diff --git a/packages/sdk-types/src/events/peer.ts b/packages/sdk-types/src/events/peer.ts index b2ac875..0664469 100644 --- a/packages/sdk-types/src/events/peer.ts +++ b/packages/sdk-types/src/events/peer.ts @@ -31,6 +31,9 @@ export interface CreatePeerEvent extends BaseEvent { kind: PeerKind value: string extra?: PeerExtra + options?: { + newValue?: boolean + } date?: Date } diff --git a/packages/server/src/middleware/validate.ts b/packages/server/src/middleware/validate.ts index b2142e1..5e7462c 100644 --- a/packages/server/src/middleware/validate.ts +++ b/packages/server/src/middleware/validate.ts @@ -448,6 +448,11 @@ const CreatePeerEventSchema = BaseEventSchema.extend({ kind: z.string().nonempty(), value: z.string().nonempty(), extra: z.record(z.any()).optional(), + options: z + .object({ + newValue: z.boolean().optional() + }) + .optional(), date: DateSchema }).strict()