|
| 1 | +import { Injectable } from '@nestjs/common'; |
| 2 | +import { InjectRepository } from '@nestjs/typeorm'; |
| 3 | +import { Repository, SelectQueryBuilder } from 'typeorm'; |
| 4 | +import { Asset } from '../assets/asset.entity'; |
| 5 | +import { Inventory } from '../inventory/inventory.entity'; |
| 6 | +import { SearchQueryDto } from './dto/search-query.dto'; |
| 7 | + |
| 8 | +@Injectable() |
| 9 | +export class SearchService { |
| 10 | + constructor( |
| 11 | + @InjectRepository(Asset) private assetRepo: Repository<Asset>, |
| 12 | + @InjectRepository(Inventory) private inventoryRepo: Repository<Inventory>, |
| 13 | + ) {} |
| 14 | + |
| 15 | + async search(dto: SearchQueryDto) { |
| 16 | + const { category, supplier, branch, location, page, limit, sortBy, order } = dto; |
| 17 | + |
| 18 | + // Build query for assets |
| 19 | + let assetQuery = this.assetRepo |
| 20 | + .createQueryBuilder('asset') |
| 21 | + .leftJoinAndSelect('asset.category', 'category') |
| 22 | + .leftJoinAndSelect('asset.supplier', 'supplier') |
| 23 | + .leftJoinAndSelect('asset.branch', 'branch') |
| 24 | + .leftJoinAndSelect('asset.location', 'location'); |
| 25 | + |
| 26 | + if (category) { |
| 27 | + assetQuery.andWhere('category.name ILIKE :category', { category: `%${category}%` }); |
| 28 | + } |
| 29 | + if (supplier) { |
| 30 | + assetQuery.andWhere('supplier.name ILIKE :supplier', { supplier: `%${supplier}%` }); |
| 31 | + } |
| 32 | + if (branch) { |
| 33 | + assetQuery.andWhere('branch.name ILIKE :branch', { branch: `%${branch}%` }); |
| 34 | + } |
| 35 | + if (location) { |
| 36 | + assetQuery.andWhere('location.name ILIKE :location', { location: `%${location}%` }); |
| 37 | + } |
| 38 | + |
| 39 | + if (sortBy) { |
| 40 | + assetQuery.orderBy(`asset.${sortBy}`, order || 'ASC'); |
| 41 | + } |
| 42 | + |
| 43 | + assetQuery.skip((page - 1) * limit).take(limit); |
| 44 | + |
| 45 | + const [assets, totalAssets] = await assetQuery.getManyAndCount(); |
| 46 | + |
| 47 | + // Build query for inventory |
| 48 | + let inventoryQuery = this.inventoryRepo |
| 49 | + .createQueryBuilder('inventory') |
| 50 | + .leftJoinAndSelect('inventory.category', 'category') |
| 51 | + .leftJoinAndSelect('inventory.supplier', 'supplier') |
| 52 | + .leftJoinAndSelect('inventory.branch', 'branch') |
| 53 | + .leftJoinAndSelect('inventory.location', 'location'); |
| 54 | + |
| 55 | + if (category) { |
| 56 | + inventoryQuery.andWhere('category.name ILIKE :category', { category: `%${category}%` }); |
| 57 | + } |
| 58 | + if (supplier) { |
| 59 | + inventoryQuery.andWhere('supplier.name ILIKE :supplier', { supplier: `%${supplier}%` }); |
| 60 | + } |
| 61 | + if (branch) { |
| 62 | + inventoryQuery.andWhere('branch.name ILIKE :branch', { branch: `%${branch}%` }); |
| 63 | + } |
| 64 | + if (location) { |
| 65 | + inventoryQuery.andWhere('location.name ILIKE :location', { location: `%${location}%` }); |
| 66 | + } |
| 67 | + |
| 68 | + if (sortBy) { |
| 69 | + inventoryQuery.orderBy(`inventory.${sortBy}`, order || 'ASC'); |
| 70 | + } |
| 71 | + |
| 72 | + inventoryQuery.skip((page - 1) * limit).take(limit); |
| 73 | + |
| 74 | + const [inventories, totalInventories] = await inventoryQuery.getManyAndCount(); |
| 75 | + |
| 76 | + return { |
| 77 | + assets: { data: assets, total: totalAssets }, |
| 78 | + inventories: { data: inventories, total: totalInventories }, |
| 79 | + }; |
| 80 | + } |
| 81 | +} |
0 commit comments