diff --git a/packages/core/src/storage/__tests__/DidCommMessageRepository.test.ts b/packages/core/src/storage/__tests__/DidCommMessageRepository.test.ts index 261ae4000b..13b4a10e3e 100644 --- a/packages/core/src/storage/__tests__/DidCommMessageRepository.test.ts +++ b/packages/core/src/storage/__tests__/DidCommMessageRepository.test.ts @@ -51,6 +51,37 @@ describe('Repository', () => { expect(invitation).toBeInstanceOf(ConnectionInvitationMessage) }) }) + describe('findAgentMessage()', () => { + it('should get the record using the storage service', async () => { + const record = getRecord({ id: 'test-id' }) + mockFunction(storageMock.findByQuery).mockReturnValue(Promise.resolve([record])) + + const invitation = await repository.findAgentMessage({ + messageClass: ConnectionInvitationMessage, + associatedRecordId: '04a2c382-999e-4de9-a1d2-9dec0b2fa5e4', + }) + + expect(storageMock.findByQuery).toBeCalledWith(DidCommMessageRecord, { + associatedRecordId: '04a2c382-999e-4de9-a1d2-9dec0b2fa5e4', + messageType: 'https://didcomm.org/connections/1.0/invitation', + }) + expect(invitation).toBeInstanceOf(ConnectionInvitationMessage) + }) + it("should return null because the record doesn't exist", async () => { + mockFunction(storageMock.findByQuery).mockReturnValue(Promise.resolve([])) + + const invitation = await repository.findAgentMessage({ + messageClass: ConnectionInvitationMessage, + associatedRecordId: '04a2c382-999e-4de9-a1d2-9dec0b2fa5e4', + }) + + expect(storageMock.findByQuery).toBeCalledWith(DidCommMessageRecord, { + associatedRecordId: '04a2c382-999e-4de9-a1d2-9dec0b2fa5e4', + messageType: 'https://didcomm.org/connections/1.0/invitation', + }) + expect(invitation).toBeNull() + }) + }) describe('saveAgentMessage()', () => { it('should transform and save the agent message', async () => { @@ -69,4 +100,34 @@ describe('Repository', () => { ) }) }) + + describe('saveOrUpdateAgentMessage()', () => { + it('should transform and save the agent message', async () => { + mockFunction(storageMock.findByQuery).mockReturnValue(Promise.resolve([])) + await repository.saveOrUpdateAgentMessage({ + role: DidCommMessageRole.Receiver, + agentMessage: JsonTransformer.fromJSON(invitationJson, ConnectionInvitationMessage), + associatedRecordId: '04a2c382-999e-4de9-a1d2-9dec0b2fa5e4', + }) + + expect(storageMock.save).toBeCalledWith( + expect.objectContaining({ + role: DidCommMessageRole.Receiver, + message: invitationJson, + associatedRecordId: '04a2c382-999e-4de9-a1d2-9dec0b2fa5e4', + }) + ) + }) + it('should transform and update the agent message', async () => { + const record = getRecord({ id: 'test-id' }) + mockFunction(storageMock.findByQuery).mockReturnValue(Promise.resolve([record])) + await repository.saveOrUpdateAgentMessage({ + role: DidCommMessageRole.Receiver, + agentMessage: JsonTransformer.fromJSON(invitationJson, ConnectionInvitationMessage), + associatedRecordId: '04a2c382-999e-4de9-a1d2-9dec0b2fa5e4', + }) + + expect(storageMock.update).toBeCalledWith(record) + }) + }) }) diff --git a/packages/core/src/storage/didcomm/DidCommMessageRepository.ts b/packages/core/src/storage/didcomm/DidCommMessageRepository.ts index cdfac5f645..09adace896 100644 --- a/packages/core/src/storage/didcomm/DidCommMessageRepository.ts +++ b/packages/core/src/storage/didcomm/DidCommMessageRepository.ts @@ -26,6 +26,22 @@ export class DidCommMessageRepository extends Repository { await this.save(didCommMessageRecord) } + public async saveOrUpdateAgentMessage(options: SaveAgentMessageOptions) { + const record = await this.findSingleByQuery({ + associatedRecordId: options.associatedRecordId, + messageType: options.agentMessage.type, + }) + + if (record) { + record.message = options.agentMessage.toJSON() as JsonObject + record.role = options.role + await this.update(record) + return + } + + await this.saveAgentMessage(options) + } + public async getAgentMessage({ associatedRecordId, messageClass, @@ -37,6 +53,17 @@ export class DidCommMessageRepository extends Repository { return record.getMessageInstance(messageClass) } + public async findAgentMessage({ + associatedRecordId, + messageClass, + }: GetAgentMessageOptions): Promise | null> { + const record = await this.findSingleByQuery({ + associatedRecordId, + messageType: messageClass.type, + }) + + return record?.getMessageInstance(messageClass) ?? null + } } export interface SaveAgentMessageOptions {