Sabores de Origen

Mapa completo de flujo de datos de la plataforma

App Movil (React Native) + API Backend (Laravel) + Servicios en la Nube (AWS)
📊
Resumen General del Sistema
Vision de alto nivel de toda la plataforma
85+
Endpoints API
20+
Pantallas en App
18
Modelos de Datos
6
Servicios Externos
5
Canales WebSocket
3
Tipos de Usuario
Que hace esta aplicacion?

Sabores de Origen es una plataforma de comercio electronico movil especializada en productos artesanales mexicanos del Rancho Cuatro Granas. Los clientes navegan un catalogo de productos, los agregan al carrito, eligen fecha y horario de entrega, pagan con tarjeta (Stripe) o en efectivo (OXXO), y reciben sus productos a domicilio con seguimiento en tiempo real.


El sistema tiene tres tipos de usuario:

  • Clientes — navegan, compran y reciben productos (incluye invitados sin cuenta)
  • Repartidores — reciben pedidos asignados, navegan a la direccion y confirman entrega
  • Administradores — gestionan productos, pedidos, promociones y usuarios desde un panel web
🏗️
Arquitectura del Sistema
Componentes principales y como se conectan
📱
App Movil (FAMAC)
React Native · iOS & Android
API Backend
Laravel 10+ · PHP · REST API
🗄️
Base de Datos
MySQL · 18+ tablas
☁️
Infraestructura
AWS Lambda · S3 · CloudFront
💳
Pagos
Stripe · Tarjeta · OXXO
🔔
Notificaciones
Firebase FCM · Pusher
Flujo General de Comunicacion
Usuario
📱 App Movil
React Native
HTTP
Axios + JWT
Bearer Token
API
occrproductos.com.mx/api
REST Endpoints
Logica
Laravel Controllers
Validacion + Negocio
Datos
MySQL
Eloquent ORM
🔐
Modulo de Autenticacion
Registro, inicio de sesion, recuperacion de contrasena y acceso como invitado
🔑 Inicio de Sesion (Login)
Pantalla
Login.jsx
Email + Contrasena
Endpoint
POST /api/login
{email, password}
Controller
AuthenticatedSessionController
Valida credenciales, genera token JWT
Modelo
User
Tabla: users
Respuesta
{user, token}
Se guarda en AsyncStorage
Post-login: Se configura interceptor Axios con "Authorization: Bearer {token}" para todas las peticiones siguientes. Si el token expira (401), se hace logout automatico.
🔵 Login con Google
Accion
Boton "Google"
Google Sign-In SDK
Externo
Google OAuth
Devuelve credential
Endpoint
POST /api/auth/google
{credential, email, first_name, last_name, provider: "google"}
Logica
WebSiteController
Crea o busca usuario, genera token
Resultado
{user, token}
Acceso inmediato
🍎 Login con Apple
Accion
Boton "Apple"
Apple Authentication SDK
Externo
Apple Sign-In
Devuelve identity_token + user_id
Endpoint
POST /api/auth/apple
{identity_token, user_id, email?}
Logica
WebSiteController
Valida token, crea/busca usuario
Resultado
{user, token}
Email puede ser "relay" de Apple
Nota: Apple puede ocultar el email real del usuario. El sistema detecta esto y marca el email como tipo "proxy".
📝 Registro de Usuario
Pantalla
Signup.jsx
Nombre, email, contrasena, telefono, fecha nacimiento
Validacion
Formik + Yup
Email valido, contrasena min 8 chars, telefono mexicano 10 digitos
Endpoint
POST /api/register
{name, email, password, phone, dob, usertype:"User"}
Controller
RegisteredUserController
Crea usuario, envia email bienvenida, genera token
Modelo
User (nuevo registro)
+ migracion de carrito invitado
Post-registro: Si el usuario tenia un carrito como invitado, los productos se migran a su nueva cuenta (combinando cantidades de productos duplicados).
👤 Acceso como Invitado
Accion
"Continuar sin cuenta"
Se pide solo email
Estado
AuthContext
loginAsGuest(email) — sin token JWT
Resultado
Navegacion completa
Carrito, compra, historial — todo por email
Capacidades del invitado: puede navegar catalogo, agregar al carrito, hacer pedidos, ver historial de pedidos, y guardar una direccion. Todo se identifica por email.
🔄 Recuperacion de Contrasena
Pantalla
ForgotPassword.jsx
Ingresa email
Endpoint
POST /api/forgetpasswordlink
{email}
Logica
PasswordResetLinkController
Envia link de reset por email (SMTP Hostinger)
Resultado
Email enviado
Link abre formulario web de reset
🛍️
Modulo de Catalogo
Categorias, productos, busqueda y detalle de producto
📂 Listado de Categorias
Pantalla
CategoriesList.jsx
Pantalla principal / Home
Endpoint
GET /api/productscats
Sin parametros
Controller
ControllsController
getInverterscats() — consulta Modules
Modelo
Modules
Tabla: modules (name, photo, description)
Resultado
Grid de categorias
Imagen + nombre por categoria
📦 Productos por Categoria
Pantalla
SpecificCategoryProduct.jsx
Tap en una categoria
Endpoint
GET /api/products/{category}
category = nombre de la categoria
Controller
ControllsController
getInverters() — filtra por module_id
Modelo
Inverters + ProductImage
Tabla: inverters con imagenes
Resultado
Grid 2 columnas
Nombre, precio, descuento, foto, unidad
🔍 Busqueda de Productos
Pantalla
SearchResults.jsx
Barra de busqueda en Home
Endpoint
GET /api/products
Trae todos los productos
Filtrado
Client-side
Filtra por nombre o categoria que contenga el texto
Resultado
Lista filtrada
Misma grid que categoria
🏷️ Detalle de Producto
Pantalla
ProductDetails.jsx
Tap en un producto
Datos
Route Params
No hace llamada API — datos ya cargados
Muestra
Carrusel imagenes
Nombre, precio, descuento, unidad, descripcion, selector cantidad
Agregar al carrito: El usuario selecciona cantidad y toca "Agregar". Esto actualiza el CartContext localmente y luego sincroniza con el backend.
🛒
Modulo de Carrito
Gestion del carrito de compras, persistencia y sincronizacion
🛒 Gestion del Carrito
Accion
Agregar/Quitar producto
Desde ProductDetails o Cart
Estado
CartContext
Actualizacion inmediata en memoria
Sync (500ms)
POST /api/cart/save
{user_id o email, cart_data: [items]}
Controller
CartController
saveCart() — guarda JSON en users.cart_data
Almacen
users.cart_data (JSON)
O guest_addresses.cart_data para invitados
OperacionMetodoEndpointDescripcion
GuardarPOST/api/cart/saveSincroniza carrito con backend (debounce 500ms)
CargarPOST/api/cart/getRecupera carrito al iniciar sesion
LimpiarPOST/api/cart/clearVacia el carrito tras compra exitosa
MigrarPOST/api/cart/migrateFusiona carrito de invitado a usuario registrado
ActividadPOST/api/cart-activityRegistra actividad para expiracion 24h
Expiracion: Los carritos expiran automaticamente despues de 24 horas de inactividad. Un cron job ejecuta la limpieza periodicamente.
💰 Calculo de Precios
ConceptoFormula
Subtotal brutoSuma (precio x cantidad) por cada producto
Descuento por productoSuma (descuento x cantidad) — descuentos individuales
Subtotal netoSubtotal bruto - descuentos de producto
Descuento promocionalSubtotal neto x (promotional_discount / 100)
Cupon (si aplica)Porcentaje o monto fijo sobre total o envio
Costo de envioGratis si subtotal >= umbral, o tarifa fija
Total finalSubtotal - promos - cupon + envio
💳
Modulo de Pago y Pedido
Proceso completo de checkout: direccion, fecha, pago y confirmacion
🔄 Flujo Completo de Checkout

