Tourify






Tourify es una aplicación móvil diseñada para centralizar la experiencia turística: reúne en un solo lugar la información dispersa sobre ciudades, lugares, categorías y eventos, permitiendo a los usuarios descubrir destinos, organizar sus favoritos e interactuar con la comunidad mediante reseñas e inscripciones a eventos.
Arquitectura y Stack Tecnológico
Arquitectura Central
- Frontend: Expo + React Native 0.81 con React 19 y React Navigation 7
- Backend: Laravel 13 como API REST (PHP 8.3)
- Autenticación: Laravel Sanctum (tokens de acceso personal)
- Base de datos: MySQL con migraciones versionadas
- Notificaciones: Expo Push Service
Arquitectura en Capas
El proyecto separa claramente cliente y servidor en un monorepo:
frontend/— App cliente (Expo / React Native) para iOS, Android y Webbackend/— API REST (Laravel 13)
La comunicación ocurre vía HTTP/JSON, con tokens Bearer gestionados por Sanctum y almacenados de forma segura en el dispositivo vía Expo Secure Store.
Flujo de una Petición
Herramientas/Funcionalidades de un Vistazo
Características Principales
Sistema de Exploración Turística
La app organiza el contenido en una jerarquía navegable:
- Ciudades: Destinos principales con sus lugares y eventos asociados
- Categorías: Clasificación temática de lugares (comida, cultura, naturaleza, etc.)
- Lugares: Puntos de interés con vista de detalle, imágenes y reseñas
- Eventos: Actividades con fecha a las que el usuario puede inscribirse
Interacción del Usuario
Tourify implementa funciones sociales y de personalización:
- Favoritos: Relación polimórfica que permite a los usuarios guardar tanto lugares como eventos
- Reseñas: Sistema de calificación polimórfico para lugares y eventos
- Inscripción a eventos: Registro y cancelación con una lista de "mis inscripciones"
- Notificaciones: Bandeja de notificaciones con marcado de leído y push en tiempo real
Sistema de Autenticación
- Registro, login y recuperación de contraseña basados en token
- Sesión persistente vía Expo Secure Store
- Rutas protegidas con middleware
auth:sanctum - Endpoint
/auth/mepara hidratar el perfil del usuario
Destacados Técnicos
Arquitectura API-First
- Recursos públicos (ciudades, categorías, lugares, eventos) accesibles sin autenticación
- Recursos protegidos (favoritos, reseñas, inscripciones, notificaciones) detrás de Sanctum
- Controladores RESTful organizados por recurso
Sistema de Administración
Existe un módulo de administración completo, separado de la API pública:
- Middleware
is_adminpara control de acceso basado en rol - Panel con controladores para Dashboard, Usuarios, Ciudades, Categorías, Lugares, Eventos, Reseñas y Notificaciones
- Modelo
Rolepara gestión de permisos - Autenticación dual: los tokens Bearer de Sanctum aseguran la API móvil, mientras que el panel de administración autentica mediante el guard de sesión/cookie de Laravel — el mismo código base, dos mecanismos de autenticación
Relaciones Polimórficas
El modelo de datos aprovecha el polimorfismo de Eloquent para que Favoritos, Reseñas e Imágenes puedan asociarse tanto a lugares como a eventos, evitando la duplicación de tablas y simplificando la lógica.
Notificaciones Push
usePushNotificationssolicita permiso y llama aNotifications.getExpoPushTokenAsync()para obtener un token único por dispositivo- El token se envía por POST a
/push-tokeny se persiste en la columnausers.push_token - Los administradores disparan notificaciones desde
/admin/notifications; el backend llama a la Expo Push API y crea un registroNotification - Los fallos en el registro del token no son fatales — la app sigue funcionando aunque esté offline en el primer inicio
Estructura del Proyecto
backend/
├── app/
│ ├── Http/Controllers/ # Controladores REST públicos
│ │ └── Admin/ # Controladores del panel de administración
│ ├── Http/Middleware/ # IsAdmin
│ └── Models/ # City, Category, Place, Event, Review...
├── database/migrations/ # Esquema versionado
└── routes/api.php # Definición de endpoints
frontend/
├── App.js / Router.js # Punto de entrada y navegación
├── context/ # AuthContext (estado de sesión)
├── services/ # post.js (API), storage.js
├── hooks/ # Hooks reutilizables
└── views/
├── public/ # Pantallas (Explore, Home, Detail...)
└── components/ # auth, common, detail, explore, homeModelo de Datos
Entidades principales: Users, Cities, Categories, Places, Events, Favorites, Reviews, Notifications, Images, Event Registrations, Roles.
- Una ciudad agrupa lugares y eventos
- Una categoría clasifica lugares
- Favoritos, reseñas e imágenes son polimórficos (lugares/eventos)
- Los usuarios se inscriben a eventos (relación N:M con datos adicionales)
Impacto y Escalabilidad
- Multiplataforma: Una sola base de código para iOS, Android y Web gracias a Expo
- Modular: La separación frontend/backend permite escalar e iterar de forma independiente
- Extensible: El panel de administración permite gestionar contenido sin tocar código
- Tiempo real: Las notificaciones push mantienen informados a los usuarios sobre eventos
Notas
Este resumen está basado en la arquitectura actual del proyecto con Laravel 13 (PHP 8.3) y React Native 0.81 / React 19. El enfoque API-first con Sanctum garantiza un modelo de seguridad robusto basado en tokens, mientras que el uso de relaciones polimórficas mantiene el esquema de datos limpio y escalable.