Compare commits

...

2 Commits

Author SHA1 Message Date
Suman991
62e13e673f added get stat api 2026-04-13 17:43:52 +05:30
Suman991
1f4ddfa10b optimized schema 2026-04-13 16:41:00 +05:30
4 changed files with 43 additions and 8 deletions

View File

@ -30,7 +30,7 @@ export class CreateFieldDto {
@IsOptional() @IsOptional()
placeholder?: string; placeholder?: string;
@ApiPropertyOptional({ type: [String], example: ['Very Satisfied', 'Satisfied'] }) @ApiPropertyOptional({ type: [String], example: ['Very Satisfied', 'Satisfied']})
@IsArray() @IsArray()
@IsString({ each: true }) @IsString({ each: true })
@IsOptional() @IsOptional()

View File

@ -31,11 +31,18 @@ export class FormController {
return this.formService.findAll(query); return this.formService.findAll(query);
} }
@Get('stats')
@ApiOperation({ summary: 'Get Stats' })
async getStats() {
return await this.formService.getStats();
}
@Get(':formId') @Get(':formId')
@ApiOperation({ summary: 'Find a form' }) @ApiOperation({ summary: 'Find a form' })
async find(@Param('formId') formId: string) { async find(@Param('formId') formId: string) {
return await this.formService.find(formId); return await this.formService.find(formId);
} }
@Get(':formId/interface') @Get(':formId/interface')
@ApiOperation({ summary: 'Get interface for the form provided by llm' }) @ApiOperation({ summary: 'Get interface for the form provided by llm' })
async getInterface(@Param('formId') formId: string) { async getInterface(@Param('formId') formId: string) {

View File

@ -14,7 +14,6 @@ import { PaginatedResponse } from 'src/interfaces/paginated-response.interface';
import { LlmService } from 'src/common/services/llm.service'; import { LlmService } from 'src/common/services/llm.service';
import { CreateFormDto } from './dto/create-form.dto'; import { CreateFormDto } from './dto/create-form.dto';
import { CreateFieldDto } from './dto/create-field.dto'; import { CreateFieldDto } from './dto/create-field.dto';
import { threadCpuUsage } from 'process';
// Reusable projections // Reusable projections
const LIST_PROJECTION = { const LIST_PROJECTION = {
@ -94,6 +93,36 @@ export class FormService {
return form; return form;
} }
async getStats() {
const [totalForms, totalFields, fieldTypeBreakdown, formStatusBreakdown] =
await Promise.all([
this.formModel.countDocuments(),
this.formModel.aggregate([
{ $project: { fieldCount: { $size: '$fields' } } },
{ $group: { _id: null, total: { $sum: '$fieldCount' } } },
]),
this.formModel.aggregate([
{ $unwind: '$fields' },
{ $group: { _id: '$fields.keyType', count: { $sum: 1 } } },
]),
this.formModel.aggregate([
{
$group: {
_id: {
$cond: {
if: { $ifNull: ['$deletedAt', false] },
then: 'deleted',
else: 'active',
},
},
count: { $sum: 1 },
},
},
]),
]);
return { totalForms, totalFields, fieldTypeBreakdown, formStatusBreakdown };
}
async findInterface(formId: string): Promise<string> { async findInterface(formId: string): Promise<string> {
const form = await this.formModel const form = await this.formModel
.findOne({ id: formId, deletedAt: null }) .findOne({ id: formId, deletedAt: null })

View File

@ -2,7 +2,6 @@ import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose'; import { Document } from 'mongoose';
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
import { PARENT_TYPE_KEYS, INPUT_SUB_TYPE_KEYS } from '../types/field.type'; import { PARENT_TYPE_KEYS, INPUT_SUB_TYPE_KEYS } from '../types/field.type';
import type { ParentKeyType, InputSubType } from '../types/field.type'; import type { ParentKeyType, InputSubType } from '../types/field.type';
@ -10,7 +9,7 @@ export type FieldDocument = Field & Document;
@Schema({ timestamps: true }) @Schema({ timestamps: true })
export class Field { export class Field {
@Prop({ required: true, unique:true, default:()=>uuidv4()}) @Prop({ required: true, unique: true, default: () => uuidv4() })
id!: string; id!: string;
@Prop({ required: true, enum: PARENT_TYPE_KEYS }) @Prop({ required: true, enum: PARENT_TYPE_KEYS })
@ -28,7 +27,7 @@ export class Field {
@Prop({ required: false }) @Prop({ required: false })
placeholder?: string; placeholder?: string;
@Prop({ required: false }) @Prop({ required: false, default: undefined })
options?: string[]; options?: string[];
@Prop({ required: true, default: false }) @Prop({ required: true, default: false })