El proceso de compra sigue estos pasos en orden:

1
Revisar Carrito
Productos, cantidades y precios
2
Seleccionar Direccion
De las guardadas o nueva
3
Fecha y Horario
Dia y franja horaria de entrega
4
Cupon (opcional)
Codigo de descuento
5
Pagar con Stripe
Tarjeta o OXXO
6
Confirmacion
Pedido creado exitosamente
💳 Procesamiento de Pago (Stripe)
Accion
Tap "Pagar"
Cart.jsx
Paso 1
POST /api/create-payment-intent
{user_id, amount, currency:"MXN"}
Stripe API
PaymentIntent creado
Devuelve client_secret
Paso 2
Payment Sheet
SDK Stripe muestra formulario de tarjeta
Confirmacion
Pago exitoso
Se procede a crear el pedido
Webhook: Stripe envia confirmacion a POST /api/stripe/webhook → ControllsController@handle valida la firma y actualiza el payment_status del pedido a "paid".
📋 Creacion del Pedido
Datos
Cart.jsx recopila todo
Items + direccion + fecha + pago
Endpoint
POST /api/ordersubmit
{user_id, cart_items, subtotal, total, shipping_cost, delivery_date, delivery_slot, address, phone, coupon_code, payment_intent_id, need_invoice}
Controller
RegisteredUserController@orderSubs
Valida cupon en backend, calcula totales, crea Order + OrderDetails
Modelos
Order + Ordedetail
order_number: #YYMMDD-XXXXXX
Resultado
{order_id, status:"Open"}
+ notificacion push al admin + email confirmacion
Validacion BackendDescripcion
CuponRe-valida en el servidor (previene manipulacion desde frontend)
PreciosRecalcula totales con precios del catalogo actual
StockVerifica disponibilidad
DuplicadosPreviene incremento doble de uso de cupon por webhook
📦
Modulo de Pedidos
Historial, detalle, estados y seguimiento de pedidos
📊 Estados del Pedido
⏳ Processing Payment📋 Open🔧 Pending🚚 On the Way✅ Delivered
❌ Cancelled— puede ocurrir en cualquier punto antes de "Delivered"
📜 Historial de Pedidos
Pantalla
Order.jsx
Tab "Pedidos" en navegacion
Endpoint
GET /api/orderhistory/{userId}
O /api/guest/orders/{email} para invitados
Controller
RegisteredUserController
orderHistory() — ordena por fecha desc
Vista
Tabs: Activas | Entregadas | Canceladas
Auto-refresh cada 15s (5s para drivers)
📄 Detalle del Pedido
Pantalla
OrderDetail.jsx
Tap en un pedido
Datos
Via Route Params
Datos del pedido ya cargados
Muestra
Desglose completo
Productos, precios, direccion, fecha, estado, factura
Acciones disponibles: Ver factura (PDF), enviar comentario/queja, chat con repartidor, seguimiento en mapa.
🚚
Modulo de Entregas
Configuracion de entregas, seguimiento y repartidores
📅 Seleccion de Fecha y Horario
Componente
DeliverySlotPicker.jsx
Dentro de Cart.jsx
Endpoint
GET /api/delivery-days
Calcula dias disponibles segun configuracion
Modelos
DeliveryDay + DeliveryTimeSlot
Dias activos + franjas horarias no vencidas
Resultado
Max 4 fechas futuras
Cada una con sus horarios disponibles
📦 Costo de Envio
Consulta
Cart.jsx
Al cargar el carrito
Endpoint
GET /api/shipping-config
Configuracion de envio
Modelo
ShippingConfig
min_order_for_free_shipping, standard_shipping_fee
Logica
Gratis si subtotal >= umbral
O tarifa estandar si es menor
Motivacion: GET /api/shipping-motivation/{subtotal} devuelve cuanto falta para envio gratis (ej: "Agrega $50 mas para envio gratis").
📍 Seguimiento de Repartidor
Pantallas
DriverTracking / CustomerTracking
Vista del repartidor y del cliente
WebSocket
WS order.{orderId}
Canal Pusher en tiempo real
Envio ubicacion
POST /api/driverlocsubmit
{orderid, driver_lat, driver_long}
Modelo
Driverloc
Tabla: driverlocs
👤
Modulo de Perfil
Datos personales, contrasena y configuracion de cuenta
👤 Gestion del Perfil
AccionMetodoEndpointDatos
Ver perfilGET/api/userdetails/{userId}nombre, email, telefono, direccion, cumpleanos
Actualizar perfilPOST/api/updateuserprofile{userid, first_name, last_name, phone, dob}
Cambiar contrasenaPOST/api/updateusepassword{userid, current_password, new_password}
Eliminar cuentaPOST/api/deleteuser{userid} — marca user_was_deleted, conserva historial
Verificar emailPOST/api/check-email-exists{email} — verifica si ya existe
Eliminacion segura: Al eliminar una cuenta, el sistema conserva el historial de pedidos (user_was_deleted=true) y limpia datos sensibles. Las ordenes quedan vinculadas por email.
📍
Modulo de Direcciones
Gestion de direcciones para usuarios registrados e invitados
📍 Sistema de Direcciones

