diff --git a/apps/worker/src/whatsapp/group-sync.test.ts b/apps/worker/src/whatsapp/group-sync.test.ts new file mode 100644 index 0000000..c5a4d18 --- /dev/null +++ b/apps/worker/src/whatsapp/group-sync.test.ts @@ -0,0 +1,99 @@ +import { syncGroups } from './group-sync'; +import { GroupMetadata } from '@whiskeysockets/baileys'; + +const mockGroups: Record = { + '120363043312345678@g.us': { + id: '120363043312345678@g.us', + subject: 'UP Parivar Dallas', + desc: 'Main community group', + participants: [], + creation: 0, + owner: undefined, + restrict: false, + announce: false, + subjectOwner: undefined, + subjectTime: 0, + size: 0, + ephemeralDuration: 0, + inviteCode: undefined, + }, + '999999999@g.us': { + id: '999999999@g.us', + subject: 'Events Committee', + desc: undefined, + participants: [], + creation: 0, + owner: undefined, + restrict: false, + announce: false, + subjectOwner: undefined, + subjectTime: 0, + size: 0, + ephemeralDuration: 0, + inviteCode: undefined, + }, +}; + +const mockPrisma = { + group: { + upsert: jest.fn(), + }, +}; + +describe('syncGroups', () => { + beforeEach(() => jest.clearAllMocks()); + + it('upserts each group and returns jid→id map', async () => { + mockPrisma.group.upsert + .mockResolvedValueOnce({ id: 'db-group-1' }) + .mockResolvedValueOnce({ id: 'db-group-2' }); + + const result = await syncGroups(mockGroups, mockPrisma as any); + + expect(mockPrisma.group.upsert).toHaveBeenCalledTimes(2); + expect(result.get('120363043312345678@g.us')).toBe('db-group-1'); + expect(result.get('999999999@g.us')).toBe('db-group-2'); + }); + + it('calls upsert with correct create payload', async () => { + mockPrisma.group.upsert.mockResolvedValue({ id: 'db-group-1' }); + + await syncGroups( + { '120363043312345678@g.us': mockGroups['120363043312345678@g.us'] }, + mockPrisma as any, + ); + + expect(mockPrisma.group.upsert).toHaveBeenCalledWith({ + where: { platform_platformId: { platform: 'whatsapp', platformId: '120363043312345678@g.us' } }, + create: { + platform: 'whatsapp', + platformId: '120363043312345678@g.us', + name: 'UP Parivar Dallas', + description: 'Main community group', + isActive: true, + }, + update: { name: 'UP Parivar Dallas', description: 'Main community group' }, + }); + }); + + it('handles groups with no description', async () => { + mockPrisma.group.upsert.mockResolvedValue({ id: 'db-group-2' }); + + await syncGroups( + { '999999999@g.us': mockGroups['999999999@g.us'] }, + mockPrisma as any, + ); + + expect(mockPrisma.group.upsert).toHaveBeenCalledWith( + expect.objectContaining({ + create: expect.objectContaining({ description: undefined }), + }), + ); + }); + + it('returns an empty map when given empty groups', async () => { + const result = await syncGroups({}, mockPrisma as any); + expect(result.size).toBe(0); + expect(mockPrisma.group.upsert).not.toHaveBeenCalled(); + }); +}); diff --git a/apps/worker/src/whatsapp/group-sync.ts b/apps/worker/src/whatsapp/group-sync.ts new file mode 100644 index 0000000..9198f63 --- /dev/null +++ b/apps/worker/src/whatsapp/group-sync.ts @@ -0,0 +1,25 @@ +import { GroupMetadata } from '@whiskeysockets/baileys'; + +export async function syncGroups( + groups: Record, + prisma: any, +): Promise> { + const jidToDbId = new Map(); + + for (const [jid, meta] of Object.entries(groups)) { + const group = await prisma.group.upsert({ + where: { platform_platformId: { platform: 'whatsapp', platformId: jid } }, + create: { + platform: 'whatsapp', + platformId: jid, + name: meta.subject, + description: meta.desc ?? undefined, + isActive: true, + }, + update: { name: meta.subject, description: meta.desc ?? undefined }, + }); + jidToDbId.set(jid, group.id); + } + + return jidToDbId; +}