Tourify

ExpoReact NativeLaravelMySQL

Aplicación móvil multiplataforma para explorar ciudades, puntos de interés y eventos turísticos. Los usuarios pueden descubrir destinos, guardar favoritos, reseñar lugares, registrarse en eventos y recibir notificaciones push.


Tourify

Tourify · React Native · Expo · Laravel · MySQL

Tourify es una aplicación móvil diseñada para centralizar la experiencia turística: agrupa en un solo lugar la información dispersa sobre ciudades, lugares, categorías y eventos, permitiendo al usuario descubrir destinos, organizar sus favoritos e interactuar con la comunidad mediante reseñas y registros 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 personales)
  • Base de datos: MySQL con migraciones versionadas
  • Notificaciones: Expo Push Service

Arquitectura por Capas

El proyecto separa claramente cliente y servidor en un monorepo:

  • frontend/ — Aplicación cliente (Expo / React Native) para iOS, Android y Web
  • backend/ — API REST (Laravel 13)

La comunicación se realiza vía HTTP/JSON, con tokens Bearer gestionados por Sanctum y almacenados de forma segura en el dispositivo mediante Expo Secure Store.

Características Clave

Sistema de Exploración Turística

La aplicación 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 (gastronomía, cultura, naturaleza, etc.)
  • Lugares (Places): Puntos de interés con detalle, imágenes y reseñas
  • Eventos: Actividades con fecha en las que el usuario puede registrarse

Interacción del Usuario

Tourify implementa funciones sociales y de personalización:

  • Favoritos: Relación polimórfica que permite guardar tanto lugares como eventos
  • Reseñas: Sistema de valoraciones polimórfico para lugares y eventos
  • Registro a eventos: Inscripción y cancelación con listado de "mis registros"
  • Notificaciones: Bandeja de notificaciones con marcado de leídas y push en tiempo real

Sistema de Autenticación

  • Registro, inicio de sesión y recuperación de contraseña basados en tokens
  • Sesión persistente mediante Expo Secure Store
  • Rutas protegidas con middleware auth:sanctum
  • Endpoint /auth/me para hidratar el perfil del usuario

Aspectos Técnicos Destacados

Arquitectura API-First

  • Recursos públicos (ciudades, categorías, lugares, eventos) accesibles sin autenticación
  • Recursos protegidos (favoritos, reseñas, registros, notificaciones) tras Sanctum
  • Controladores RESTful organizados por recurso

Sistema de Administración

Existe un módulo administrativo completo separado de la API pública:

  • Middleware is_admin para control de acceso por rol
  • Panel con controladores de Dashboard, Usuarios, Ciudades, Categorías, Lugares, Eventos, Reseñas y Notificaciones
  • Modelo Role para la gestión de permisos

Relaciones Polimórficas

El modelo de datos aprovecha el polimorfismo de Eloquent para que Favoritos, Reseñas e Imágenes se asocien indistintamente a lugares o eventos, evitando duplicación de tablas y simplificando la lógica.

Notificaciones Push

  • Registro del token de dispositivo (/push-token)
  • Envío de notificaciones a través del servicio de Expo
  • Sincronización con la bandeja interna de notificaciones

Estructura del Proyecto

backend/
├── app/
│   ├── Http/Controllers/      # Controladores públicos REST
│   │   └── Admin/             # Controladores del panel admin
│   ├── 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         # 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 registran a eventos (relación N:M con datos extra)

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 administrativo facilita la gestión de contenido sin tocar código
  • Tiempo real: Las notificaciones push mantienen al usuario informado de eventos

Notas

Este resumen se basa 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.