👤 Usuarios Registrados

  • Maximo 3 direcciones
  • Una puede ser "principal"
  • Modelo: UserAddress
  • Tabla: user_addresses

👻 Invitados

  • 1 direccion por email
  • Persistente entre sesiones
  • Modelo: GuestAddress
  • Tabla: guest_addresses
AccionMetodoEndpoint (Registrados)Endpoint (Invitados)
ListarGET/api/user/{userId}/addresses/api/guest/address/{email}
CrearPOST/api/user/addresses/api/guest/address
EditarPUT/api/user/addresses/{id}/api/guest/address (sobreescribe)
EliminarDELETE/api/user/addresses/{id}N/A
Marcar principalPOST/api/user/addresses/{id}/primaryN/A
Formulario: AddressFormUberStyle.jsx — campos estructurados (calle, numero, colonia, CP, municipio/alcaldia, estado). Incluye validacion de codigo postal mexicano y geocodificacion con Google Maps para obtener coordenadas.
🎁
Modulo de Promociones y Cupones
Descuentos automaticos, cupones manuales y beneficios especiales
🎟️ Sistema de Cupones
Componente
CouponInput.jsx
Campo en el carrito
Endpoint
POST /api/validate-coupon
{coupon_code, subtotal, shipping_cost, user_email}
Validaciones
ControllsController
Codigo valido, no expirado, monto minimo, usos disponibles
Modelo
Proposalbattery
is_coupon=true, max_uses, current_uses
Resultado
Descuento aplicado
% o monto fijo, sobre total o envio
🎁 Promociones Automaticas
Trigger
CartContext
Se consultan al cargar carrito (600ms debounce)
Endpoint
POST /api/get-automatic-promotions
{subtotal, user_email}
Filtrado
Por tipo de usuario
Verifica elegibilidad segun perfil
Resultado
Descuento aplicado automaticamente
Sin codigo necesario
TipoAplica aCondicion
GlobalTodos los usuariosDentro de fechas vigentes
IndividualUsuario especificoAsignado por admin
BirthdayUsuario en mes de cumpleanosDOB coincide con mes actual
GuestSolo invitadosUsuario no registrado
GoogleUsuarios de Google OAuthprovider = "google"
AppleUsuarios de Apple Sign-Inprovider = "apple"
NormalUsuarios sin OAuthRegistro directo con email
🔔
Modulo de Notificaciones
Push notifications, emails y comunicacion con el usuario
🔔 Notificaciones Push (Firebase FCM)
Trigger
Evento en backend
Pago, cambio de estado, chat, etc.
Servicio
FirebaseNotificationService
sendToDevice / sendOrderStatusNotification
Firebase
FCM Cloud
Enruta al dispositivo correcto
Dispositivo
NotificationService.js
Muestra push notification / in-app

