From a0a40b52d5a7c86d2490a1be75e413a1c6b0ed3e Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Sat, 21 Feb 2026 10:59:07 +0330 Subject: [PATCH] request populate --- .../request/interface/request.interface.ts | 2 +- src/modules/request/request.module.ts | 2 ++ src/modules/request/request.service.ts | 32 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/modules/request/interface/request.interface.ts b/src/modules/request/interface/request.interface.ts index d008669..545c6b9 100644 --- a/src/modules/request/interface/request.interface.ts +++ b/src/modules/request/interface/request.interface.ts @@ -1,3 +1,3 @@ export interface IAttachment { type: string, url: string } -export interface IField { fieldId: number, value: string } \ No newline at end of file +export interface IField { fieldId: string; value: string } \ No newline at end of file diff --git a/src/modules/request/request.module.ts b/src/modules/request/request.module.ts index 8ad8c4e..495af42 100644 --- a/src/modules/request/request.module.ts +++ b/src/modules/request/request.module.ts @@ -7,6 +7,7 @@ import { RequestItem } from './entities/request-item.entity'; import { RequestRepository } from './repositories/request.repository'; import { UserModule } from '../user/user.module'; import { ProductModule } from '../product/product.module'; +import { FormBuilderModule } from '../form-builder/form-builder.module'; import { AuthModule } from '../auth/auth.module'; import { JwtModule } from '@nestjs/jwt'; @@ -15,6 +16,7 @@ import { JwtModule } from '@nestjs/jwt'; MikroOrmModule.forFeature([Request, RequestItem]), UserModule, ProductModule, + FormBuilderModule, JwtModule, AuthModule ], diff --git a/src/modules/request/request.service.ts b/src/modules/request/request.service.ts index 4a4c738..370eddb 100644 --- a/src/modules/request/request.service.ts +++ b/src/modules/request/request.service.ts @@ -8,6 +8,7 @@ import { RequestItem } from './entities/request-item.entity'; import { RequestStatusEnum } from './enum/request'; import { UserService } from '../user/providers/user.service'; import { ProductService } from '../product/providers/product.service'; +import { FieldRepository } from '../form-builder/repository/field.repository'; import { RequestRepository } from './repositories/request.repository'; @Injectable() @@ -17,6 +18,7 @@ export class RequestService { private readonly requestRepository: RequestRepository, private readonly userService: UserService, private readonly productService: ProductService, + private readonly fieldRepository: FieldRepository, ) { } async create(createRequestDto: CreateRequestDto, userId: string) { @@ -65,6 +67,8 @@ export class RequestService { if (!request) { throw new NotFoundException('Request not found'); } + + await this.enrichItemsWithFields(request.items.getItems()); return request; } @@ -76,9 +80,37 @@ export class RequestService { if (!request) { throw new NotFoundException('Request not found'); } + await this.enrichItemsWithFields(request.items.getItems()); return request; } + private async enrichItemsWithFields(items: RequestItem[]) { + const fieldIds = [ + ...new Set( + items + .flatMap((item) => item.attributes ?? []) + .map((attr) => String(attr.fieldId)) + .filter(Boolean), + ), + ]; + if (fieldIds.length === 0) return; + + const fields = await this.fieldRepository.find( + { id: { $in: fieldIds } }, + { populate: ['options'] }, + ); + const fieldMap = new Map(fields.map((f) => [f.id, f])); + + for (const item of items) { + if (!item.attributes?.length) continue; + const enrichedAttributes = item.attributes.map((attr) => ({ + ...attr, + field: fieldMap.get(String(attr.fieldId)) ?? null, + })); + (item as unknown as { attributes: typeof enrichedAttributes }).attributes = enrichedAttributes; + } + } + async update(id: string, updateRequestDto: UpdateRequestDto, userId: string) { const request = await this.requestRepository.findOne( { id, user: { id: userId } },