diff --git a/docs/developer-portal/06-delivery-partner-api-1-0-0-audit.md b/docs/developer-portal/06-delivery-partner-api-1-0-0-audit.md new file mode 100644 index 0000000..5100722 --- /dev/null +++ b/docs/developer-portal/06-delivery-partner-api-1-0-0-audit.md @@ -0,0 +1,23 @@ +# 06 Delivery Partner API 1.0.0 Audit + +Source checked: "Delivery Partner API (1.0.0)" shared by you. + +## Implemented Now + +- Dispatch multiple courier endpoint: + - `POST /api/v1/uber/delivery-partner/orders/{orderId}/partner-count` + - upstream: `/v1/delivery/order/{order_id}/update-delivery-partner-count` +- Request validation: + - `delivery_partner_count` integer range `2..5` + +## Webhook Compatibility + +- `delivery.state_changed` already supported. +- Added webhook resource mapping support for: + - `meta.order_id` + +## Pending + +- Region eligibility guardrails (currently not enforced in wrapper) +- Time-window guard (up to 10 minutes after first courier starts delivery) as a preflight business rule + diff --git a/docs/developer-portal/06-orders.md b/docs/developer-portal/06-orders.md index 30d3ad2..bc43a5c 100644 --- a/docs/developer-portal/06-orders.md +++ b/docs/developer-portal/06-orders.md @@ -39,3 +39,7 @@ Order API 1.0.0 coverage (delivery namespace): - `POST /api/v1/uber/delivery-order/orders/{orderId}/update-ready-time` - `POST /api/v1/uber/delivery-order/orders/{orderId}/resolve-fulfillment-issues` - `POST /api/v1/uber/delivery-order/replacement-recommendations` + +Delivery Partner API 1.0.0 coverage: + +- `POST /api/v1/uber/delivery-partner/orders/{orderId}/partner-count` (Dispatch Multiple Courier) diff --git a/docs/openapi/openapi.json b/docs/openapi/openapi.json index bd31b28..4b1ea8b 100644 --- a/docs/openapi/openapi.json +++ b/docs/openapi/openapi.json @@ -990,6 +990,29 @@ } } }, + "/api/v1/uber/delivery-partner/orders/{orderId}/partner-count": { + "post": { + "summary": "Delivery Partner API 1.0.0 - Dispatch multiple couriers", + "tags": [ + "Uber Delivery Partner v1" + ], + "parameters": [ + { + "in": "path", + "name": "orderId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Delivery partner count updated" + } + } + } + }, "/api/v1/uber/reporting/fetch": { "post": { "summary": "Fetch Uber reporting CSV with retries and header-based parsing", diff --git a/postman/Uber_Wrapper.postman_collection.json b/postman/Uber_Wrapper.postman_collection.json index 8fb1db3..b28e97a 100644 --- a/postman/Uber_Wrapper.postman_collection.json +++ b/postman/Uber_Wrapper.postman_collection.json @@ -859,6 +859,41 @@ } } }, + { + "name": "Delivery Partner API - Update Partner Count", + "request": { + "method": "POST", + "header": [ + { + "key": "x-api-key", + "value": "{{apiKey}}" + }, + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"delivery_partner_count\": 2\n}" + }, + "url": { + "raw": "{{baseUrl}}/api/v1/uber/delivery-partner/orders/{{orderId}}/partner-count", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "api", + "v1", + "uber", + "delivery-partner", + "orders", + "{{orderId}}", + "partner-count" + ] + } + } + }, { "name": "Get Store By ID", "request": { diff --git a/src/config/uberEndpoints.js b/src/config/uberEndpoints.js index 9b4b232..65b0a90 100644 --- a/src/config/uberEndpoints.js +++ b/src/config/uberEndpoints.js @@ -43,6 +43,9 @@ module.exports = { resolveFulfillmentIssues: "/v1/delivery/order/{orderId}/resolve-fulfillment-issues", replacementRecommendations: "/v1/delivery/get-replacement-recommendations" }, + deliveryPartner: { + updateDeliveryPartnerCount: "/v1/delivery/order/{orderId}/update-delivery-partner-count" + }, webhooks: { events: "/v1/eats/stores/{storeId}/event_feed" } diff --git a/src/modules/proxy/proxy.controller.js b/src/modules/proxy/proxy.controller.js index 8b2d7f1..64cb757 100644 --- a/src/modules/proxy/proxy.controller.js +++ b/src/modules/proxy/proxy.controller.js @@ -597,6 +597,18 @@ async function deliveryGetReplacementRecommendations(req, res) { return res.json({ success: true, data }); } +async function deliveryUpdatePartnerCount(req, res) { + const schema = z.object({ + delivery_partner_count: z.coerce.number().int().min(2).max(5) + }); + const payload = schema.parse(req.body || {}); + const data = await proxyService.deliveryUpdatePartnerCount({ + orderId: req.params.orderId, + payload + }); + return res.json({ success: true, data }); +} + module.exports = { genericProxy, upsertMenu, @@ -636,5 +648,6 @@ module.exports = { deliveryAdjustOrderPrice, deliveryUpdateReadyTime, deliveryResolveFulfillmentIssues, - deliveryGetReplacementRecommendations + deliveryGetReplacementRecommendations, + deliveryUpdatePartnerCount }; diff --git a/src/modules/proxy/proxy.service.js b/src/modules/proxy/proxy.service.js index 5bc3707..ffe8c54 100644 --- a/src/modules/proxy/proxy.service.js +++ b/src/modules/proxy/proxy.service.js @@ -589,6 +589,18 @@ async function deliveryGetReplacementRecommendations({ payload }) { }); } +async function deliveryUpdatePartnerCount({ orderId, payload }) { + const uberPath = interpolatePath(uberEndpoints.deliveryPartner.updateDeliveryPartnerCount, { orderId }); + return callUberApi({ + method: "POST", + uberPath, + body: payload, + wrapperRoute: "/api/v1/uber/delivery-partner/orders/:orderId/partner-count", + authMode: "app", + scopes: AUTH_SCOPES.ORDER + }); +} + module.exports = { genericProxy, menuUpsert, @@ -628,5 +640,6 @@ module.exports = { deliveryAdjustOrderPrice, deliveryUpdateReadyTime, deliveryResolveFulfillmentIssues, - deliveryGetReplacementRecommendations + deliveryGetReplacementRecommendations, + deliveryUpdatePartnerCount }; diff --git a/src/modules/webhooks/webhooks.controller.js b/src/modules/webhooks/webhooks.controller.js index 99bac30..ed7c10a 100644 --- a/src/modules/webhooks/webhooks.controller.js +++ b/src/modules/webhooks/webhooks.controller.js @@ -108,6 +108,7 @@ async function handleUberWebhook(req, res) { const resourceId = req.body?.resource_id || req.body?.meta?.resource_id || + req.body?.meta?.order_id || req.body?.order_id || req.body?.order?.id || null; diff --git a/src/routes/proxy.routes.js b/src/routes/proxy.routes.js index 37f8d71..e3ce2ef 100644 --- a/src/routes/proxy.routes.js +++ b/src/routes/proxy.routes.js @@ -650,4 +650,26 @@ router.post( asyncHandler(controller.deliveryGetReplacementRecommendations) ); +/** + * @openapi + * /api/v1/uber/delivery-partner/orders/{orderId}/partner-count: + * post: + * summary: Delivery Partner API 1.0.0 - Dispatch multiple couriers + * tags: + * - Uber Delivery Partner v1 + * parameters: + * - in: path + * name: orderId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Delivery partner count updated + */ +router.post( + "/uber/delivery-partner/orders/:orderId/partner-count", + asyncHandler(controller.deliveryUpdatePartnerCount) +); + module.exports = router;