import { Type } from 'class-transformer'; import { IsArray, IsBoolean, IsEnum, IsNotEmpty, IsNumber, IsOptional, IsString, ValidateNested } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; export enum TipoPreguntaEnum { CERRADA = 'Cerrada', ABIERTA = 'Abierta', MULTIPLE = 'Multiple' } export class OpcionDto { @ApiProperty({ description: 'Valor de la opción', example: 'Sí' }) @IsNotEmpty() @IsString() valor: string; } export class CreatePreguntaDto { @ApiProperty({ description: 'Título o texto de la pregunta', example: '¿Eres parte de la comunidad de la FES Acatlán?' }) @IsNotEmpty() @IsString() titulo: string; @ApiProperty({ description: 'Indica si la pregunta es obligatoria', example: true, default: false }) @IsOptional() @IsBoolean() obligatoria?: boolean; @ApiProperty({ description: 'Tipo de pregunta', enum: Object.values(TipoPreguntaEnum), enumName: 'TipoPreguntaEnum', example: TipoPreguntaEnum.CERRADA, examples: { 'cerrada': { summary: 'Pregunta de opción única', value: TipoPreguntaEnum.CERRADA }, 'abierta': { summary: 'Pregunta de texto libre', value: TipoPreguntaEnum.ABIERTA }, 'multiple': { summary: 'Pregunta de selección múltiple', value: TipoPreguntaEnum.MULTIPLE } } }) @IsNotEmpty() @IsEnum(TipoPreguntaEnum, { message: 'El tipo debe ser uno de los siguientes valores: Cerrada, Abierta, Multiple' }) tipo: string; @ApiProperty({ description: 'Contador de opciones (se calcula automáticamente)', required: false }) @IsOptional() @IsNumber() contador_opcion?: number; @ApiProperty({ description: 'ID de la opción de la que depende esta pregunta (para preguntas condicionadas)', required: false, example: null }) @IsOptional() @IsNumber() id_opcion_dependiente?: number; @ApiProperty({ description: 'Lista de opciones para preguntas de tipo Cerrada o Multiple', type: [OpcionDto], required: false, examples: [ { valor: 'Sí' }, { valor: 'No' } ] }) @IsOptional() @IsArray() @ValidateNested({ each: true }) @Type(() => OpcionDto) opciones?: OpcionDto[]; }