From 4c1ecafa77503b25b787a2cd8c115b3978840d72 Mon Sep 17 00:00:00 2001 From: Suman991 Date: Mon, 13 Apr 2026 14:09:32 +0530 Subject: [PATCH] one step create form api added --- src/form/dto/create-form.dto.ts | 17 +++++++++ src/form/dto/create-update.dto.ts | 22 ------------ src/form/form.controller.ts | 10 +++--- src/form/form.service.ts | 60 ++++++++++++------------------- src/form/schemas/field.schema.ts | 3 +- 5 files changed, 47 insertions(+), 65 deletions(-) create mode 100644 src/form/dto/create-form.dto.ts delete mode 100644 src/form/dto/create-update.dto.ts diff --git a/src/form/dto/create-form.dto.ts b/src/form/dto/create-form.dto.ts new file mode 100644 index 0000000..0f88ad8 --- /dev/null +++ b/src/form/dto/create-form.dto.ts @@ -0,0 +1,17 @@ +import { ApiPropertyOptional } from "@nestjs/swagger"; +import { IsArray, IsOptional, IsString, ValidateNested } from "class-validator"; +import { CreateFieldDto } from "./create-field.dto"; +import { Type } from "class-transformer"; + +export class CreateFormDto { + @ApiPropertyOptional({ example: 'Customer Feedback Survey' }) + @IsString() + name?: string; + + @ApiPropertyOptional({ type: [CreateFieldDto] }) + @ValidateNested({each:true}) + @Type(() => CreateFieldDto) + @IsArray() + @IsOptional() + fields?: CreateFieldDto[]; +} \ No newline at end of file diff --git a/src/form/dto/create-update.dto.ts b/src/form/dto/create-update.dto.ts deleted file mode 100644 index 8a056d6..0000000 --- a/src/form/dto/create-update.dto.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ApiPropertyOptional } from "@nestjs/swagger"; -import { IsOptional, IsString, ValidateNested } from "class-validator"; -import { CreateFieldDto } from "./create-field.dto"; -import { Type } from "class-transformer"; - -export class CreateUpdateDto { - @ApiPropertyOptional({ example: '550e8400-uuid', description: 'Form ID — omit to create a new form' }) - @IsString() - @IsOptional() - id?: string; - - @ApiPropertyOptional({ example: 'Customer Feedback Survey' }) - @IsString() - @IsOptional() - name?: string; - - @ApiPropertyOptional({ type: CreateFieldDto }) - @ValidateNested() - @Type(() => CreateFieldDto) - @IsOptional() - field?: CreateFieldDto; -} \ No newline at end of file diff --git a/src/form/form.controller.ts b/src/form/form.controller.ts index d602bbc..335712a 100644 --- a/src/form/form.controller.ts +++ b/src/form/form.controller.ts @@ -11,17 +11,17 @@ import { import { FormService } from './form.service'; import { ApiOperation } from '@nestjs/swagger'; import { UpdateFieldDto } from './dto/update-field.dto'; -import { CreateUpdateDto } from './dto/create-update.dto'; import { QueryFormDto } from './dto/query-form.dto'; +import { CreateFormDto } from './dto/create-form.dto'; @Controller('form') export class FormController { constructor(private readonly formService: FormService) {} - @Post('create-or-update') - @ApiOperation({ summary: 'Create Empty Form, Add Field to form' }) - async createOne(@Body() createUpdatedDto: CreateUpdateDto) { - return await this.formService.createOrUpdate(createUpdatedDto); + @Post('create-form') + @ApiOperation({ summary: 'Create a Form'}) + async createOne(@Body() createFormDto:CreateFormDto){ + return await this.formService.createForm(createFormDto) } @Get() diff --git a/src/form/form.service.ts b/src/form/form.service.ts index f1f1235..c29ec70 100644 --- a/src/form/form.service.ts +++ b/src/form/form.service.ts @@ -1,14 +1,18 @@ -import { Injectable, NotFoundException, ServiceUnavailableException } from '@nestjs/common'; +import { + Injectable, + NotFoundException, + ServiceUnavailableException, +} from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Form, FormDocument, Status } from './schemas/form.schema'; import { Model } from 'mongoose'; import { v4 as uuidv4 } from 'uuid'; import { UpdateFieldDto } from './dto/update-field.dto'; -import { CreateUpdateDto } from './dto/create-update.dto'; import { QueryFormDto } from './dto/query-form.dto'; import { FormQueryBuilder } from './helpers/form-query.builder'; import { PaginatedResponse } from 'src/interfaces/paginated-response.interface'; import { LlmService } from 'src/common/services/llm.service'; +import { CreateFormDto } from './dto/create-form.dto'; // Reusable projections const LIST_PROJECTION = { @@ -28,29 +32,12 @@ export class FormService { private llmService: LlmService, ) {} - async createOrUpdate(dto: CreateUpdateDto): Promise
{ - if (!dto.id) { - return this.formModel.create({ - id: uuidv4(), - name: dto.name ?? 'Untitled Form', - }); - } - - const form = await this.formModel.findOne({ id: dto.id }); - if (!form) throw new NotFoundException(`Form ${dto.id} not found`); - - if (!dto.field) return form; // nothing to add, return as-is - - const newField = { id: uuidv4(), ...dto.field }; - - const updatedForm = await this.formModel.findOneAndUpdate( - { id: dto.id }, - { $push: { fields: newField } }, - { new: true, projection: DETAIL_PROJECTION }, - ); - - if (!updatedForm) throw new NotFoundException(`Form ${dto.id} not found`); - return updatedForm; + async createForm(formDto: CreateFormDto): Promise { + const form = await this.formModel.create({ + id: uuidv4(), + ...formDto, + }); + return form; } async findAll(query: QueryFormDto): Promise> { @@ -96,22 +83,21 @@ export class FormService { } async findInterface(formId: string): Promise { - const form = await this.formModel - .findOne({ id: formId, deletedAt: null }) - .select(DETAIL_PROJECTION) - .exec(); + const form = await this.formModel + .findOne({ id: formId, deletedAt: null }) + .select(DETAIL_PROJECTION) + .exec(); - if (!form) throw new NotFoundException(`Form ${formId} not found`); + if (!form) throw new NotFoundException(`Form ${formId} not found`); - try{ - let tsInference=await this.llmService.generateFormInterface(form) - return tsInference - }catch(err){ - throw new ServiceUnavailableException('llm down') + try { + let tsInference = await this.llmService.generateFormInterface(form); + return tsInference; + } catch (err) { + throw new ServiceUnavailableException('llm down'); + } } -} - async updateField( formId: string, fieldId: string, diff --git a/src/form/schemas/field.schema.ts b/src/form/schemas/field.schema.ts index 269fe76..7adf755 100644 --- a/src/form/schemas/field.schema.ts +++ b/src/form/schemas/field.schema.ts @@ -1,5 +1,6 @@ import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; import { Document } from 'mongoose'; +import { v4 as uuidv4 } from 'uuid'; import { PARENT_TYPE_KEYS, INPUT_SUB_TYPE_KEYS } from '../types/field.type'; @@ -9,7 +10,7 @@ export type FieldDocument = Field & Document; @Schema({ timestamps: true }) export class Field { - @Prop({ required: true, unique:true }) + @Prop({ required: true, unique:true, default:()=>uuidv4()}) id!: string; @Prop({ required: true, enum: PARENT_TYPE_KEYS })