Tourify

ExpoReact NativeLaravelMySQL
Tourify — 1
Tourify — 2
Tourify — 3
Tourify — 4
Tourify — 5
Tourify — 6

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 Web
  • backend/ — 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/me para 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_admin para control de acceso basado en rol
  • Panel con controladores para Dashboard, Usuarios, Ciudades, Categorías, Lugares, Eventos, Reseñas y Notificaciones
  • Modelo Role para 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

  • usePushNotifications solicita permiso y llama a Notifications.getExpoPushTokenAsync() para obtener un token único por dispositivo
  • El token se envía por POST a /push-token y se persiste en la columna users.push_token
  • Los administradores disparan notificaciones desde /admin/notifications; el backend llama a la Expo Push API y crea un registro Notification
  • 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, home

Modelo 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.