formato correcto de cuestionario por verificar
This commit is contained in:
@@ -3,11 +3,25 @@ import { SeccionService } from './seccion.service';
|
||||
import { SeccionController } from './seccion.controller';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { Seccion } from './entities/seccion.entity';
|
||||
import { Pregunta } from '../pregunta/entities/pregunta.entity';
|
||||
import { SeccionPregunta } from '../seccion_pregunta/entities/seccion_pregunta.entity';
|
||||
import { TipoPregunta } from '../tipo_pregunta/entities/tipo_pregunta.entity';
|
||||
import { Opcion } from '../opcion/entities/opcion.entity';
|
||||
import { PreguntaOpcion } from '../pregunta_opcion/entities/pregunta_opcion.entity';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([Seccion])],
|
||||
imports: [
|
||||
TypeOrmModule.forFeature([
|
||||
Seccion,
|
||||
Pregunta,
|
||||
SeccionPregunta,
|
||||
TipoPregunta,
|
||||
Opcion,
|
||||
PreguntaOpcion
|
||||
])
|
||||
],
|
||||
controllers: [SeccionController],
|
||||
providers: [SeccionService],
|
||||
exports: [TypeOrmModule]
|
||||
exports: [TypeOrmModule, SeccionService]
|
||||
})
|
||||
export class SeccionModule {}
|
||||
|
||||
+190
-11
@@ -1,26 +1,205 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { Injectable, NotFoundException } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository, DataSource } from 'typeorm';
|
||||
import { CreateSeccionDto } from './dto/create-seccion.dto';
|
||||
import { UpdateSeccionDto } from './dto/update-seccion.dto';
|
||||
import { Seccion } from './entities/seccion.entity';
|
||||
import { Pregunta } from '../pregunta/entities/pregunta.entity';
|
||||
import { SeccionPregunta } from '../seccion_pregunta/entities/seccion_pregunta.entity';
|
||||
import { TipoPregunta } from '../tipo_pregunta/entities/tipo_pregunta.entity';
|
||||
import { Opcion } from '../opcion/entities/opcion.entity';
|
||||
import { PreguntaOpcion } from '../pregunta_opcion/entities/pregunta_opcion.entity';
|
||||
|
||||
@Injectable()
|
||||
export class SeccionService {
|
||||
create(createSeccionDto: CreateSeccionDto) {
|
||||
return 'This action adds a new seccion';
|
||||
constructor(
|
||||
@InjectRepository(Seccion)
|
||||
private seccionRepository: Repository<Seccion>,
|
||||
@InjectRepository(Pregunta)
|
||||
private preguntaRepository: Repository<Pregunta>,
|
||||
@InjectRepository(SeccionPregunta)
|
||||
private seccionPreguntaRepository: Repository<SeccionPregunta>,
|
||||
@InjectRepository(TipoPregunta)
|
||||
private tipoPreguntaRepository: Repository<TipoPregunta>,
|
||||
@InjectRepository(Opcion)
|
||||
private opcionRepository: Repository<Opcion>,
|
||||
@InjectRepository(PreguntaOpcion)
|
||||
private preguntaOpcionRepository: Repository<PreguntaOpcion>,
|
||||
private dataSource: DataSource
|
||||
) {}
|
||||
|
||||
async create(createSeccionDto: CreateSeccionDto) {
|
||||
const queryRunner = this.dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
|
||||
try {
|
||||
// 1. Crear sección
|
||||
const seccion = new Seccion();
|
||||
seccion.titulo = createSeccionDto.titulo;
|
||||
seccion.descripcion = createSeccionDto.descripcion;
|
||||
seccion.contador_pregunta = createSeccionDto.preguntas?.length || 0;
|
||||
|
||||
const savedSeccion = await queryRunner.manager.save(seccion);
|
||||
|
||||
// 2. Crear preguntas y vincularlas a la sección
|
||||
if (createSeccionDto.preguntas && createSeccionDto.preguntas.length > 0) {
|
||||
for (let i = 0; i < createSeccionDto.preguntas.length; i++) {
|
||||
const preguntaDto = createSeccionDto.preguntas[i];
|
||||
|
||||
// Obtener el tipo de pregunta por su nombre
|
||||
const tipoPregunta = await queryRunner.manager.findOne(TipoPregunta, {
|
||||
where: { tipo_pregunta: preguntaDto.tipo },
|
||||
});
|
||||
|
||||
if (!tipoPregunta) {
|
||||
throw new Error(`Tipo de pregunta '${preguntaDto.tipo}' no encontrado`);
|
||||
}
|
||||
|
||||
// Crear pregunta
|
||||
const pregunta = new Pregunta();
|
||||
pregunta.pregunta = preguntaDto.titulo;
|
||||
pregunta.obligatoria = preguntaDto.obligatoria || false;
|
||||
pregunta.id_tipo_pregunta = tipoPregunta.id_tipo;
|
||||
pregunta.id_opcion_dependiente = preguntaDto.id_opcion_dependiente || undefined;
|
||||
pregunta.contador_opcion = preguntaDto.opciones?.length || 0;
|
||||
|
||||
const savedPregunta = await queryRunner.manager.save(pregunta);
|
||||
|
||||
// Vincular pregunta con sección
|
||||
const seccionPregunta = new SeccionPregunta();
|
||||
seccionPregunta.id_seccion = savedSeccion.id_seccion;
|
||||
seccionPregunta.id_pregunta = savedPregunta.id_pregunta;
|
||||
seccionPregunta.posicion = i + 1;
|
||||
|
||||
await queryRunner.manager.save(seccionPregunta);
|
||||
|
||||
// Crear opciones para preguntas de tipo multiple/radio
|
||||
if (preguntaDto.opciones && preguntaDto.opciones.length > 0) {
|
||||
for (let j = 0; j < preguntaDto.opciones.length; j++) {
|
||||
const opcionDto = preguntaDto.opciones[j];
|
||||
|
||||
// Crear opción
|
||||
const opcion = new Opcion();
|
||||
opcion.opcion = opcionDto.valor;
|
||||
|
||||
const savedOpcion = await queryRunner.manager.save(opcion);
|
||||
|
||||
// Vincular opción con pregunta
|
||||
const preguntaOpcion = new PreguntaOpcion();
|
||||
preguntaOpcion.id_pregunta = savedPregunta.id_pregunta;
|
||||
preguntaOpcion.opcion = savedOpcion;
|
||||
preguntaOpcion.posicion = j + 1;
|
||||
|
||||
await queryRunner.manager.save(preguntaOpcion);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await queryRunner.commitTransaction();
|
||||
|
||||
return {
|
||||
success: true,
|
||||
seccion: savedSeccion,
|
||||
};
|
||||
} catch (error) {
|
||||
await queryRunner.rollbackTransaction();
|
||||
throw error;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
}
|
||||
}
|
||||
|
||||
findAll() {
|
||||
return `This action returns all seccion`;
|
||||
async findAll() {
|
||||
return this.seccionRepository.find();
|
||||
}
|
||||
|
||||
findOne(id: number) {
|
||||
return `This action returns a #${id} seccion`;
|
||||
async findOne(id: number) {
|
||||
const seccion = await this.seccionRepository.findOne({
|
||||
where: { id_seccion: id }
|
||||
});
|
||||
|
||||
if (!seccion) {
|
||||
throw new NotFoundException(`Sección con ID ${id} no encontrada`);
|
||||
}
|
||||
|
||||
return seccion;
|
||||
}
|
||||
|
||||
update(id: number, updateSeccionDto: UpdateSeccionDto) {
|
||||
return `This action updates a #${id} seccion`;
|
||||
async findWithPreguntas(id: number) {
|
||||
const seccion = await this.seccionRepository.findOne({
|
||||
where: { id_seccion: id }
|
||||
});
|
||||
|
||||
if (!seccion) {
|
||||
throw new NotFoundException(`Sección con ID ${id} no encontrada`);
|
||||
}
|
||||
|
||||
// Obtener las relaciones seccion-pregunta para esta sección
|
||||
const seccionPreguntas = await this.seccionPreguntaRepository.find({
|
||||
where: { id_seccion: id },
|
||||
relations: ['pregunta']
|
||||
});
|
||||
|
||||
// Extraer y organizar las preguntas
|
||||
const preguntas = await Promise.all(
|
||||
seccionPreguntas.map(async (sp) => {
|
||||
const pregunta = await this.preguntaRepository.findOne({
|
||||
where: { id_pregunta: sp.id_pregunta }
|
||||
});
|
||||
|
||||
// Obtener las opciones para preguntas de tipo multiple/radio
|
||||
const preguntaOpciones = await this.preguntaOpcionRepository.find({
|
||||
where: { id_pregunta: sp.id_pregunta },
|
||||
relations: ['opcion'],
|
||||
order: { posicion: 'ASC' }
|
||||
});
|
||||
|
||||
const opciones = preguntaOpciones.map(po => po.opcion);
|
||||
|
||||
return {
|
||||
...pregunta,
|
||||
posicion: sp.posicion,
|
||||
opciones
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
// Ordenar las preguntas por posición
|
||||
preguntas.sort((a, b) => a.posicion - b.posicion);
|
||||
|
||||
return {
|
||||
...seccion,
|
||||
preguntas
|
||||
};
|
||||
}
|
||||
|
||||
remove(id: number) {
|
||||
return `This action removes a #${id} seccion`;
|
||||
async update(id: number, updateSeccionDto: UpdateSeccionDto) {
|
||||
const seccion = await this.seccionRepository.findOne({
|
||||
where: { id_seccion: id }
|
||||
});
|
||||
|
||||
if (!seccion) {
|
||||
throw new NotFoundException(`Sección con ID ${id} no encontrada`);
|
||||
}
|
||||
|
||||
// Actualizar solo los campos proporcionados
|
||||
if (updateSeccionDto.titulo) seccion.titulo = updateSeccionDto.titulo;
|
||||
if (updateSeccionDto.descripcion !== undefined) seccion.descripcion = updateSeccionDto.descripcion;
|
||||
|
||||
return this.seccionRepository.save(seccion);
|
||||
}
|
||||
|
||||
async remove(id: number) {
|
||||
const seccion = await this.seccionRepository.findOne({
|
||||
where: { id_seccion: id }
|
||||
});
|
||||
|
||||
if (!seccion) {
|
||||
throw new NotFoundException(`Sección con ID ${id} no encontrada`);
|
||||
}
|
||||
|
||||
return this.seccionRepository.remove(seccion);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user