2025-06-13 22:41:20 -06:00
import {
ApiBody ,
ApiOperation ,
ApiParam ,
ApiResponse ,
ApiTags ,
getSchemaPath ,
} from '@nestjs/swagger' ;
import { feriaSexualidad } from '../../../utils/crear_formulario_feria' ;
2025-04-02 11:50:08 -06:00
import { applyDecorators } from '@nestjs/common' ;
2025-06-13 22:41:20 -06:00
import { FormularioDto } from '../dto/formulario.schema' ;
import {
CreateCuestionarioDto ,
CreateCuestionarioEventoDto ,
} from '../dto/create-cuestionario.dto' ;
import { ejemploCuestionarioAlumno } from './cuestionario.examples' ;
2025-04-02 11:50:08 -06:00
export class CuestionarioApiDocumentation {
// Decoradores para toda la clase del controlador
2025-06-13 22:41:20 -06:00
static ApiController = ApiTags ( 'Cuestionario' );
static ApiCreate = applyDecorators (
ApiOperation ({
summary : 'Crear un nuevo cuestionario para un evento existente' ,
description :
'Este endpoint crea un cuestionario con sus secciones, preguntas y opciones. Se debe proporcionar el ID de un evento existente para asociarlo.' ,
}),
ApiBody ({
type : CreateCuestionarioDto ,
examples : {
comunidad_estudiantil : ejemploCuestionarioAlumno ,
},
}),
);
2025-04-02 12:43:37 -06:00
// Documentación para obtener el formulario completo
static ApiGetFormulario = applyDecorators (
ApiOperation ({
summary : 'Obtener formulario completo' ,
2025-06-13 22:41:20 -06:00
description :
'Devuelve el cuestionario completo con la misma estructura que se usa para crearlo, incluyendo el atributo validacion para las preguntas que tengan reglas de validación específicas' ,
2025-04-02 12:43:37 -06:00
}),
ApiParam ({
name : 'id' ,
description : 'ID del cuestionario' ,
required : true ,
type : 'number' ,
2025-06-13 22:41:20 -06:00
example : 1 ,
2025-04-02 12:43:37 -06:00
}),
ApiResponse ({
status : 200 ,
2025-06-13 22:41:20 -06:00
description :
'Formulario completo con todas sus secciones, preguntas y opciones. Las preguntas incluyen el atributo "validacion" si tienen reglas de validación específicas (como "correo", "cuenta_alumno", "telefono", "nombre", etc.)' ,
2025-04-02 12:43:37 -06:00
type : FormularioDto ,
content : {
'application/json' : {
schema : { $ref : getSchemaPath ( FormularioDto ) },
2025-06-13 22:41:20 -06:00
example : feriaSexualidad ,
},
},
2025-04-02 12:43:37 -06:00
}),
2025-06-13 22:41:20 -06:00
ApiResponse ({ status : 404 , description : 'Cuestionario no encontrado' }),
2025-04-02 12:43:37 -06:00
);
2025-04-02 11:50:08 -06:00
2025-06-13 22:41:20 -06:00
static ApiCreateWithEvento = applyDecorators (
2025-04-02 11:50:08 -06:00
ApiOperation ({
2025-06-13 22:41:20 -06:00
summary : 'Crear un nuevo cuestionario con nuevo evento' ,
description :
'Este endpoint crea un cuestionario y también un evento (si no existe) usando el nombre proporcionado. No se requiere `id_evento`, sólo `evento` (nombre del evento, es opcional).' ,
}),
ApiResponse ({
status : 201 ,
description : 'Cuestionario y evento creados exitosamente' ,
}),
ApiResponse ({
status : 400 ,
description : 'Datos inválidos' ,
2025-04-02 11:50:08 -06:00
}),
ApiBody ({
2025-06-13 22:41:20 -06:00
type : CreateCuestionarioEventoDto ,
2025-04-02 11:50:08 -06:00
examples : {
2025-06-13 22:41:20 -06:00
ejemplo_con_evento_nuevo : {
summary : 'Cuestionario que crea evento automáticamente' ,
value : {
nombre_form : 'Registro de participantes' ,
descripcion : 'Formulario para inscripción de asistentes.' ,
evento : 'Foro Juvenil de Tecnología 2025' ,
fecha_inicio : '2025-07-20T10:00:00' ,
fecha_fin : '2025-07-20T17:00:00' ,
id_tipo_cuestionario : 2 ,
secciones : [
{
titulo : 'Datos generales' ,
descripcion : 'Recopilación de información personal' ,
preguntas : [
{
titulo : '¿Cuál es tu edad?' ,
tipo : 'Abierta' ,
obligatoria : true ,
},
{
titulo : '¿Cómo te enteraste del evento?' ,
tipo : 'Multiple' ,
opciones : [
{ valor : 'Redes sociales' },
{ valor : 'Correo electrónico' },
{ valor : 'Por un amigo' },
],
},
],
},
],
},
},
},
}),
2025-04-02 11:50:08 -06:00
);
// Documentación para obtener todos los cuestionarios
static ApiGetAll = applyDecorators (
ApiOperation ({
summary : 'Obtener todos los cuestionarios' ,
2025-06-13 22:41:20 -06:00
description : 'Retorna una lista de todos los cuestionarios registrados' ,
2025-04-02 11:50:08 -06:00
}),
ApiResponse ({
status : 200 ,
description : 'Lista de cuestionarios obtenida correctamente' ,
schema : {
type : 'array' ,
items : {
type : 'object' ,
properties : {
id_cuestionario : { type : 'number' , example : 1 },
2025-06-13 22:41:20 -06:00
nombre_form : {
type : 'string' ,
example : 'Registro para la Feria de la Sexualidad - FES Acatlán' ,
},
2025-04-02 11:50:08 -06:00
descripcion : { type : 'string' },
contador_secciones : { type : 'number' , example : 1 },
editable : { type : 'boolean' , example : true },
fecha_fin : { type : 'string' , format : 'date-time' },
fecha_inicio : { type : 'string' , format : 'date-time' },
2025-06-13 22:41:20 -06:00
id_tipo_cuestionario : { type : 'number' , example : 1 },
},
},
},
2025-04-02 11:50:08 -06:00
}),
2025-06-13 22:41:20 -06:00
ApiResponse ({ status : 500 , description : 'Error interno del servidor' }),
2025-04-02 11:50:08 -06:00
);
// Documentación para obtener un cuestionario por ID
static ApiGetOne = applyDecorators (
ApiOperation ({
summary : 'Obtener un cuestionario por ID' ,
2025-06-13 22:41:20 -06:00
description : 'Retorna un cuestionario específico por su ID' ,
2025-04-02 11:50:08 -06:00
}),
ApiParam ({
name : 'id' ,
description : 'ID del cuestionario' ,
required : true ,
type : 'number' ,
2025-06-13 22:41:20 -06:00
example : 1 ,
2025-04-02 11:50:08 -06:00
}),
ApiResponse ({
status : 200 ,
description : 'Cuestionario obtenido correctamente' ,
schema : {
type : 'object' ,
properties : {
id_cuestionario : { type : 'number' , example : 1 },
2025-06-13 22:41:20 -06:00
nombre_form : {
type : 'string' ,
example : 'Registro para la Feria de la Sexualidad - FES Acatlán' ,
},
2025-04-02 11:50:08 -06:00
descripcion : { type : 'string' },
contador_secciones : { type : 'number' , example : 1 },
editable : { type : 'boolean' , example : true },
fecha_fin : { type : 'string' , format : 'date-time' },
fecha_inicio : { type : 'string' , format : 'date-time' },
2025-06-13 22:41:20 -06:00
id_tipo_cuestionario : { type : 'number' , example : 1 },
},
},
2025-04-02 11:50:08 -06:00
}),
ApiResponse ({ status : 404 , description : 'Cuestionario no encontrado' }),
2025-06-13 22:41:20 -06:00
ApiResponse ({ status : 500 , description : 'Error interno del servidor' }),
2025-04-02 11:50:08 -06:00
);
// Documentación para actualizar un cuestionario
static ApiUpdate = applyDecorators (
ApiOperation ({
summary : 'Actualizar un cuestionario' ,
2025-06-13 22:41:20 -06:00
description : 'Actualiza los datos de un cuestionario existente' ,
2025-04-02 11:50:08 -06:00
}),
ApiParam ({
name : 'id' ,
description : 'ID del cuestionario a actualizar' ,
required : true ,
type : 'number' ,
2025-06-13 22:41:20 -06:00
example : 1 ,
2025-04-02 11:50:08 -06:00
}),
ApiBody ({
description : 'Datos a actualizar del cuestionario' ,
schema : {
type : 'object' ,
properties : {
2025-06-13 22:41:20 -06:00
nombre_form : {
type : 'string' ,
example : 'Nombre actualizado del formulario' ,
},
2025-04-02 11:50:08 -06:00
descripcion : { type : 'string' , example : 'Descripción actualizada' },
fecha_inicio : { type : 'string' , format : 'date-time' },
fecha_fin : { type : 'string' , format : 'date-time' },
2025-06-13 22:41:20 -06:00
editable : { type : 'boolean' , example : true },
},
},
2025-04-02 11:50:08 -06:00
}),
ApiResponse ({
status : 200 ,
description : 'Cuestionario actualizado correctamente' ,
schema : {
type : 'object' ,
properties : {
2025-06-13 22:41:20 -06:00
affected : { type : 'number' , example : 1 },
},
},
}),
ApiResponse ({
status : 400 ,
description : 'Datos de actualización inválidos' ,
2025-04-02 11:50:08 -06:00
}),
ApiResponse ({ status : 404 , description : 'Cuestionario no encontrado' }),
2025-06-13 22:41:20 -06:00
ApiResponse ({ status : 500 , description : 'Error interno del servidor' }),
2025-04-02 11:50:08 -06:00
);
// Documentación para eliminar un cuestionario
static ApiRemove = applyDecorators (
ApiOperation ({
summary : 'Eliminar un cuestionario' ,
2025-06-13 22:41:20 -06:00
description : 'Elimina permanentemente un cuestionario por su ID' ,
2025-04-02 11:50:08 -06:00
}),
ApiParam ({
name : 'id' ,
description : 'ID del cuestionario a eliminar' ,
required : true ,
type : 'number' ,
2025-06-13 22:41:20 -06:00
example : 1 ,
2025-04-02 11:50:08 -06:00
}),
ApiResponse ({
status : 200 ,
description : 'Cuestionario eliminado correctamente' ,
schema : {
type : 'object' ,
properties : {
2025-06-13 22:41:20 -06:00
affected : { type : 'number' , example : 1 },
},
},
2025-04-02 11:50:08 -06:00
}),
ApiResponse ({ status : 404 , description : 'Cuestionario no encontrado' }),
2025-06-13 22:41:20 -06:00
ApiResponse ({ status : 500 , description : 'Error interno del servidor' }),
2025-04-02 11:50:08 -06:00
);
2025-06-13 22:41:20 -06:00
}