2025-04-02 12:43:37 -06:00
import { ApiBody , ApiOperation , ApiParam , ApiResponse , ApiTags , getSchemaPath } from '@nestjs/swagger' ;
2025-04-02 11:50:08 -06:00
import { feriaSexualidad } from '../../utils/crear_formulario_feria' ;
import { applyDecorators } from '@nestjs/common' ;
2025-04-02 13:51:04 -06:00
import { FormularioDto , FormularioFeriaSchema } from './dto/formulario.schema' ;
2025-04-02 11:50:08 -06:00
export class CuestionarioApiDocumentation {
// Decoradores para toda la clase del controlador
static ApiController = ApiTags ( 'Cuestionarios' );
2025-04-02 12:43:37 -06:00
// Documentación para obtener el formulario completo
static ApiGetFormulario = applyDecorators (
ApiOperation ({
summary : 'Obtener formulario completo' ,
2025-04-04 14:39:04 -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' ,
example : 1
}),
ApiResponse ({
status : 200 ,
2025-04-04 14:39:04 -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 ) },
example : feriaSexualidad
}
}
}),
ApiResponse ({ status : 404 , description : 'Cuestionario no encontrado' })
);
2025-04-02 11:50:08 -06:00
// Documentación para crear un cuestionario
static ApiCreate = applyDecorators (
ApiOperation ({
summary : 'Crear un nuevo cuestionario' ,
2025-04-04 14:39:04 -06:00
description : 'Crea un nuevo cuestionario con secciones, preguntas y opciones, incluyendo validaciones personalizadas'
2025-04-02 11:50:08 -06:00
}),
ApiBody ({
2025-04-04 14:39:04 -06:00
description : 'Datos del cuestionario a crear. Para las preguntas de tipo "Abierta", se puede especificar un tipo de validación usando la propiedad "validacion" con valores como: "correo", "cuenta_alumno", "telefono", "nombre", "entero", "decimal", etc.' ,
2025-04-02 12:43:37 -06:00
type : FormularioDto ,
2025-04-02 11:50:08 -06:00
examples : {
feriaSexualidad : {
summary : 'Ejemplo de cuestionario para feria de sexualidad' ,
2025-04-04 14:39:04 -06:00
description : 'Cuestionario con secciones, preguntas y opciones para feria de sexualidad, ahora con validaciones específicas para cada tipo de campo (correo, nombre, cuenta_alumno, etc.)' ,
2025-04-02 11:50:08 -06:00
value : feriaSexualidad
}
}
}),
ApiResponse ({
status : 201 ,
2025-04-04 14:39:04 -06:00
description : 'Cuestionario creado correctamente. Los campos con la propiedad "validacion" se validarán según su tipo: "correo", "cuenta_alumno", "telefono", "nombre", "entero", "decimal", etc.' ,
2025-04-02 11:50:08 -06:00
schema : {
properties : {
success : { type : 'boolean' , example : true },
cuestionario : {
type : 'object' ,
properties : {
id_cuestionario : { type : 'number' , example : 1 },
nombre_form : { type : 'string' , example : 'Registro para la Feria de la Sexualidad - FES Acatlán' },
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' },
id_tipo_cuestionario : { type : 'number' , example : 1 }
}
}
}
}
}),
ApiResponse ({ status : 400 , description : 'Datos del cuestionario inválidos' }),
ApiResponse ({ status : 500 , description : 'Error interno del servidor' })
);
// Documentación para obtener todos los cuestionarios
static ApiGetAll = applyDecorators (
ApiOperation ({
summary : 'Obtener todos los cuestionarios' ,
description : 'Retorna una lista de todos los cuestionarios registrados'
}),
ApiResponse ({
status : 200 ,
description : 'Lista de cuestionarios obtenida correctamente' ,
schema : {
type : 'array' ,
items : {
type : 'object' ,
properties : {
id_cuestionario : { type : 'number' , example : 1 },
nombre_form : { type : 'string' , example : 'Registro para la Feria de la Sexualidad - FES Acatlán' },
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' },
id_tipo_cuestionario : { type : 'number' , example : 1 }
}
}
}
}),
ApiResponse ({ status : 500 , description : 'Error interno del servidor' })
);
// Documentación para obtener un cuestionario por ID
static ApiGetOne = applyDecorators (
ApiOperation ({
summary : 'Obtener un cuestionario por ID' ,
description : 'Retorna un cuestionario específico por su ID'
}),
ApiParam ({
name : 'id' ,
description : 'ID del cuestionario' ,
required : true ,
type : 'number' ,
example : 1
}),
ApiResponse ({
status : 200 ,
description : 'Cuestionario obtenido correctamente' ,
schema : {
type : 'object' ,
properties : {
id_cuestionario : { type : 'number' , example : 1 },
nombre_form : { type : 'string' , example : 'Registro para la Feria de la Sexualidad - FES Acatlán' },
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' },
id_tipo_cuestionario : { type : 'number' , example : 1 }
}
}
}),
ApiResponse ({ status : 404 , description : 'Cuestionario no encontrado' }),
ApiResponse ({ status : 500 , description : 'Error interno del servidor' })
);
// Documentación para actualizar un cuestionario
static ApiUpdate = applyDecorators (
ApiOperation ({
summary : 'Actualizar un cuestionario' ,
description : 'Actualiza los datos de un cuestionario existente'
}),
ApiParam ({
name : 'id' ,
description : 'ID del cuestionario a actualizar' ,
required : true ,
type : 'number' ,
example : 1
}),
ApiBody ({
description : 'Datos a actualizar del cuestionario' ,
schema : {
type : 'object' ,
properties : {
nombre_form : { type : 'string' , example : 'Nombre actualizado del formulario' },
descripcion : { type : 'string' , example : 'Descripción actualizada' },
fecha_inicio : { type : 'string' , format : 'date-time' },
fecha_fin : { type : 'string' , format : 'date-time' },
editable : { type : 'boolean' , example : true }
}
}
}),
ApiResponse ({
status : 200 ,
description : 'Cuestionario actualizado correctamente' ,
schema : {
type : 'object' ,
properties : {
affected : { type : 'number' , example : 1 }
}
}
}),
ApiResponse ({ status : 400 , description : 'Datos de actualización inválidos' }),
ApiResponse ({ status : 404 , description : 'Cuestionario no encontrado' }),
ApiResponse ({ status : 500 , description : 'Error interno del servidor' })
);
// Documentación para eliminar un cuestionario
static ApiRemove = applyDecorators (
ApiOperation ({
summary : 'Eliminar un cuestionario' ,
description : 'Elimina permanentemente un cuestionario por su ID'
}),
ApiParam ({
name : 'id' ,
description : 'ID del cuestionario a eliminar' ,
required : true ,
type : 'number' ,
example : 1
}),
ApiResponse ({
status : 200 ,
description : 'Cuestionario eliminado correctamente' ,
schema : {
type : 'object' ,
properties : {
affected : { type : 'number' , example : 1 }
}
}
}),
ApiResponse ({ status : 404 , description : 'Cuestionario no encontrado' }),
ApiResponse ({ status : 500 , description : 'Error interno del servidor' })
);
}