import { BadRequestException, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { ScrapItem } from '../entities/scrap-item.entity'; import AppResponse from '@/response/app-response'; @Injectable() export class ScrapItemsService { constructor( @InjectRepository(ScrapItem) readonly scrapItemRepo: Repository, ) {} async upsertScrapItems(items: ScrapItem[]) { if (!items.length) return { inserted: 0, updated: 0 }; // Lấy keys để query bản ghi đã tồn tại const keys = items.map((d) => ({ model: d.model, scrap_config_id: d.scrap_config_id, })); // Tìm các bản ghi đã có trong DB const existingItems = await this.scrapItemRepo.findBy(keys); const toUpdate = []; const toInsert = []; items.forEach((itemData) => { const exist = existingItems.find( (e) => e.model === itemData.model && e.scrap_config_id === itemData.scrap_config_id, ); if (exist) { toUpdate.push({ ...exist, ...itemData, updated_at: new Date(), }); } else { toInsert.push(itemData); } }); // Thực hiện insert if (toInsert.length) { await this.scrapItemRepo.insert(toInsert); } // Thực hiện update if (toUpdate.length) { await this.scrapItemRepo.save(toUpdate); } return { inserted: toInsert.length, updated: toUpdate.length, }; } async upsertScrapItemsRes(items: ScrapItem[]) { const rs = await this.upsertScrapItems(items); if (!rs) throw new BadRequestException(AppResponse.toResponse(null)); return AppResponse.toResponse(rs); } }