# JobHero - Documento de Contexto **Última actualización:** 2026-01-29 **Autor:** Claude Opus 4.5 --- ## Resumen del Proyecto **JobHero** es una plataforma de marketplace/gig economy que conecta clientes con proveedores de servicios ("héroes"). Funciona como aplicación web y móvil (Android/iOS). --- ## Stack Tecnológico | Capa | Tecnología | |------|------------| | **Backend** | Laravel 11.0 (PHP 8.2+) | | **Frontend** | Angular 18 + Ionic 8 | | **Mobile** | Capacitor 6 (Android/iOS) | | **Base de Datos** | MySQL 8.0 | | **Servidor Web** | Nginx | | **Autenticación** | Laravel Passport (OAuth 2.0) | | **Pagos** | OpenPay | | **Notificaciones** | OneSignal | | **Mapas** | Google Maps API | --- ## Estructura de Directorios ``` /var/www/ ├── jobhero-backend/ # API Laravel │ ├── app/Http/Controllers/ # Controladores principales │ ├── app/Http/Middleware/ # CORS y otros middlewares │ ├── app/Models/ # Modelos Eloquent │ ├── config/ # Configuraciones │ ├── .env # Variables de entorno (NO en git) │ └── storage/logs/ # Logs de Laravel │ ├── jobhero-frontend/ # App Angular/Ionic │ ├── src/app/pages/ # Páginas de la app │ ├── src/app/services/ # Servicios HTTP │ ├── android/ # Proyecto Android Capacitor │ ├── www/ # Build compilado │ └── jobhero-release.keystore # Keystore para firmar APK │ └── JOBHERO_CONTEXTO.md # Este documento ``` --- ## URLs de Producción | Servicio | URL | |----------|-----| | **Frontend Web** | https://jobhero.consultoria-as.com | | **API Backend** | https://jobhero-api.consultoria-as.com | | **Gitea Frontend** | https://git.consultoria-as.com/CarlosTorres/Jobhero_front | | **Gitea Backend** | https://git.consultoria-as.com/CarlosTorres/Jobhero_back | --- ## Túneles Cloudflare Los servicios están expuestos a internet mediante Cloudflare Tunnels: | Hostname | Destino Local | |----------|---------------| | `jobhero.consultoria-as.com` | `http://localhost:80` | | `jobhero-api.consultoria-as.com` | `http://localhost:8080` | **Servicio:** `cloudflared.service` (systemd) **Nota:** Los registros DNS CNAME deben existir en Cloudflare apuntando al túnel. --- ## Configuración de Nginx **Frontend** (`/etc/nginx/sites-enabled/jobhero`): - Puerto: 80 - Root: `/var/www/jobhero-frontend/www` - SPA routing habilitado **Backend** (`/etc/nginx/sites-enabled/jobhero-backend`): - Puerto: 8080 - Root: `/var/www/jobhero-backend/public` - PHP-FPM: `unix:/var/run/php/php8.3-fpm.sock` --- ## Credenciales Importantes ### Keystore para APK (GUARDAR EN LUGAR SEGURO) - **Archivo:** `/var/www/jobhero-frontend/jobhero-release.keystore` - **Alias:** `jobhero` - **Contraseña:** `JobHero2024!` - **Validez:** 10,000 días ### Base de Datos - Ver `/var/www/jobhero-backend/.env` --- ## Usuarios de Prueba | Email | Nombre | |-------|--------| | `torch2196@gmail.com` | Admin | | `ialcarazsalazar@consultoria-as.com` | ivan | | `ialcarazsalazar@gmail.com` | alex | --- ## Comandos Útiles ### Compilar Frontend Web ```bash cd /var/www/jobhero-frontend npm run build ``` ### Compilar APK Android ```bash cd /var/www/jobhero-frontend npm run build npx cap sync android cd android export ANDROID_HOME=/opt/android-sdk ./gradlew assembleRelease # APK en: android/app/build/outputs/apk/release/app-release.apk ``` ### Limpiar Caché Laravel ```bash cd /var/www/jobhero-backend php artisan config:clear php artisan cache:clear php artisan route:clear ``` ### Reiniciar Servicios ```bash systemctl restart nginx systemctl restart php8.3-fpm systemctl restart cloudflared ``` ### Ver Logs ```bash # Laravel tail -f /var/www/jobhero-backend/storage/logs/laravel-$(date +%Y-%m-%d).log # Nginx tail -f /var/log/nginx/jobhero-backend-error.log tail -f /var/log/nginx/jobhero-frontend-error.log # Cloudflare Tunnel journalctl -u cloudflared -f ``` --- ## Problemas Resueltos en Esta Sesión ### 1. Configuración de Túneles Cloudflare - Se configuraron túneles para exponer la app fuera de la red local - Hostnames: `jobhero.consultoria-as.com` y `jobhero-api.consultoria-as.com` - Se crearon registros DNS CNAME en Cloudflare ### 2. CORS Duplicado - **Problema:** Nginx y Laravel ambos agregaban headers CORS, causando error "multiple values" - **Solución:** Se removieron los headers CORS de Nginx, dejando solo Laravel ### 3. URL de API Incorrecta - **Problema:** El frontend usaba `api.jobhero.consultoria-as.com` en vez de `jobhero-api.consultoria-as.com` - **Solución:** Se actualizó `env.service.ts` y se recompiló ### 4. Caché de Cloudflare - **Problema:** Cloudflare cacheaba versiones viejas del main.js - **Solución:** Se renombró main.js a main-vX.js para evitar caché ### 5. Timezone Incorrecto - **Problema:** Las postulaciones se creaban con 2 horas de diferencia - **Solución:** Se cambió de `America/Tijuana` a `America/Mexico_City` en `PostulationController.php` ### 6. Autocomplete de Dirección - **Problema:** No aparecía la lista hasta hacer clic en otro lugar - **Solución:** Se cambió `ionChange` a `ionInput` ### 7. GPS no Autocompletando - **Problema:** La dirección del GPS no se mostraba en el input - **Solución:** Se sincronizó `addressAutocomplete` con `myAddress` en `doGeocode()` ### 8. Número Interior - **Problema:** Se autollenaba incorrectamente con la localidad - **Solución:** Se removió el autollenado y se habilitó el campo para edición manual --- ## Archivos Modificados en Esta Sesión ### Backend - `app/Http/Middleware/Cors.php` - CORS actualizado - `app/Http/Controllers/PostulationController.php` - Timezone corregido - `.env` - URL de producción ### Frontend - `src/app/services/env.service.ts` - API_URL actualizada - `src/app/pages/category/category.page.ts` - GPS y autocomplete arreglados - `src/app/pages/category/category.page.html` - UI del formulario - `android/app/build.gradle` - Configuración de firma APK --- ## Próximos Pasos Sugeridos 1. **Probar todos los flujos** de la aplicación en producción 2. **Configurar HTTPS** correctamente si hay problemas de certificados 3. **Implementar CI/CD** para automatizar deployments 4. **Agregar monitoreo** (logs centralizados, alertas) 5. **Backup de base de datos** automatizado 6. **Revisar seguridad** - el token de Gitea está visible en los remotes --- ## Contacto Para dudas sobre este proyecto, revisar la documentación en los READMEs de cada repositorio o contactar al equipo de desarrollo.