variables de entorno, correcciones de codigo actual, docker file

This commit is contained in:
Your Name
2025-04-02 11:14:45 -06:00
parent 60c75f437f
commit bf7c0e93a8
33 changed files with 190 additions and 47 deletions
+23
View File
@@ -0,0 +1,23 @@
# Etapa de construcción
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Etapa de producción
FROM node:20-alpine AS production
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./
EXPOSE 4100
CMD ["node", "dist/main"]
+28
View File
@@ -0,0 +1,28 @@
version: '3.8'
services:
mariadb:
image: mariadb:latest
container_name: formularios_db
ports:
- "4201:3306"
environment:
MARIADB_ROOT_PASSWORD: mypass
MARIADB_DATABASE: formularios_test
volumes:
- mariadb_data:/var/lib/mysql
api:
build:
context: .
dockerfile: Dockerfile
container_name: formularios_api
env_file:
- .env
ports:
- "4200:3000"
depends_on:
- mariadb
volumes:
mariadb_data:
+9 -4
View File
@@ -29,7 +29,7 @@ import { ParticipanteEventoModule } from './participante_evento/participante_eve
imports: [
ConfigModule.forRoot(),
TypeOrmModule.forRoot({
/*
type: 'mysql',
host: process.env.db_host, //process.env.db_host
username: process.env.db_username,
@@ -40,16 +40,21 @@ import { ParticipanteEventoModule } from './participante_evento/participante_eve
dropSchema: true, // elimina la base de datos
// logging: true, // Habilita los logs para depuración
autoLoadEntities: true, // Carga automáticamente las entidades
*/
//esta es mi base de datos local
/*
type: 'mysql',
host: 'localhost',
port: 3306, //3306
username: 'root',
password: 'admin', //admin
database: 'cidwa', //nestdb
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true,
*/
// entities: [__dirname + '/**/*.entity{.ts,.js}'],
// synchronize: true,
//extra
retryAttempts: 10, // Intentos para reconectar
retryDelay: 3000, // Tiempo entre reintentos
+4
View File
@@ -1,9 +1,13 @@
import { Module } from '@nestjs/common';
import { CuestionarioService } from './cuestionario.service';
import { CuestionarioController } from './cuestionario.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Cuestionario } from './entities/cuestionario.entity';
@Module({
imports: [TypeOrmModule.forFeature([Cuestionario])],
controllers: [CuestionarioController],
providers: [CuestionarioService],
exports: [TypeOrmModule]
})
export class CuestionarioModule {}
@@ -31,14 +31,12 @@ export class Cuestionario {
@OneToMany(() => CuestionarioSeccion,(cuestionario_seccion) => cuestionario_seccion.id_cuestionario)
cuestionarioSeccion:CuestionarioSeccion[]
@OneToMany(()=> Cuestionario, (cuestionario) => cuestionario.id_cuestionario)
@Column({ type: 'int' })
@Column({ type: 'int', nullable: true })
id_cuestionario_original: number;
@OneToMany(()=> TipoCuestionario, (tipo_cuestionario) => tipo_cuestionario.id_tipo_cuestionario )
@Column({ type: 'int' })
id_tipo_cuestionario: number;
@ManyToOne(()=> Cuestionario, (cuestionario) => cuestionario.id_cuestionario)
Cuestionario: Cuestionario[];
@ManyToOne(()=> Cuestionario)
cuestionarioOriginal: Cuestionario;
}
@@ -1,9 +1,19 @@
import { Module } from '@nestjs/common';
import { CuestionarioRespondidoService } from './cuestionario_respondido.service';
import { CuestionarioRespondidoController } from './cuestionario_respondido.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { CuestionarioRespondido } from './entities/cuestionario_respondido.entity';
import { CuestionarioModule } from '../cuestionario/cuestionario.module';
import { ParticipanteModule } from '../participante/participante.module';
@Module({
imports: [
TypeOrmModule.forFeature([CuestionarioRespondido]),
CuestionarioModule,
ParticipanteModule
],
controllers: [CuestionarioRespondidoController],
providers: [CuestionarioRespondidoService],
exports: [TypeOrmModule]
})
export class CuestionarioRespondidoModule {}
@@ -16,18 +16,18 @@ export class CuestionarioRespondido {
// Relación con Participante
@ManyToOne(() => Participante, participante => participante.cuestionariosRespondidos)
@JoinColumn({ name: 'id_participante' })
id_participante: Participante;
participante: Participante;
// Relación con Cuestionario
@ManyToOne(() => Cuestionario, cuestionario => cuestionario.id_cuestionario)
@ManyToOne(() => Cuestionario)
@JoinColumn({ name: 'id_cuestionario' })
id_cuestionario: Cuestionario;
cuestionario: Cuestionario;
// Relación con RespuestasCerradas
@OneToMany(() => RespuestaParticipanteCerrada, respuestaCerrada => respuestaCerrada.id_cuestionario_respondido)
@OneToMany(() => RespuestaParticipanteCerrada, respuestaCerrada => respuestaCerrada.cuestionarioRespondido)
respuestasCerradas: RespuestaParticipanteCerrada[];
// Relación con RespuestasAbiertas
@OneToMany(() => RespuestaParticipanteAbierta, respuestaAbierta => respuestaAbierta.id_cuestionario_respondido)
@OneToMany(() => RespuestaParticipanteAbierta, respuestaAbierta => respuestaAbierta.cuestionarioRespondido)
respuestasAbiertas: RespuestaParticipanteAbierta[];
}
@@ -1,9 +1,19 @@
import { Module } from '@nestjs/common';
import { CuestionarioSeccionService } from './cuestionario_seccion.service';
import { CuestionarioSeccionController } from './cuestionario_seccion.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { CuestionarioSeccion } from './entities/cuestionario_seccion.entity';
import { CuestionarioModule } from '../cuestionario/cuestionario.module';
import { SeccionModule } from '../seccion/seccion.module';
@Module({
imports: [
TypeOrmModule.forFeature([CuestionarioSeccion]),
CuestionarioModule,
SeccionModule
],
controllers: [CuestionarioSeccionController],
providers: [CuestionarioSeccionService],
exports: [TypeOrmModule]
})
export class CuestionarioSeccionModule {}
@@ -11,11 +11,15 @@ export class CuestionarioSeccion {
posicion: number;
@ManyToOne(() => Cuestionario, (cuestionario) => cuestionario.id_cuestionario)
@ManyToOne(() => Cuestionario, (cuestionario) => cuestionario.cuestionarioSeccion)
cuestionario: Cuestionario;
@Column({ type: 'int' })
id_cuestionario: number;
@ManyToOne(() => Seccion, (seccion) => seccion.id_seccion)
@ManyToOne(() => Seccion, (seccion) => seccion.seccion)
seccion: Seccion;
@Column({type:'int'})
id_seccion:number;
}
+1 -1
View File
@@ -9,7 +9,7 @@ async function bootstrap() {
DocsModule.setupSwagger(app);
await app.listen(3000);
await app.listen(process.env.PORT ?? 3000);
console.log('API en ejecución en http://localhost:3000');
console.log('Swagger disponible en http://localhost:3000/api-docs');
}
+2 -2
View File
@@ -9,8 +9,8 @@ export class Opcion {
@Column({ type: String, nullable: false, length: 200, default: '' })
opcion: string;
@OneToMany(() => PreguntaOpcion, (preguntaOpcion) => preguntaOpcion.id_opcion)
Preguntas: PreguntaOpcion[];
@OneToMany(() => PreguntaOpcion, (preguntaOpcion) => preguntaOpcion.opcion)
preguntasOpciones: PreguntaOpcion[];
}
+1 -1
View File
@@ -8,6 +8,6 @@ import { Opcion } from './entities/opcion.entity';
imports: [TypeOrmModule.forFeature([Opcion])], // Importa el repositorio de Opcion
controllers: [OpcionController],
providers: [OpcionService],
exports: [OpcionService]
exports: [OpcionService, TypeOrmModule]
})
export class OpcionModule {}
+1 -1
View File
@@ -39,7 +39,7 @@ export class Participante {
@OneToMany(() => CuestionarioRespondido, cuestionario => cuestionario.id_participante)
@OneToMany(() => CuestionarioRespondido, cuestionario => cuestionario.participante)
cuestionariosRespondidos: CuestionarioRespondido[];
@OneToMany(() => ParticipanteEvento, participanteEvento => participanteEvento.participante)
+1 -1
View File
@@ -8,6 +8,6 @@ import { Participante } from './participante.entity';
imports: [TypeOrmModule.forFeature([Participante])],
controllers: [ParticipanteController],
providers: [ParticipanteService],
exports: [ParticipanteService],
exports: [ParticipanteService, TypeOrmModule],
})
export class ParticipanteModule {}
+6 -3
View File
@@ -20,14 +20,17 @@ export class Pregunta {
@ManyToOne(() => TipoPregunta, tipo => tipo.preguntas)
@JoinColumn({ name: 'id_tipo_pregunta' })
id_tipo_pregunta: TipoPregunta;
tipoPregunta: TipoPregunta;
@Column()
id_tipo_pregunta: number;
@Column({ nullable: true })
id_opcion_dependiente: number;
@OneToMany(() => SeccionPregunta, seccionPregunta => seccionPregunta.id_pregunta)
@OneToMany(() => SeccionPregunta, seccionPregunta => seccionPregunta.pregunta)
seccionPreguntas: SeccionPregunta[];
@OneToMany(() => PreguntaOpcion, preguntaOpcion => preguntaOpcion.id_pregunta)
@OneToMany(() => PreguntaOpcion, preguntaOpcion => preguntaOpcion.pregunta)
opciones: PreguntaOpcion[];
}
+8
View File
@@ -1,9 +1,17 @@
import { Module } from '@nestjs/common';
import { PreguntaService } from './pregunta.service';
import { PreguntaController } from './pregunta.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Pregunta } from './entities/pregunta.entity';
import { TipoPreguntaModule } from '../tipo_pregunta/tipo_pregunta.module';
@Module({
imports: [
TypeOrmModule.forFeature([Pregunta]),
TipoPreguntaModule
],
controllers: [PreguntaController],
providers: [PreguntaService],
exports: [TypeOrmModule]
})
export class PreguntaModule {}
@@ -12,14 +12,15 @@ export class PreguntaOpcion {
@Column()
posicion: number;
@ManyToOne(() => Pregunta, pregunta => pregunta.id_pregunta)
//@Column()
id_pregunta: Pregunta;
@ManyToOne(() => Pregunta)
pregunta: Pregunta;
@Column()
id_pregunta: number;
@ManyToOne(() => Opcion, opcion => opcion.id_opcion)
//@Column()
id_opcion: Opcion;
@ManyToOne(() => Opcion, opcion => opcion.preguntasOpciones)
opcion: Opcion;
@OneToMany(()=> RespuestaParticipanteCerrada, respuestaParticipanteCerrada=>respuestaParticipanteCerrada.id_pregunta_opcion)
@OneToMany(()=> RespuestaParticipanteCerrada, respuestaParticipanteCerrada=>respuestaParticipanteCerrada.preguntaOpcion)
respuestaParticipanteCerrada:RespuestaParticipanteCerrada[];
}
@@ -1,9 +1,19 @@
import { Module } from '@nestjs/common';
import { PreguntaOpcionService } from './pregunta_opcion.service';
import { PreguntaOpcionController } from './pregunta_opcion.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PreguntaOpcion } from './entities/pregunta_opcion.entity';
import { OpcionModule } from '../opcion/opcion.module';
import { PreguntaModule } from '../pregunta/pregunta.module';
@Module({
imports: [
TypeOrmModule.forFeature([PreguntaOpcion]),
OpcionModule,
PreguntaModule
],
controllers: [PreguntaOpcionController],
providers: [PreguntaOpcionService],
exports: [TypeOrmModule]
})
export class PreguntaOpcionModule {}
@@ -14,17 +14,14 @@ export class RespuestaParticipanteAbierta {
// Relación con CuestionarioRespondido
@ManyToOne(
() => CuestionarioRespondido,
cuestionarioRespondido => cuestionarioRespondido.idCuestionarioRespondido
cuestionarioRespondido => cuestionarioRespondido.respuestasAbiertas
)
@JoinColumn({ name: 'id_cuestionario_respondido' })
id_cuestionario_respondido: CuestionarioRespondido;
cuestionarioRespondido: CuestionarioRespondido;
@ManyToOne(
() => Pregunta,
pregunta => pregunta.id_pregunta
)
@ManyToOne(() => Pregunta)
@JoinColumn({ name: 'id_pregunta' })
id_pregunta: Pregunta;
pregunta: Pregunta;
}
@@ -1,9 +1,19 @@
import { Module } from '@nestjs/common';
import { RespuestaParticipanteAbiertaService } from './respuesta_participante_abierta.service';
import { RespuestaParticipanteAbiertaController } from './respuesta_participante_abierta.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { RespuestaParticipanteAbierta } from './entities/respuesta_participante_abierta.entity';
import { CuestionarioRespondidoModule } from '../cuestionario_respondido/cuestionario_respondido.module';
import { PreguntaModule } from '../pregunta/pregunta.module';
@Module({
imports: [
TypeOrmModule.forFeature([RespuestaParticipanteAbierta]),
CuestionarioRespondidoModule,
PreguntaModule
],
controllers: [RespuestaParticipanteAbiertaController],
providers: [RespuestaParticipanteAbiertaService],
exports: [TypeOrmModule]
})
export class RespuestaParticipanteAbiertaModule {}
@@ -10,11 +10,11 @@ export class RespuestaParticipanteCerrada {
@ManyToOne(() => CuestionarioRespondido, cuestionarioRespondido => cuestionarioRespondido.respuestasCerradas)
@JoinColumn({ name: 'id_cuestionario_respondido' })
id_cuestionario_respondido: CuestionarioRespondido;
cuestionarioRespondido: CuestionarioRespondido;
@ManyToOne(() => PreguntaOpcion, preguntaOpcion => preguntaOpcion.id_pregunta_opcion)
@ManyToOne(() => PreguntaOpcion, preguntaOpcion => preguntaOpcion.respuestaParticipanteCerrada)
@JoinColumn({ name: 'id_pregunta_opcion' })
id_pregunta_opcion: PreguntaOpcion;
preguntaOpcion: PreguntaOpcion;
}
@@ -1,9 +1,19 @@
import { Module } from '@nestjs/common';
import { RespuestaParticipanteCerradaService } from './respuesta_participante_cerrada.service';
import { RespuestaParticipanteCerradaController } from './respuesta_participante_cerrada.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { RespuestaParticipanteCerrada } from './entities/respuesta_participante_cerrada.entity';
import { PreguntaOpcionModule } from '../pregunta_opcion/pregunta_opcion.module';
import { CuestionarioRespondidoModule } from '../cuestionario_respondido/cuestionario_respondido.module';
@Module({
imports: [
TypeOrmModule.forFeature([RespuestaParticipanteCerrada]),
PreguntaOpcionModule,
CuestionarioRespondidoModule
],
controllers: [RespuestaParticipanteCerradaController],
providers: [RespuestaParticipanteCerradaService],
exports: [TypeOrmModule]
})
export class RespuestaParticipanteCerradaModule {}
+2 -2
View File
@@ -19,6 +19,6 @@ export class Seccion {
@OneToMany(() => CuestionarioSeccion,(cuestionario_seccion) => cuestionario_seccion.id_seccion )
seccion:CuestionarioSeccion[];
@OneToMany(()=> SeccionPregunta, (seccion_pregunta)=> seccion_pregunta.id_seccion)
seccion_pregunta:SeccionPregunta[];
@OneToMany(()=> SeccionPregunta, (seccion_pregunta)=> seccion_pregunta.seccion)
seccionPreguntas:SeccionPregunta[];
}
+4
View File
@@ -1,9 +1,13 @@
import { Module } from '@nestjs/common';
import { SeccionService } from './seccion.service';
import { SeccionController } from './seccion.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Seccion } from './entities/seccion.entity';
@Module({
imports: [TypeOrmModule.forFeature([Seccion])],
controllers: [SeccionController],
providers: [SeccionService],
exports: [TypeOrmModule]
})
export class SeccionModule {}
@@ -11,11 +11,15 @@ export class SeccionPregunta {
@Column({ type: 'tinyint' })
posicion: number;
@ManyToOne(() => Pregunta, (pregunta) => pregunta.id_pregunta)
@ManyToOne(() => Pregunta, (pregunta) => pregunta.seccionPreguntas)
pregunta: Pregunta;
@Column({ type: 'int' })
id_pregunta: number;
@ManyToOne(() => Seccion, (seccion) => seccion.id_seccion)
@ManyToOne(() => Seccion, (seccion) => seccion.seccionPreguntas)
seccion: Seccion;
@Column({ type: 'int' })
id_seccion: number;
}
@@ -1,9 +1,19 @@
import { Module } from '@nestjs/common';
import { SeccionPreguntaService } from './seccion_pregunta.service';
import { SeccionPreguntaController } from './seccion_pregunta.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { SeccionPregunta } from './entities/seccion_pregunta.entity';
import { PreguntaModule } from '../pregunta/pregunta.module';
import { SeccionModule } from '../seccion/seccion.module';
@Module({
imports: [
TypeOrmModule.forFeature([SeccionPregunta]),
PreguntaModule,
SeccionModule
],
controllers: [SeccionPreguntaController],
providers: [SeccionPreguntaService],
exports: [TypeOrmModule]
})
export class SeccionPreguntaModule {}
@@ -9,6 +9,6 @@ export class TipoPregunta {
@Column()
tipo_pregunta: string;
@OneToMany(() => Pregunta, pregunta => pregunta.id_tipo_pregunta)
@OneToMany(() => Pregunta, pregunta => pregunta.tipoPregunta)
preguntas: Pregunta[];
}
@@ -1,9 +1,13 @@
import { Module } from '@nestjs/common';
import { TipoPreguntaService } from './tipo_pregunta.service';
import { TipoPreguntaController } from './tipo_pregunta.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TipoPregunta } from './entities/tipo_pregunta.entity';
@Module({
imports: [TypeOrmModule.forFeature([TipoPregunta])],
controllers: [TipoPreguntaController],
providers: [TipoPreguntaService],
exports: [TypeOrmModule]
})
export class TipoPreguntaModule {}
View File
View File
View File
View File
View File