Notificaciones al Cliente

EventoTituloMensajeTrigger
Pago confirmado🎉 ¡Pedido Confirmado!Tu pedido #N esta listo. Pago de $X recibido.Stripe webhook: payment_intent.succeeded
Pago fallido💳 Problema con el pagoEl pago de tu pedido #N no pudo procesarse. Intenta de nuevo.Stripe webhook: payment_intent.payment_failed
Pago OXXO pendiente📋 ¡Pedido confirmado! Pago pendienteTu pedido #N ha sido confirmado. Ve a OXXO a completar tu pago.Stripe webhook: requires_action
Pedido gratuito🎉 ¡Pedido Confirmado!Tu pedido #N ha sido confirmado. ¡Disfruta tu compra gratuita!Admin crea pedido gratuito
Preparando pedido👨‍🍳 Preparando tu PedidoEstamos preparando tu pedido #N con mucho carino.Admin cambia status a "preparing"
Pedido listo📦 Pedido ListoTu pedido #N esta listo y esperando al repartidor.Admin cambia status a "ready"
Repartidor asignado🛵 Repartidor Asignado{nombre} llevara tu pedido #N.Repartidor inicia ruta
En camino🚗 ¡En Camino!¡Tu pedido esta en camino! {nombre} lo esta llevando. Total: $X 🚚Repartidor envia primera ubicacion
Llegando📍 ¡Tu pedido esta llegando!Tu repartidor esta a solo {X} metros de tu ubicacion. ¡Preparate!Repartidor a menos de 500m
Entregado🎉 ¡Entregado!¡Pedido entregado exitosamente! Total: $X - ¡Esperamos que lo disfrutes! 🎉Repartidor marca como entregado
Problema con pedido⚠️ Problema con tu pedidoEl repartidor tuvo un problema y no pudo completar la entrega.Repartidor cancela/rechaza entrega
Mensaje de chat💬 Mensaje del Repartidor{nombre}: {mensaje} (primeros 60 caracteres)Repartidor envia mensaje en chat

