Inicializar rioCata - Sistema de Catación de Café

- Base de datos PostgreSQL 16 con extensiones JSONB y arrays
- Docker Compose para containerización
- Scripts SQL de inicialización (schema, funciones, índices, datos de prueba)
- Suite de tests de validación (18 tests)
- Queries de ejemplo (17 queries)
- Script helper para gestión (scripts/riocata.sh)
- Documentación completa en README.md

Estructura:
- 4 tablas principales: sesion, auth.users, sesion_participante, muestra, evaluacion
- Tipo ENUM para defectos
- 2 triggers automáticos (updated_at, puntaje_final)
- 19 índices de optimización (GIN, B-tree, funcionales)
- Constraints de validación para arrays y JSONB
- 2 funciones auxiliares para análisis
This commit is contained in:
2025-10-17 17:00:48 -06:00
commit f682c3db51
11 changed files with 2166 additions and 0 deletions

253
scripts/README.md Normal file
View File

@@ -0,0 +1,253 @@
# Scripts de rioCata
Esta carpeta contiene scripts helper para facilitar la gestión de la base de datos y servicios de rioCata.
## Contenido
- **riocata.sh** - Script principal de gestión y administración
---
## riocata.sh
Script bash para gestionar servicios de Docker Compose y operaciones comunes de la base de datos.
### Requisitos
- Docker y Docker Compose instalados
- Bash 4.0 o superior
- Permisos de ejecución (`chmod +x riocata.sh`)
### Uso
```bash
./riocata.sh [comando]
```
O desde el directorio raíz del proyecto:
```bash
./scripts/riocata.sh [comando]
```
### Comandos Disponibles
#### Gestión de Servicios
**`start`** - Iniciar todos los servicios
```bash
./riocata.sh start
```
Levanta los contenedores de Docker Compose y espera a que PostgreSQL esté listo. Muestra el estado de los servicios al finalizar.
**`stop`** - Detener todos los servicios
```bash
./riocata.sh stop
```
Detiene los contenedores sin eliminar los volúmenes. Los datos se preservan.
**`restart`** - Reiniciar todos los servicios
```bash
./riocata.sh restart
```
Reinicia los contenedores manteniendo los datos. Útil después de cambios en configuración.
**`reset`** - Reiniciar servicios y borrar TODOS los datos
```bash
./riocata.sh reset
```
⚠️ **ADVERTENCIA**: Este comando elimina todos los volúmenes de Docker, borrando completamente la base de datos. Los scripts de inicialización se ejecutarán de nuevo, restaurando los datos de prueba.
Requiere confirmación explícita escribiendo `SI`.
**`status`** - Ver estado de servicios
```bash
./riocata.sh status
```
Muestra el estado actual de todos los contenedores.
**`logs`** - Ver logs de PostgreSQL en tiempo real
```bash
./riocata.sh logs
```
Muestra los logs de PostgreSQL en modo follow. Presiona `Ctrl+C` para salir.
#### Base de Datos
**`psql`** - Conectarse a PostgreSQL
```bash
./riocata.sh psql
```
Abre una sesión interactiva de psql conectada a la base de datos rioCata.
Comandos útiles dentro de psql:
- `\dt` - Listar tablas
- `\d nombre_tabla` - Describir estructura de una tabla
- `\df` - Listar funciones
- `\q` - Salir
**`test`** - Ejecutar suite de tests
```bash
./riocata.sh test
```
Ejecuta el archivo `postgres/tests/test_all.sql` que contiene 18 tests de validación:
- Existencia de tablas y tipos
- Funcionamiento de triggers
- Validación de constraints
- Queries típicas
- Funciones auxiliares
**`queries`** - Ejecutar queries de ejemplo
```bash
./riocata.sh queries
```
Ejecuta el archivo `postgres/tests/example_queries.sql` que contiene 17 queries de ejemplo mostrando:
- Sesiones, muestras y evaluaciones
- Top evaluaciones por puntaje
- Evaluaciones con defectos
- Análisis de notas y sabores
- Estadísticas por catador
#### Backup y Restauración
**`backup`** - Crear backup de la base de datos
```bash
./riocata.sh backup
```
Crea un archivo de backup con formato `backup_YYYYMMDD_HHMMSS.sql` en el directorio actual usando `pg_dump`.
Ejemplo:
```bash
./riocata.sh backup
# Crea: backup_20251017_143022.sql
```
**`restore <archivo>`** - Restaurar backup
```bash
./riocata.sh restore backup_20251017_143022.sql
```
Restaura la base de datos desde un archivo de backup SQL.
⚠️ **Nota**: La restauración no elimina datos existentes. Si necesitas una restauración limpia, primero ejecuta `reset` y luego `restore`.
#### Ayuda
**`help`** - Mostrar ayuda
```bash
./riocata.sh help
```
Muestra la lista de comandos disponibles.
### Ejemplos de Uso
#### Iniciar el proyecto por primera vez
```bash
./riocata.sh start
./riocata.sh test # Verificar que todo funciona
./riocata.sh queries # Ver datos de ejemplo
```
#### Desarrollo diario
```bash
# Iniciar
./riocata.sh start
# Trabajar con la base de datos
./riocata.sh psql
# Ver logs si hay problemas
./riocata.sh logs
# Detener al terminar
./riocata.sh stop
```
#### Crear backup antes de cambios importantes
```bash
./riocata.sh backup
# Hacer cambios...
# Si algo sale mal:
./riocata.sh restore backup_20251017_143022.sql
```
#### Reiniciar completamente el proyecto
```bash
./riocata.sh reset
# Escribir 'SI' cuando lo solicite
./riocata.sh test # Verificar
```
### Variables de Configuración
El script utiliza las siguientes variables configurables al inicio del archivo:
```bash
COMPOSE="docker-compose" # Comando de docker-compose
DB_USER="riocata_user" # Usuario de PostgreSQL
DB_NAME="riocata" # Nombre de la base de datos
```
Si necesitas cambiar las credenciales o nombres, edita estas variables en el script.
### Códigos de Salida
- `0` - Ejecución exitosa
- `1` - Error (comando desconocido, archivo no encontrado, etc.)
### Troubleshooting
**Error: "docker-compose: command not found"**
- Solución: Instala Docker Compose o cambia la variable `COMPOSE` a `docker compose` (sin guión)
**Error al conectar con psql**
- Verifica que los servicios estén corriendo: `./riocata.sh status`
- Revisa los logs: `./riocata.sh logs`
- Intenta reiniciar: `./riocata.sh restart`
**Los tests fallan**
- Si es la primera vez, puede ser que PostgreSQL aún no haya terminado de inicializar
- Espera unos segundos y vuelve a ejecutar: `./riocata.sh test`
- Si persiste, revisa los logs: `./riocata.sh logs`
**El backup falla**
- Verifica que los servicios estén corriendo: `./riocata.sh status`
- Verifica que tengas permisos de escritura en el directorio actual
### Personalización
Puedes agregar tus propios comandos al script editando el `case` statement al final del archivo:
```bash
case "${1:-help}" in
mi_comando)
mi_funcion
;;
# ... otros comandos
esac
```
### Contribuir
Si agregas nuevos scripts útiles a esta carpeta:
1. Hazlos ejecutables: `chmod +x nombre_script.sh`
2. Documéntalos en este README
3. Usa las mismas variables de configuración que `riocata.sh`
4. Sigue el mismo formato de colores y mensajes
### Notas de Seguridad
- ⚠️ No uses estos scripts en producción sin revisar las credenciales
- ⚠️ Los backups NO están encriptados
- ⚠️ El comando `reset` es destructivo y no se puede deshacer
- ⚠️ Almacena los backups en un lugar seguro fuera del repositorio
### Información Adicional
- Las credenciales por defecto están en `docker-compose.yml`
- Los scripts SQL están en `postgres/init/` y `postgres/tests/`
- La documentación general está en `README.md` en el directorio raíz
---
**Desarrollado para Nucleo Rio Frio**

