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'; import { groupBy, values } from 'lodash'; const log = Log.child({ module: 'grpc', service: 'Buyer', method: 'replace', }); export async function replace(request: Buyer.ReplaceRequest): 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 removed_count = 0; let created_count = 0; try { const grouped_dnc = groupBy(request.dncs, 'company_id'); const result = await map(Object.keys(grouped_dnc), async (company_id) => { const dncs = grouped_dnc[company_id]; const deleted = await DB.DNC.scope({ method: ['buyer', company_id] }).destroy(); const created = await DB.DNC.scope({ method: ['buyer', company_id] }).bulkCreate( dncs.map((dnc) => ({ phone_number: dnc.phone_number, company_id: dnc.company_id, })) ); return { deleted, created: created.length }; }); const summed_result = result.reduce( (acc, result) => { acc.created_count += result.created; acc.removed_count += result.deleted; return acc; }, { removed_count: 0, created_count: 0 } ); removed_count = summed_result.removed_count; created_count = summed_result.created_count; } catch (err) { log.error('Failed to replace DNC', err); } log.info('Removed %d records and inserted %d records in their place', removed_count, created_count); return { removed_count, }; }