ComeTandil es una aplicación web moderna diseñada para explorar y reseñar los mejores lugares gastronómicos de la ciudad de Tandil.
Una vez dentro de la carpeta donde está el proyecto:
Ejecutar el script:
./full_test.shIngresar en el navegador a: http://localhost:8080
Una vez dentro de la app aparecerá un buscador con tags debajo, donde se puede encontrar un lugar. Luego en "Ver detalle" si se está logeado se podrán ver las reseñas que tiene el lugar y además crear y borrar reseñas. También si se está logueado, en el Header, aparecerá un título "Personas" donde se pueden buscar usuarios y ver las reseñas que tienen hechas junto con su foto de perfil. Por último, cada uno puede ver su propio perfil, cargar su foto/avatar y ver las reseñas hechas que también podrán eliminarse.
- ¿Qué hace?
- Levanta los contenedores con
docker compose. - Espera a que los servicios estén listos mediante la flag --wait (basado en los healthchecks definidos en el YAML)."
- Llama a otros scripts para insertar en la base de datos.
- Levanta los contenedores con
- ¿A quién llama?
init_db.shscripts/hurl/insertar_resenas.sh
Sirve para preparar la carga de datos iniciales fijos (usuarios base, categorías, lugares predefinidos) mediante SQL directo.
- ¿Qué hace?
- Prepara el entorno para la ejecución de SQL.
- Invoca al script ejecutor apuntando al archivo de datos (
inserts.sql).
- ¿A quién llama?
scripts/ejecutar_sql.sh.
- ¿Qué hace?
- Toma el archivo
inserts.sqllocal. - Usa
docker execpara inyectar ese archivo en el comandopsqldentro del contenedor activo.
- Toma el archivo
- ¿A quién llama?
- Al comando
docker exec(interactúa directamente con el contenedorcometandil-db-1).
- Al comando
Es el tester funcional. A diferencia de los anteriores que inyectan datos "por atrás" (SQL), este inserta datos "por el frente" (HTTP), simulando ser usuarios reales usando la App.
- ¿Qué hace?
- Se ubica en su propio directorio para encontrar assets (imágenes).
- Ejecuta flujos de prueba definidos en archivos
.hurl(Login, Crear Usuario, Subir Reseña). - Valida que el servidor responda con éxito (200 OK).
- ¿A quién llama?
- Al binario
hurl. - Utiliza archivos auxiliares como
avatar.jpgycreate_users.hurl.
- Al binario
La aplicación sigue un diseño modular para separar la lógica de negocio, la persistencia de datos y la presentación.
- Go (Golang): Actúa como el motor del servidor, gestionando el routing y la lógica de negocio en los handlers.
sqlc: Usado para escribir consultas SQL y generar automáticamente el código Go seguro y fuertemente tipado para interactuar con PostgreSQL.- MinIO: Se integra a través de su SDK de Go para manejar operaciones de almacenamiento de objetos (
UploadyDelete) en el bucket de avatares.
- Templ: Genera las vistas HTML del lado del servidor.
- HTMX: Permite que las interacciones del frontend (como el envío de formularios de reseñas o el borrado de elementos) se realicen mediante peticiones AJAX que devuelven solo HTML, que es insertado directamente en el DOM. Esto elimina la necesidad de API REST complejas y JavaScript.
- SuperTokens: Se ejecuta como un servicio independiente (a través de Docker) y proporciona los endpoints necesarios para el ciclo de autenticación. La aplicación Go lo integra mediante un middleware para proteger las rutas.
├── docker-compose.yml
├── Dockerfile.dev
├── full_test.sh
├── go.mod
├── go.sum
├── init_db.sh
├── internal
│ ├── auth
│ │ ├── middleware.go
│ │ └── supertokens.go
│ ├── db
│ │ ├── authSchema.sql
│ │ ├── minio.go
│ │ ├── pgerrcodes.go
│ │ └── sqlc
│ │ ├── generated
│ │ ├── queries
│ │ │ └── queries.sql
│ │ ├── schema
│ │ │ └── create.sql
│ │ └── sql.yaml
│ ├── handlers
│ │ ├── auth.go
│ │ ├── buscar_usuarios.go
│ │ ├── home.go
│ │ ├── images.go
│ │ ├── lugares.go
│ │ ├── perfil.go
│ │ └── resenias.go
│ ├── logic
│ │ ├── horario_lugar.go
│ │ ├── lugar.go
│ │ ├── lugar_tag.go
│ │ ├── resenia.go
│ │ ├── sigue.go
│ │ ├── tag.go
│ │ └── usuario.go
│ ├── tools
│ │ ├── extractIDFromURL.go
│ │ ├── float64toNumeric.go
│ │ ├── hash.go
│ │ ├── obtenerCoords.go
│ │ ├── readImages.go
│ │ └── timeConverter.go
│ └── views
│ ├── buscar_usuarios.templ
│ ├── buscar_usuarios_templ.go
│ ├── form_resenia_htmx.templ
│ ├── form_resenia_htmx_templ.go
│ ├── home.templ
│ ├── home_templ.go
│ ├── layout.templ
│ ├── layout_templ.go
│ ├── login.templ
│ ├── login_templ.go
│ ├── lugar_detalle.templ
│ ├── lugar_detalle_templ.go
│ ├── lugares_list.templ
│ ├── lugares_list_templ.go
│ ├── perfil.templ
│ ├── perfil_templ.go
│ ├── register.templ
│ ├── register_templ.go
│ ├── resenias_list.templ
│ └── resenias_list_templ.go
├── README.md
├── scripts
│ ├── borrar_bbdd.sh
│ ├── ejecutar_sql.sh
│ ├── hurl
│ │ ├── avatar.jpg
│ │ ├── create_users.hurl
│ │ ├── hurl
│ │ └── insertar_resenas.sh
│ ├── inserts.sql
│ └── instalar_herramientas.sh
├── server
│ └── main.go
├── static
│ ├── img
│ │ └── logo.png
│ └── styles.css