167
scripts/riocata.sh Executable file
View File

@@ -0,0 +1,167 @@
#!/bin/bash
# rioCata - Script de ayuda para gestión de la base de datos
set -e
COMPOSE="docker-compose"
DB_USER="riocata_user"
DB_NAME="riocata"
# Colores
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
function show_help() {
echo "rioCata - Sistema de Catación de Café"
echo ""
echo "Uso: ./riocata.sh [comando]"
echo ""
echo "Comandos disponibles:"
echo " start - Iniciar servicios"
echo " stop - Detener servicios"
echo " restart - Reiniciar servicios"
echo " reset - Reiniciar servicios y borrar datos (¡CUIDADO!)"
echo " psql - Conectarse a PostgreSQL con psql"
echo " test - Ejecutar tests de validación"
echo " queries - Ejecutar queries de ejemplo"
echo " logs - Ver logs de PostgreSQL"
echo " status - Ver estado de servicios"
echo " backup - Crear backup de la base de datos"
echo " restore FILE - Restaurar backup desde archivo"
echo " help - Mostrar esta ayuda"
echo ""
}
function start_services() {
echo -e "${GREEN}Iniciando servicios...${NC}"
$COMPOSE up -d
echo -e "${GREEN}Esperando que PostgreSQL esté listo...${NC}"
sleep 3
$COMPOSE ps
}
function stop_services() {
echo -e "${YELLOW}Deteniendo servicios...${NC}"
$COMPOSE down
}
function restart_services() {
echo -e "${YELLOW}Reiniciando servicios...${NC}"
$COMPOSE restart
sleep 3
$COMPOSE ps
}
function reset_all() {
echo -e "${RED}¡ADVERTENCIA! Esto borrará TODOS los datos.${NC}"
read -p "¿Estás seguro? (escribe 'SI' para confirmar): " confirm
if [ "$confirm" = "SI" ]; then
echo -e "${RED}Eliminando servicios y datos...${NC}"
$COMPOSE down -v
echo -e "${GREEN}Reiniciando servicios...${NC}"
$COMPOSE up -d
sleep 5
echo -e "${GREEN}Base de datos reinicializada con datos de prueba.${NC}"
else
echo -e "${YELLOW}Operación cancelada.${NC}"
fi
}
function connect_psql() {
echo -e "${GREEN}Conectando a PostgreSQL...${NC}"
echo -e "${YELLOW}Tip: usa \\q para salir${NC}"
$COMPOSE exec postgres psql -U $DB_USER -d $DB_NAME
}
function run_tests() {
echo -e "${GREEN}Ejecutando tests de validación...${NC}"
$COMPOSE exec -T postgres psql -U $DB_USER -d $DB_NAME < postgres/tests/test_all.sql
}
function run_queries() {
echo -e "${GREEN}Ejecutando queries de ejemplo...${NC}"
$COMPOSE exec -T postgres psql -U $DB_USER -d $DB_NAME < postgres/tests/example_queries.sql
}
function show_logs() {
echo -e "${GREEN}Mostrando logs de PostgreSQL...${NC}"
$COMPOSE logs -f postgres
}
function show_status() {
echo -e "${GREEN}Estado de servicios:${NC}"
$COMPOSE ps
}
function create_backup() {
BACKUP_FILE="backup_$(date +%Y%m%d_%H%M%S).sql"
echo -e "${GREEN}Creando backup en $BACKUP_FILE...${NC}"
$COMPOSE exec -T postgres pg_dump -U $DB_USER $DB_NAME > $BACKUP_FILE
echo -e "${GREEN}Backup creado exitosamente: $BACKUP_FILE${NC}"
}
function restore_backup() {
if [ -z "$1" ]; then
echo -e "${RED}Error: Debes especificar el archivo de backup${NC}"
echo "Uso: ./riocata.sh restore <archivo.sql>"
exit 1
fi
if [ ! -f "$1" ]; then
echo -e "${RED}Error: El archivo $1 no existe${NC}"
exit 1
fi
echo -e "${YELLOW}Restaurando backup desde $1...${NC}"
$COMPOSE exec -T postgres psql -U $DB_USER -d $DB_NAME < "$1"
echo -e "${GREEN}Backup restaurado exitosamente${NC}"
}
# Main
case "${1:-help}" in
start)
start_services
;;
stop)
stop_services
;;
restart)
restart_services
;;
reset)
reset_all
;;
psql)
connect_psql
;;
test)
run_tests
;;
queries)
run_queries
;;
logs)
show_logs
;;
status)
show_status
;;
backup)
create_backup
;;
restore)
restore_backup "$2"
;;
help|--help|-h)
show_help
;;
*)
echo -e "${RED}Comando desconocido: $1${NC}"
echo ""
show_help
exit 1
;;
esac