Notificaciones al Repartidor

EventoTituloMensajeTrigger
Nuevo pedido asignado📦 Nuevo Pedido¡Tienes un nuevo pedido! #N. Revisa los detalles.Admin asigna repartidor al pedido
Pedido cancelado por cliente❌ Pedido canceladoEl cliente ha cancelado el pedido #N.Cliente cancela pedido activo
Mensaje de chat💬 Nuevo Mensaje{nombre}: {mensaje} (primeros 60 caracteres)Cliente envia mensaje en chat

Notificaciones al Admin

EventoTituloMensajeTrigger
Repartidor rechaza pedido⚠️ Pedido #N Rechazado{nombre} rechazo el pedido. Razon: {razon}Repartidor rechaza pedido asignado
Soporte para invitados: Los usuarios invitados tambien reciben push notifications mediante su fcm_token almacenado en GuestAddress. El token se valida con session_id para garantizar entrega al dispositivo correcto.
💬 Notificaciones por WhatsApp (Admin)
Trigger
Evento en backend
Pedido nuevo, cancelacion, feedback
Servicio
WhatsAppService
sendTemplate() / sendMessage()
WhatsApp
Business API (Meta)
Templates pre-aprobados
Destino
Telefono del Admin
Numero configurado en .env
TemplateEventoParametrosDestinatario
admin_nuevo_pedidoNuevo pedido creadoNumero de orden, nombre cliente, total, fecha y hora de entrega, direccion, RFC/facturaAdmin
_admin_pedido_canceladoPedido canceladoNumero de orden, nombre cliente, cancelado por, razon, totalAdmin
admin_nuevo_feedbackCliente envia feedbackNombre del cliente, email, mensaje (max 100 chars)Admin
otp_verificationVerificacion de telefonoCodigo OTP de 6 digitosCliente
Texto planoRepartidor rechaza pedidoNumero de orden, nombre repartidor, razon del rechazoAdmin
Configuracion: Los numeros de WhatsApp del admin se configuran en notifications.admin.whatsapp. El sistema verifica credenciales de la API antes de enviar. Si WhatsApp no esta disponible, se usan canales alternativos (email + SMS).
📧 Notificaciones por Email
EmailTriggerDestinatario
BienvenidaNuevo registroUsuario
Confirmacion de pedidoPedido creadoUsuario
Nuevo pedido (admin)Pedido creadoAdmin
Pedido entregadoStatus = DeliveredUsuario
Pedido canceladoStatus = CancelledUsuario
Reset de contrasenaSolicitud de resetUsuario
OTP verificacionRegistro / verificacionUsuario
Proveedor: SMTP via Hostinger. El sistema detecta si el email del usuario es real, proxy (Apple) o generado, y ajusta la estrategia de comunicacion.
📱 Verificacion SMS / OTP
EndpointMetodoServicioDescripcion
/api/otp/sendPOSTEmailEnvia codigo OTP por correo
/api/otp/verifyPOSTEmailVerifica codigo OTP
/api/sms/sendPOSTAWS SNS / WhatsAppEnvia OTP por SMS o WhatsApp segun config
/api/sms/verifyPOSTAWS SNS / WhatsAppVerifica codigo SMS o WhatsApp
/api/guest/email/send-otpPOSTEmailOTP para verificar email de invitado
Comunicacion en Tiempo Real
WebSockets (Pusher), canales y eventos en vivo
⚡ Canales WebSocket (Pusher)
CanalEventoDatosUso
order.{orderId}statusNuevo estado del pedidoActualizar badge y lista de pedidos
order.{orderId}location{driver_lat, driver_long}Mover pin del repartidor en mapa
order.{orderId}chat{sender, message, timestamp}Mensajes entre cliente y repartidor
user.{userId}.ordersupdateLista de pedidos actualizadaRefrescar automaticamente lista de pedidos
guest.{emailHash}.ordersupdateLista de pedidos del invitadoRefrescar pedidos del invitado
user.{userId}account_deletedSenal de cuenta eliminadaForzar logout en todos los dispositivos
Fallback: Si la conexion WebSocket falla, el sistema cae a polling HTTP (cada 15s para usuarios, 5s para repartidores).
💬 Chat de Pedido
Pantalla
Chat.jsx
Dentro de OrderDetail
Enviar
POST /api/msgsubmit
{orderid, sender, message}
Modelo
Communicationord
Tabla: communicationords
Broadcast
Pusher → chat.{orderId}
Mensaje llega en tiempo real
⚙️
Panel de Administracion (Web)
Dashboard, gestion de productos, pedidos, usuarios y configuracion
📊 Modulos del Panel Admin
📊
Dashboard
Resumen diario, metricas, exportacion
📦
Productos
CRUD completo + imagenes multiples
📂
Categorias
CRUD de modulos/categorias
📋
Pedidos
Ver, filtrar, cambiar estado, exportar
👥
Usuarios
Clientes, repartidores, staff
🎁
Promociones
Cupones y promos automaticas
🚚
Entregas
Dias, horarios, costo de envio
📸
Instagram
Feed manual + URLs
📊
Inventario
Stock y logs de actividad
🗄️
Modelos de Base de Datos
Tablas principales, campos y relaciones entre modelos
👤 User (users)
id, first_name, last_name, emailstring
password, usertypestring/enum
phone, dob, addressstring/date
provider, apple_idOAuth info
fcm_token, session_idpush/session
cart_data, cart_updated_atJSON/datetime
promotion_id, promotional_discountint/decimal
email_type, has_real_emailenum/bool
→ hasMany: UserAddress, Order
📦 Order (orders)
userid, order_number, ordernoint/string
status, status_spanishenum
delivery_date, delivery_slotdate/string
delivery_address, customer_lat/longstring/decimal
subtotal, shipping_cost, total_amountdecimal
payment_status, payment_idenum/string
coupon_code, discount_amountstring/decimal
dman (driver ID)int
→ belongsTo: User | → hasMany: Ordedetail
📝 Ordedetail (ordedetails)
userid, ordernoint/string
item_name, item_pricestring/decimal
item_qty, item_imageint/string
→ belongsTo: Order
🏷️ Inverters / Productos (inverters)
name, unit, quantity, stockstring/int
module_id (categoria FK)int
price, discount, costdecimal
photo, descriptionstring/text
→ belongsTo: Modules | → hasMany: ProductImage
📂 Modules / Categorias (modules)
name, photo, descriptionstring
→ hasMany: Inverters (productos)
🎁 Proposalbattery (proposalbatteries)
name, coupon_codestring
discount, discount_typedecimal/enum
from, to (rango fechas)date
type, is_coupon, applies_toenum/bool
max_uses, current_usesint
minimum_amount, benefitsdecimal/JSON
📍 UserAddress (user_addresses)
user_id, addressint/string
latitude, longitudedecimal:8
phone, label, is_primarystring/bool
→ belongsTo: User (max 3 por usuario)
👻 GuestAddress (guest_addresses)
guest_email (unique)string
address, latitude, longitudestring/decimal
phone, fcm_tokenstring
cart_data, delivery_infoJSON
1 direccion por email de invitado
☁️
Servicios Externos
Integraciones con terceros y servicios en la nube
Mapa de Integraciones
ServicioPropositoConexionDatos que fluyen
💳 StripeProcesamiento de pagosAPI REST + WebhookMontos en MXN, payment intents, confirmaciones. Soporta tarjeta y OXXO.
🔥 Firebase (FCM)Push notificationsFirebase Admin SDKTokens FCM, titulos, cuerpos de notificacion, datos extras
📡 PusherWebSockets en tiempo realPusher SDKEventos de estado, ubicacion de driver, mensajes de chat
☁️ AWS LambdaHosting serverless del backendServerless FrameworkToda la API Laravel corre como funcion Lambda
📦 AWS S3Almacenamiento de archivosAWS SDKImagenes de productos, fotos de perfil, facturas
🌐 AWS CloudFrontCDN para archivos estaticosDistribucion CDNURLs de imagenes transformadas a CDN
📱 AWS SNSSMS / OTPAWS SNS APICodigos OTP a numeros de telefono (formato E.164)
🔵 Google OAuthAutenticacion socialOAuth 2.0Credenciales, email, nombre del usuario
🍎 Apple Sign-InAutenticacion social (iOS)Apple JWTIdentity token, user ID, email (puede ser relay)
📧 Hostinger SMTPEnvio de emailsSMTPCorreos transaccionales (confirmaciones, OTP, resets)
🗺️ Google MapsGeocodificacionGeocoding APIDireccion texto a coordenadas lat/long
📡
Referencia Completa de Endpoints
Todos los endpoints de la API organizados por modulo
Endpoints usados por la App Movil
ModuloMetodoEndpointControladorDescripcion
AuthPOST/api/loginAuthenticatedSessionControllerIniciar sesion
AuthPOST/api/registerRegisteredUserControllerRegistro de usuario
AuthPOST/api/auth/googleWebSiteControllerLogin con Google
AuthPOST/api/auth/appleWebSiteControllerLogin con Apple
AuthPOST/api/forgetpasswordlinkPasswordResetLinkControllerEnviar link de reset
CatalogoGET/api/products/{category?}ControllsControllerProductos por categoria
CatalogoGET/api/productscatsControllsControllerListar categorias
CarritoPOST/api/cart/saveCartControllerGuardar carrito
CarritoPOST/api/cart/getCartControllerRecuperar carrito
CarritoPOST/api/cart/clearCartControllerLimpiar carrito
CarritoPOST/api/cart/migrateCartControllerMigrar carrito invitado a usuario
CarritoPOST/api/cart-activityControllsControllerRegistrar actividad del carrito
PedidosPOST/api/ordersubmitRegisteredUserControllerCrear pedido
PedidosGET/api/orderhistory/{userid}RegisteredUserControllerHistorial de pedidos
PedidosGET/api/orderdetails/{orderid}RegisteredUserControllerDetalle de pedido
PedidosPOST/api/orderdelRegisteredUserControllerMarcar como entregado
PedidosPOST/api/orders/cancelControllsControllerCancelar pedido
PedidosPOST/api/migrateordersRegisteredUserControllerMigrar pedidos de invitado
InvitadosGET/api/guest/orders/{email}RegisteredUserControllerPedidos de invitado
InvitadosPOST/api/guest/addressRegisteredUserControllerGuardar direccion invitado
InvitadosGET/api/guest/address/{email}RegisteredUserControllerObtener direccion invitado
PagosPOST/api/create-payment-intentControllsControllerCrear intento de pago Stripe
DireccionesGET/api/user/{userId}/addressesRegisteredUserControllerListar direcciones
DireccionesPOST/api/user/addressesRegisteredUserControllerAgregar direccion (max 3)
DireccionesPUT/api/user/addresses/{id}RegisteredUserControllerEditar direccion
DireccionesDELETE/api/user/addresses/{id}RegisteredUserControllerEliminar direccion
DireccionesPOST/api/user/addresses/{id}/primaryRegisteredUserControllerMarcar como principal
DireccionesPOST/api/addaddressRegisteredUserControllerAgregar direccion (legacy)
DireccionesGET/api/fetch_address/{id}RegisteredUserControllerObtener direcciones (legacy)
DireccionesGET/api/fetch_address_single_edit/{id}RegisteredUserControllerObtener direccion para editar (legacy)
DireccionesPOST/api/updateaddressRegisteredUserControllerActualizar direccion (legacy)
DireccionesPOST/api/deleteaddressRegisteredUserControllerEliminar direccion (legacy)
EntregasGET/api/delivery-daysControllsControllerDias de entrega disponibles
EntregasGET/api/fetch_ddates/{ddate}ControllsControllerHorarios disponibles por fecha
EntregasGET/api/shipping-configControllsControllerConfiguracion de envio
EntregasGET/api/shipping-motivation/{subtotal}ControllsControllerMonto para envio gratis
EntregasPOST/api/delivery-info/saveRegisteredUserControllerGuardar info de entrega
EntregasPOST/api/delivery-info/getRegisteredUserControllerObtener info de entrega
PromosPOST/api/validate-couponControllsControllerValidar cupon
PromosPOST/api/get-automatic-promotionsControllsControllerPromociones automaticas
PerfilGET/api/userdetails/{userid}RegisteredUserControllerDatos del usuario
PerfilPOST/api/updateuserprofileRegisteredUserControllerActualizar perfil
PerfilPOST/api/updateusepasswordPasswordControllerCambiar contrasena
PerfilPOST/api/deleteuserRegisteredUserControllerEliminar cuenta
PerfilPOST/api/check-email-existsRegisteredUserControllerVerificar email existente
OTPPOST/api/otp/sendOTPControllerEnviar OTP por email
OTPPOST/api/otp/verifyOTPControllerVerificar OTP
OTPPOST/api/guest/email/send-otpOTPControllerOTP para invitado
OTPPOST/api/guest/email/verify-otpOTPControllerVerificar OTP invitado
SMSPOST/api/sms/sendSMSVerificationControllerEnviar OTP por SMS
SMSPOST/api/sms/verifySMSVerificationControllerVerificar SMS OTP
SMSPOST/api/sms/resendSMSVerificationControllerReenviar SMS OTP
SMSGET/api/sms/statusSMSVerificationControllerEstado de verificacion SMS
Notif.POST/api/update-fcm-tokenRegisteredUserControllerActualizar token FCM
Notif.POST/api/remove-fcm-tokenControllsControllerRemover token FCM
DriverPOST/api/driverlocsubmitRegisteredUserControllerEnviar ubicacion del repartidor
DriverGET/api/driverlocationsagainstorder/{id}RegisteredUserControllerUbicaciones del repartidor
DriverGET/api/orderhistorydriver/{userid}RegisteredUserControllerPedidos del repartidor
DriverPOST/api/driver/reject-orderRegisteredUserControllerRechazar pedido
ChatPOST/api/msgsubmitRegisteredUserControllerEnviar mensaje
ChatGET/api/msgfetch/{orderid}RegisteredUserControllerObtener mensajes
FeedbackPOST/api/compsubmitRegisteredUserControllerEnviar comentario/queja
AppGET/api/app-versionAppControllerVerificar version de la app
InstagramGET/api/instagram-feedInstagramControllerFeed de Instagram
🔧 Endpoints de servidor (webhooks, cron jobs, admin)

Estos endpoints NO son llamados por la app movil. Son usados internamente por el servidor, servicios externos, o el panel de administracion web.

TipoEndpointDescripcion
WEBHOOKPOST /api/stripe/webhookStripe envia confirmacion de pago (server-to-server)
WEBHOOKPOST /api/webhooks/appleApple envia eventos de cuenta (server-to-server)
CRONPOST /api/cart-cleanupLimpia carritos expirados (cada 30 min)
CRONPOST /api/cleanup-temp-ordersElimina pedidos abandonados >2h (cada 30 min)
ADMINPOST /api/orders/mark-as-freeMarcar pedido como gratis (100% cupon)
ADMINGET /api/settings/otp-statusVer si OTP esta habilitado
ADMINPOST /api/settings/toggle-otpActivar/desactivar OTP
ADMINPOST /api/instagram/*CRUD de posts de Instagram (admin panel)