import { groupBy } from 'lodash'; import { map } from 'modern-async'; import { Log } from 'lib/Log'; import { DB } from 'lib/DB'; import { ServerError, Status } from 'nice-grpc'; import type { Buyer } from '@nextgenleads/dnc'; const log = Log.child({ module: 'grpc', service: 'Buyer', method: 'append', }); export async function append(request: Buyer.AppendRequest): Promise { if (!Array.isArray(request.dncs) || !request.dncs.every((dnc) => dnc.phone_number && dnc.company_id)) { throw new ServerError(Status.INVALID_ARGUMENT, 'Missing required argument'); } let created_count = 0; let duplicate_count = 0; try { const results = await map(request.dncs, async (dnc) => { const [record, created] = await DB.DNC.scope({ method: ['buyer', dnc.company_id] }).upsert({ company_id: dnc.company_id, phone_number: dnc.phone_number, }); let created_count = 0; let duplicate_count = 0; if (!created) { await DB.Duplicate.create({ DNCId: record.id, }); duplicate_count += 1; } else { created_count += 1; } return { company_id: dnc.company_id, created_count, duplicate_count }; }); Object.keys(groupBy(results, 'company_id')).forEach((company_id) => { const counts = results.reduce( (acc, result) => { acc.created_count += result.created_count; acc.duplicate_count += result.duplicate_count; return acc; }, { created_count: 0, duplicate_count: 0 } ); created_count += counts.created_count; duplicate_count += counts.duplicate_count; log.info('Appended %d records to company %s dnc (%d duplicates)', created_count, company_id, duplicate_count); }); } catch (err) { log.error('Failed to append to DNC', err); } return { duplicate_count, created_count, }; }