From 33f6483e2edd152f3eb5e8bd095e8e891b8fb53d Mon Sep 17 00:00:00 2001 From: Mohamed Marrouchi Date: Mon, 12 May 2025 19:12:13 +0100 Subject: [PATCH] fix: avatar update rate --- api/src/chat/services/chat.service.ts | 35 +++++++++++-------- .../chat/services/subscriber.service.spec.ts | 12 +++---- api/src/chat/services/subscriber.service.ts | 7 ++-- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/api/src/chat/services/chat.service.ts b/api/src/chat/services/chat.service.ts index 5ffd2c2d..aad2b7b1 100644 --- a/api/src/chat/services/chat.service.ts +++ b/api/src/chat/services/chat.service.ts @@ -254,6 +254,7 @@ export class ChatService { let subscriber = await this.subscriberService.findOne({ foreign_id: foreignId, }); + if (!subscriber) { const subscriberData = await handler.getSubscriberData(event); subscriberData.channel = event.getChannelData(); @@ -262,6 +263,25 @@ export class ChatService { if (!subscriber) { throw new Error('Unable to create a new subscriber'); } + + // Retrieve and store the subscriber avatar + // @TODO: We need to handle the avatar update (based on the lastvisit?) + if (handler.getSubscriberAvatar) { + try { + const file = await handler.getSubscriberAvatar(event); + if (file) { + subscriber = await this.subscriberService.storeAvatar( + subscriber.id, + file, + ); + } + } catch (err) { + this.logger.error( + `Unable to retrieve avatar for subscriber ${event.getSenderForeignId()}`, + err, + ); + } + } } event.setSender(subscriber); // Exec lastvisit hook @@ -269,21 +289,6 @@ export class ChatService { this.websocketGateway.broadcastSubscriberUpdate(subscriber); - // Retrieve and store the subscriber avatar - if (handler.getSubscriberAvatar) { - try { - const file = await handler.getSubscriberAvatar(event); - if (file) { - await this.subscriberService.storeAvatar(subscriber.id, file); - } - } catch (err) { - this.logger.error( - `Unable to retrieve avatar for subscriber ${event.getSenderForeignId()}`, - err, - ); - } - } - // Set the subscriber object event.setSender(subscriber!); diff --git a/api/src/chat/services/subscriber.service.spec.ts b/api/src/chat/services/subscriber.service.spec.ts index 71cb4f78..01cd353e 100644 --- a/api/src/chat/services/subscriber.service.spec.ts +++ b/api/src/chat/services/subscriber.service.spec.ts @@ -178,11 +178,11 @@ describe('SubscriberService', () => { const fakeAttachment = { id: '9'.repeat(24) } as Attachment; jest.spyOn(attachmentService, 'store').mockResolvedValue(fakeAttachment); - const updateOneSpy = jest - .spyOn(subscriberService, 'updateOne') - .mockResolvedValue(allSubscribers[0]); - await subscriberService.storeAvatar(subscriber.id, avatarPayload); + const result = await subscriberService.storeAvatar( + subscriber.id, + avatarPayload, + ); expect(attachmentService.store).toHaveBeenCalledTimes(1); expect(attachmentService.store).toHaveBeenCalledWith( @@ -198,9 +198,7 @@ describe('SubscriberService', () => { }), ); - expect(updateOneSpy).toHaveBeenCalledWith(subscriber.id, { - avatar: fakeAttachment.id, - }); + expect(result.avatar).toBe(fakeAttachment.id); }); it('should propagate an error from AttachmentService and leave the subscriber unchanged', async () => { diff --git a/api/src/chat/services/subscriber.service.ts b/api/src/chat/services/subscriber.service.ts index ace0892a..11f44f6f 100644 --- a/api/src/chat/services/subscriber.service.ts +++ b/api/src/chat/services/subscriber.service.ts @@ -156,7 +156,10 @@ export class SubscriberService extends BaseService< * * @returns Resolves once the subscriber avatar is stored */ - async storeAvatar(subscriberId: string, avatar: AttachmentFile) { + async storeAvatar( + subscriberId: string, + avatar: AttachmentFile, + ): Promise { const { file, type, size } = avatar; const extension = mime.extension(type); @@ -170,7 +173,7 @@ export class SubscriberService extends BaseService< createdBy: subscriberId, }); - await this.updateOne(subscriberId, { + return await this.updateOne(subscriberId, { avatar: attachment.id, }); }