Tourify

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

Tourify is a mobile application designed to centralize the tourist experience: it brings together in one place the scattered information about cities, places, categories and events, letting users discover destinations, organize their favorites and engage with the community through reviews and event registrations.

Architecture and Tech Stack

Core Architecture

  • Frontend: Expo + React Native 0.81 with React 19 and React Navigation 7
  • Backend: Laravel 13 as a REST API (PHP 8.3)
  • Authentication: Laravel Sanctum (personal access tokens)
  • Database: MySQL with versioned migrations
  • Notifications: Expo Push Service

Layered Architecture

The project cleanly separates client and server in a monorepo:

  • frontend/ — Client app (Expo / React Native) for iOS, Android and Web
  • backend/ — REST API (Laravel 13)

Communication happens over HTTP/JSON, with Bearer tokens managed by Sanctum and stored securely on the device via Expo Secure Store.

Request Flow

Tools/Features at a Glance

Key Features

Tourist Exploration System

The app organizes content into a navigable hierarchy:

  • Cities: Main destinations with their associated places and events
  • Categories: Thematic classification of places (food, culture, nature, etc.)
  • Places: Points of interest with detail view, images and reviews
  • Events: Dated activities the user can register for

User Interaction

Tourify implements social and personalization features:

  • Favorites: Polymorphic relationship that lets users save both places and events
  • Reviews: Polymorphic rating system for places and events
  • Event registration: Sign-up and cancellation with a "my registrations" list
  • Notifications: Notification inbox with read-marking and real-time push

Authentication System

  • Token-based register, login and password recovery
  • Persistent session via Expo Secure Store
  • Protected routes with auth:sanctum middleware
  • /auth/me endpoint to hydrate the user profile

Technical Highlights

API-First Architecture

  • Public resources (cities, categories, places, events) accessible without authentication
  • Protected resources (favorites, reviews, registrations, notifications) behind Sanctum
  • RESTful controllers organized by resource

Administration System

A complete admin module exists, separate from the public API:

  • is_admin middleware for role-based access control
  • Panel with controllers for Dashboard, Users, Cities, Categories, Places, Events, Reviews and Notifications
  • Role model for permission management
  • Dual authentication: Sanctum bearer tokens secure the mobile API, while the admin panel authenticates through Laravel's session/cookie guard — same codebase, two auth mechanisms

Polymorphic Relationships

The data model leverages Eloquent polymorphism so that Favorites, Reviews and Images can attach to either places or events, avoiding table duplication and simplifying the logic.

Push Notifications

  • usePushNotifications requests permission and calls Notifications.getExpoPushTokenAsync() for a device-unique token
  • The token is POSTed to /push-token and persisted in the users.push_token column
  • Admins trigger notifications from /admin/notifications; the backend calls the Expo Push API and creates a Notification record
  • Token registration failures are non-fatal — the app keeps working even if it's offline on first launch

Project Structure

backend/
├── app/
│   ├── Http/Controllers/      # Public REST controllers
│   │   └── Admin/             # Admin panel controllers
│   ├── Http/Middleware/       # IsAdmin
│   └── Models/                # City, Category, Place, Event, Review...
├── database/migrations/       # Versioned schema
└── routes/api.php             # Endpoint definitions

frontend/
├── App.js / Router.js         # Entry point and navigation
├── context/                   # AuthContext (session state)
├── services/                  # post.js (API), storage.js
├── hooks/                     # Reusable hooks
└── views/
    ├── public/                # Screens (Explore, Home, Detail...)
    └── components/            # auth, common, detail, explore, home

Data Model

Main entities: Users, Cities, Categories, Places, Events, Favorites, Reviews, Notifications, Images, Event Registrations, Roles.

  • A city groups places and events
  • A category classifies places
  • Favorites, reviews and images are polymorphic (places/events)
  • Users register for events (N:M relationship with extra data)

Impact and Scalability

  • Cross-platform: A single codebase for iOS, Android and Web thanks to Expo
  • Modular: The frontend/backend separation allows independent scaling and iteration
  • Extensible: The admin panel makes content management possible without touching code
  • Real-time: Push notifications keep users informed about events

Notes

This summary is based on the current project architecture with Laravel 13 (PHP 8.3) and React Native 0.81 / React 19. The API-first approach with Sanctum ensures a robust token-based security model, while the use of polymorphic relationships keeps the data schema clean and scalable.


© 2026 Felipe Giraldo