npm.io
0.0.42 • Published 16h ago

@86d-app/uber-eats

Licence
MIT
Version
0.0.42
Deps
1
Size
100 kB
Vulns
0
Weekly
0
Stars
5

86d

The Modern Foundation for Commerce

X · LinkedIn


This project is under active development and is not ready for production use. Please proceed with caution. Use at your own risk.

Documentation: 86d.app/docs/modules/uber-eats

Uber Eats Module

Uber Eats marketplace integration for 86d. Receive and manage orders from Uber Eats, sync menus, and track order statistics.

Installation

npm install @86d-app/uber-eats

Usage

import uberEats from "@86d-app/uber-eats";

const module = uberEats({
  clientId: "your-client-id",
  clientSecret: "your-client-secret",
  restaurantId: "your-restaurant-id",
  sandbox: "true",
});

Configuration

Option Type Default Description
clientId string Uber Eats client ID
clientSecret string Uber Eats client secret
restaurantId string Uber Eats restaurant ID
sandbox string "true" Use sandbox mode

Store Endpoints

Method Path Description
POST /uber-eats/orders Receive an order
GET /uber-eats/orders/:id Get order by ID
POST /uber-eats/orders/:id/accept Accept an order
POST /uber-eats/orders/:id/ready Mark order as ready
POST /uber-eats/orders/:id/cancel Cancel an order

Admin Endpoints

Method Path Description
GET /admin/uber-eats/orders List all orders
GET /admin/uber-eats/stats Get order statistics
GET /admin/uber-eats/menu-syncs List menu sync history
POST /admin/uber-eats/menu-syncs/create Trigger a menu sync

Controller API

interface UberEatsController extends ModuleController {
  receiveOrder(params: {
    externalOrderId: string;
    items: Array<Record<string, unknown>>;
    subtotal: number;
    deliveryFee: number;
    tax: number;
    total: number;
    customerName?: string;
    customerPhone?: string;
    specialInstructions?: string;
  }): Promise<UberOrder>;

  acceptOrder(id: string): Promise<UberOrder | null>;
  markReady(id: string): Promise<UberOrder | null>;
  cancelOrder(id: string): Promise<UberOrder | null>;
  getOrder(id: string): Promise<UberOrder | null>;
  listOrders(params?: { status?: UberOrderStatus; take?: number; skip?: number }): Promise<UberOrder[]>;

  syncMenu(itemCount: number): Promise<MenuSync>;
  getLastMenuSync(): Promise<MenuSync | null>;
  listMenuSyncs(params?: { take?: number; skip?: number }): Promise<MenuSync[]>;
  getOrderStats(): Promise<OrderStats>;
}

Types

type UberOrderStatus = "pending" | "accepted" | "preparing" | "ready" | "picked-up" | "delivered" | "cancelled";
type MenuSyncStatus = "pending" | "syncing" | "synced" | "failed";

interface UberOrder {
  id: string;
  externalOrderId: string;
  status: UberOrderStatus;
  items: Array<Record<string, unknown>>;
  subtotal: number;
  deliveryFee: number;
  tax: number;
  total: number;
  customerName?: string;
  customerPhone?: string;
  estimatedReadyTime?: Date;
  specialInstructions?: string;
  createdAt: Date;
  updatedAt: Date;
}

interface MenuSync {
  id: string;
  status: MenuSyncStatus;
  itemCount: number;
  error?: string;
  startedAt: Date;
  completedAt?: Date;
  createdAt: Date;
}

interface OrderStats {
  total: number;
  pending: number;
  accepted: number;
  preparing: number;
  ready: number;
  delivered: number;
  cancelled: number;
  totalRevenue: number;
}

Notes

  • Order flow: pending -> accepted -> preparing -> ready -> picked-up -> delivered.
  • Only pending orders can be accepted; only accepted or preparing orders can be marked ready.
  • Orders in delivered, cancelled, or picked-up status cannot be cancelled.
  • Revenue in OrderStats excludes cancelled orders.
  • Events emitted: ubereats.order.received, ubereats.order.accepted, ubereats.order.ready, ubereats.order.cancelled, ubereats.menu.synced, ubereats.webhook.received.

Keywords