45 lines
2.3 KiB
TypeScript
45 lines
2.3 KiB
TypeScript
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<BuildDocument>) { }
|
|
|
|
async findAll(projection: any, skip: number, limit: number, sort?: Record<string, 1 | -1>, filters?: Record<string, any>): Promise<ListBuildResponse> {
|
|
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<BuildDocument | null> {
|
|
return this.buildModel.findById(id, projection, { lean: false }).populate({ path: 'buildArea', select: projection?.buildArea }).exec();
|
|
}
|
|
|
|
async create(input: CreateBuildInput): Promise<BuildDocument> { const buildArea = new this.buildModel(input); return buildArea.save() }
|
|
|
|
async updateResponsible(uuid: string, input: UpdateBuildResponsibleInput): Promise<BuildDocument> {
|
|
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<BuildDocument> {
|
|
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<string, any>): 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;
|
|
}
|
|
|
|
}
|