Turo Clone
Plataforma de alquiler de vehículos entre particulares inspirada en Turo.com. Aplicación web completa desarrollada con arquitectura modular basada en principios SOLID.
Descripción
Este proyecto es un clon funcional de Turo.com que permite a los usuarios buscar, reservar y gestionar alquileres de vehículos. Los propietarios pueden listar sus vehículos y los arrendatarios pueden buscar y reservar vehículos disponibles.
Características Principales
Funcionalidades Core
- Búsqueda y Filtrado: Búsqueda avanzada de vehículos por ubicación, fechas, tipo y precio con visualización en mapa estilo Airbnb (integración con Google Maps)
- Gestión de Vehículos: Sistema completo para que los propietarios gestionen sus vehículos
- Sistema de Reservas: Calendario de disponibilidad y gestión completa de reservas
- Pagos: Procesamiento seguro de transacciones
- Reseñas y Calificaciones: Sistema de feedback entre usuarios
- Mensajería: Comunicación en tiempo real entre propietarios y arrendatarios
- Notificaciones: Sistema de alertas y notificaciones para mantener a los usuarios informados
Flujos Críticos
Onboarding Host
Creación de perfil → KYC upload documento → Listar vehículo → Subir fotos → Publicar
Reserva Guest
Buscar → Elegir vehículo → Ver calendario → Seleccionar fechas → Ver precio final → Pagar → Notificación host → (Si no instantBook) Host acepta → Reserva confirmada y calendario bloqueado
Mensajería
Hilo por booking con notificaciones email/push
Check-in / Check-out
Host confirma entrega, marca inicio y fin; posibilidad de añadir "confirmation photos"
Claims
Subir fotos y formulario, admin procesa o simula pago de seguro
Alcance Mínimo Viable (MVP)
Prioridad Alta - Funciones Imprescindibles
Registro / Autenticación
- Autenticación de usuarios con email
- OAuth: Google y Apple
- Implementado con Appwrite Auth
Perfiles de Usuarios
- Roles: Guest (huésped) y Host (anfitrión)
- KYC light para hosts: datos personales y datos del vehículo
Gestión de Vehículos
- Crear/editar listado de vehículo
- Campos: título, descripción, fotos, atributos (marca, modelo, año, asientos, transmisión, features)
- Precio base por día
- Reglas de viaje
- Ubicación y calendario de disponibilidad
- Fotos almacenadas en Appwrite Storage
Búsqueda y Filtros
- Búsqueda por ubicación, fechas, precio
- Visualización en mapa estilo Airbnb con integración de Google Maps
- Búsqueda interactiva en mapa con marcadores de vehículos disponibles
- Filtros por tipo de vehículo, features
- Filtro por distancia de entrega
- Opciones de entrega/pickup
Página de Detalle del Vehículo
- Galería de fotos
- Mapa de ubicación
- Precio diario con desglose
- Políticas del vehículo
- Reseñas
- Calendario de disponibilidad
- Botón reservar/solicitar
Flujo de Reservas
- Seleccionar fechas
- Ver precio total (impuestos + fees + protección opcional)
- Pago con Stripe
- Confirmación de reserva
Mensajería
- Mensajería en-app para coordinación huésped-anfitrión
- Hilos de conversación por booking
Calendario y Disponibilidad
- Calendario de disponibilidad
- Bloqueo automático por reservas
Panel Host
- Ver reservas
- Aceptar/rechazar reservas (si no es instant booking)
- Administrar listado de vehículos
- Gestionar protección del vehículo
Panel Admin
- Moderación de listados
- Gestión de usuarios
- Transacciones y reportes
Funciones Avanzadas (Post-MVP)
- Integración de seguros/planes de protección con distintos planes y deducibles
- Pricing dinámico, "boosts" y reglas de descuentos
- Entrega en aeropuerto con fees incluidos en precio diario
- Calendar sync con Google Calendar
- Integración de telemetría (opcional)
- Ratings & reviews completos
- Claims flow y soporte al cliente
Roles y Permisos
Roles del Sistema
Guest (Huésped)
- Puede reservar vehículos
- Realizar pagos
- Dejar reseñas y calificaciones
- Comunicarse con hosts mediante mensajería
Host (Anfitrión)
- Crear y gestionar listados de vehículos
- Recibir pagos
- Elegir plan de protección
- Gestionar reservas (aceptar/rechazar)
- Administrar calendario de disponibilidad
Super-admin / Moderador
- Gestionar usuarios
- Moderar listados
- Gestionar transacciones
- Acceso a reportes y analytics
Implementación
- RBAC implementado en Appwrite con custom claims
- Guards en la capa de frontend para protección de páginas
- Permisos configurados en Appwrite Console por colección
Stack Tecnológico
- Frontend: Next.js 16 con Cache Components
- Lenguaje: TypeScript
- Estilos: Tailwind CSS
- UI Library: Shadcn/ui
- Validación: Zod v4
- Backend: Appwrite v18
- Arquitectura: SOLID con módulos que simulan microservicios
Arquitectura
El proyecto sigue una arquitectura modular basada en principios SOLID donde cada módulo es autocontenido con sus propios componentes, hooks, servicios y tipos. Esta estructura simula microservicios permitiendo que cada módulo sea independiente y fácil de mantener.
Estructura de Módulos
Cada módulo contiene:
- Componentes de presentación
- Hooks personalizados para lógica de estado
- Servicios con lógica de negocio
- Tipos TypeScript y schemas de validación Zod
Módulos del Sistema
- Autenticación - Login, registro y gestión de sesiones
- Usuarios - Perfiles y gestión de usuarios
- Vehículos - CRUD completo y gestión de vehículos
- Búsqueda - Búsqueda avanzada y filtrado
- Reservas - Sistema completo de reservas con calendario
- Pagos - Procesamiento de pagos
- Reseñas - Sistema de calificaciones y feedback
- Mensajería - Chat en tiempo real entre usuarios
- Notificaciones - Sistema de alertas y notificaciones
Configuración Inicial
Requisitos Previos
- Node.js instalado
- Cuenta de Appwrite configurada
- Variables de entorno configuradas
Variables de Entorno
Configurar las siguientes variables en un archivo .env.local:
- Endpoint de Appwrite
- ID del proyecto de Appwrite
- ID de la base de datos de Appwrite
Instalación
Instalar las dependencias del proyecto y ejecutar el servidor de desarrollo.
Configuración de Appwrite
El proyecto utiliza Appwrite SDK directamente desde el frontend sin necesidad de API routes intermedias. La autenticación y autorización son manejadas por Appwrite, y los permisos se configuran en Appwrite Console.
Base de Datos
Se requiere crear las siguientes colecciones en Appwrite:
- Usuarios
- Vehículos
- Reservas
- Pagos
- Reseñas
- Mensajes
- Notificaciones
Estructura del Proyecto
El proyecto está organizado en módulos independientes dentro de la carpeta modules/, cada uno con su propia estructura de componentes, hooks, servicios y tipos. Los componentes compartidos se encuentran en components/, y las configuraciones y utilidades en lib/.
Estructura de Directorios
turo-clone/
├── app/ # Next.js App Router
│ ├── (auth)/ # Grupo de rutas de autenticación
│ │ ├── login/
│ │ ├── register/
│ │ └── layout.tsx
│ ├── (public)/ # Rutas públicas
│ │ ├── page.tsx # Homepage
│ │ ├── search/
│ │ ├── vehicles/
│ │ │ └── [id]/
│ │ └── layout.tsx
│ ├── (dashboard)/ # Rutas protegidas
│ │ ├── dashboard/
│ │ │ ├── vehicles/
│ │ │ │ ├── create/
│ │ │ │ └── [id]/
│ │ │ └── page.tsx
│ │ ├── reservations/
│ │ ├── profile/
│ │ └── layout.tsx
│ ├── api/ # API Routes (solo para webhooks o integraciones externas)
│ ├── error.tsx # Manejo de errores global
│ ├── global-error.tsx # Manejo de errores críticos
│ ├── not-found.tsx # Página 404 global
│ ├── loading.tsx # Estado de carga global
│ ├── layout.tsx
│ └── globals.css
│
├── modules/ # Módulos del sistema (microservicios simulados)
│ ├── auth/
│ │ ├── components/ # Componentes de UI
│ │ ├── hooks/ # Custom hooks
│ │ ├── services/ # Lógica de negocio
│ │ ├── types/ # Tipos TypeScript
│ │ └── index.ts # Barrel exports
│ │
│ ├── users/
│ ├── vehicles/
│ ├── search/
│ ├── reservations/
│ ├── payments/
│ ├── reviews/
│ ├── messaging/
│ └── notifications/
│
├── components/ # Componentes compartidos
│ ├── ui/ # Componentes de shadcn/ui
│ ├── layout/ # Componentes de layout
│ └── common/ # Componentes comunes
│
├── lib/ # Utilidades y configuraciones
│ ├── utils.ts
│ ├── appwrite/ # Configuración de Appwrite
│ └── constants/
│
├── hooks/ # Hooks compartidos
├── types/ # Tipos globales
├── public/ # Archivos estáticos
├── config/ # Configuraciones
└── docs/ # Documentación del proyecto
Estructura de un Módulo
Cada módulo sigue esta estructura estándar:
modules/[module-name]/
├── components/ # Componentes de presentación
│ └── [Component].tsx
├── hooks/ # Custom hooks para lógica de estado
│ └── use[Feature].ts
├── services/ # Servicios de negocio (lógica pura)
│ └── [feature].service.ts
├── types/ # Definiciones de tipos TypeScript y schemas Zod
│ ├── [feature].types.ts # Tipos TypeScript
│ └── [feature].schemas.ts # Schemas de validación Zod
└── index.ts # Barrel exports para importaciones limpias