Este documento registra el uso de herramientas de Inteligencia Artificial durante el desarrollo del proyecto, siguiendo las pautas de transparencia y aprendizaje continuo.
- Herramienta: Gemini 3.1 Pro
- Contexto: Tenía un error 500 en Postman al intentar hacer un
DELETE /api/user/me. Revisando los logs de la terminal vi que era un error de restricción de clave foránea de PostgreSQL. No sabía cómo hacer para que al borrar un usuario, se borrasen sus cosas asociadas sin que rompiera la base de datos. - Prompt usado: "Tengo este schema de Prisma [pegué el schema]. Al intentar borrar un usuario me da un error de 'Foreign key constraint failed'. ¿Cómo configuro Prisma para que si borro un usuario, se borren automáticamente los hoteles y reservas que ha creado?"
- Qué obtuvo: Me indicó que tenía que usar
onDelete: Cascadeen las relaciones@relationdentro del modelo. Me dio el código exacto de dónde colocarlo en las relaciones del User y del Hotel. - Qué modificó o descartó: El código que me dio era correcto, pero tuve que acordarme yo de ejecutar
npx prisma migrate devdespués de hacer el cambio para que se aplicara en la base de datos de PostgreSQL, algo que la IA olvidó recordarme. - Tiempo con IA: 10 min | Tiempo sin IA (estimado): 45 min
- Aprendizaje: Entendí cómo funcionan las reglas
onDeleteen Prisma y cómo se traducen directamente a las constraints de la base de datos relacional.
- Herramienta: Gemini 3.1 Pro
- Contexto: Necesitaba comprobar si una habitación ya estaba ocupada antes de crear una reserva. Buscar coincidencias de fechas exactas no servía porque las reservas pueden cruzarse de múltiples formas.
- Prompt usado: "¿Cómo puedo hacer una consulta en Prisma para saber si una habitación está libre entre dos fechas? Necesito evitar el overbooking."
- Qué obtuvo: Me enseñó la fórmula matemática estándar para solapamientos: buscar reservas donde el
checkInexistente sea menor que elcheckOutnuevo (lt), Y elcheckOutexistente sea mayor que elcheckInnuevo (gt). - Qué modificó o descartó: Integré directamente estos operadores (
ltygt) en el bloquewheredeprisma.booking.findFirstdentro debooking.controller.js. - Tiempo con IA: 15 min | Tiempo sin IA (estimado): 2 horas (intentando mapear todos los casos posibles con múltiples if/else en JavaScript).
- Aprendizaje: Aprendí que el cruce de intervalos de tiempo se puede resolver con una única condición matemática directamente en la consulta a la base de datos, siendo muchísimo más eficiente que traer todas las reservas a JS y filtrarlas manualmente.
- Herramienta: Gemini 3.1 Pro
- Contexto: Estaba creando el esquema de validación para las reservas con Zod. Podía validar que
checkInycheckOutfueran fechas válidas, pero necesitaba asegurar que elcheckOutfuera siempre posterior alcheckIn. - Prompt usado: "Estoy usando Zod para validar un req.body en Express. Tengo 'checkIn' y 'checkOut'. ¿Cómo puedo hacer una validación para obligar a que la fecha de checkOut sea mayor (después) que la de checkIn?"
- Qué obtuvo: Me explicó cómo usar el método
.refine()de Zod aplicándolo a todo el objeto, ya que las validaciones de campos individuales no tienen acceso a los otros campos. - Qué modificó o descartó: El ejemplo que me dio usaba
.superRefine, que me pareció más complicado de leer. Le pedí una versión más sencilla y me dio la versión con.refine(), que es la que finalmente implementé enbooking.schema.js. - Tiempo con IA: 15 min | Tiempo sin IA (estimado): 60 min (leyendo la doc de Zod)
- Aprendizaje: Aprendí que
.refine()a nivel de objeto es la herramienta adecuada para validaciones que dependen de múltiples propiedades del mismo objeto.
- Herramienta: Gemini 3.1 Pro
- Contexto: Había escrito 10 tests de integración con Vitest y Supertest. Al correrlos uno por uno funcionaban, pero al correr
npm testfallaban varios porque un test borraba la base de datos (cleanDatabase) mientras otro test la estaba leyendo. - Prompt usado: "Mis tests de Vitest fallan porque interactúan con la misma base de datos de Prisma y parece que se ejecutan en paralelo. En mi vitest.config.js he puesto 'sequence: { concurrent: false }' pero siguen fallando. ¿Cómo obligo a Vitest a ejecutar los archivos de test uno por uno de forma totalmente secuencial?"
- Qué obtuvo: Me aclaró que
concurrent: falsesolo aplica a los tests dentro de un mismo archivo, no a los diferentes archivos. Me dio la configuración correcta: usarfileParallelism: false. - Qué modificó o descartó: Apliqué directamente su sugerencia al
vitest.config.jsy el problema se solucionó inmediatamente. - Tiempo con IA: 5 min | Tiempo sin IA (estimado): 30 min (buscando en internet y la doc de Vitest)
- Aprendizaje: Entendí la diferencia entre paralelismo de tests (dentro del mismo archivo) y paralelismo de archivos en los test runners modernos como Vitest.