feat: add delivery partner api v1.0.0 multi-courier dispatch endpoint

This commit is contained in:
MOHAN 2026-03-29 18:25:52 +05:30
parent 53e5bd970c
commit 6febf49618
9 changed files with 139 additions and 2 deletions

View File

@ -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

View File

@ -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)

View File

@ -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",

View File

@ -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": {

View File

@ -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"
}

View File

@ -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
};

View File

@ -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
};

View File

@ -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;

View File

@ -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;