import { Injectable } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Types, Model } from 'mongoose'; import { Build, BuildDocument } from '@/models/build.model'; import { CreateBuildInput } from './dto/create-build.input'; import { UpdateBuildAttributeInput, UpdateBuildResponsibleInput } from './dto/update-build.input'; import { ListBuildResponse } from './dto/list-build.response'; @Injectable() export class BuildService { constructor(@InjectModel(Build.name) private readonly buildModel: Model) { } async findAll(projection: any, skip: number, limit: number, sort?: Record, filters?: Record): Promise { const query: any = {}; if (filters && Object.keys(filters).length > 0) { Object.assign(query, filters) }; const totalCount = await this.buildModel.countDocuments(query).exec(); const data = await this.buildModel.find(query).skip(skip).limit(limit).sort(sort).exec(); return { data, totalCount }; } async findById(id: Types.ObjectId, projection?: any): Promise { return this.buildModel.findById(id, projection, { lean: false }).populate({ path: 'buildArea', select: projection?.buildArea }).exec(); } async create(input: CreateBuildInput): Promise { const buildArea = new this.buildModel(input); return buildArea.save() } async updateResponsible(uuid: string, input: UpdateBuildResponsibleInput): Promise { const build = await this.buildModel.findOne({ uuid }); if (!build) { throw new Error('Build not found') }; build.set({ responsible: input }); return build.save() } async updateAttribute(uuid: string, input: UpdateBuildAttributeInput): Promise { const build = await this.buildModel.findOne({ uuid }); if (!build) { throw new Error('Build not found') }; build.set({ attribute: input }); return build.save() } buildProjection(fields: Record): any { const projection: any = {}; for (const key in fields) { if (key === 'build' && typeof fields[key] === 'object') { for (const subField of Object.keys(fields[key])) { projection[`build.${subField}`] = 1 } } else { projection[key] = 1 } } return projection; } }