@unifiedcommerce/plugin-marketplace 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +479 -0
  2. package/dist/analytics-models.d.ts +13 -0
  3. package/dist/analytics-models.d.ts.map +1 -0
  4. package/dist/analytics-models.js +69 -0
  5. package/dist/hooks.d.ts +4 -0
  6. package/dist/hooks.d.ts.map +1 -0
  7. package/dist/hooks.js +187 -0
  8. package/dist/index.d.ts +4 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +105 -0
  11. package/dist/mcp-tools.d.ts +21 -0
  12. package/dist/mcp-tools.d.ts.map +1 -0
  13. package/dist/mcp-tools.js +183 -0
  14. package/dist/routes/b2b.d.ts +9 -0
  15. package/dist/routes/b2b.d.ts.map +1 -0
  16. package/dist/routes/b2b.js +156 -0
  17. package/dist/routes/commission.d.ts +6 -0
  18. package/dist/routes/commission.d.ts.map +1 -0
  19. package/dist/routes/commission.js +85 -0
  20. package/dist/routes/disputes-returns-reviews.d.ts +10 -0
  21. package/dist/routes/disputes-returns-reviews.d.ts.map +1 -0
  22. package/dist/routes/disputes-returns-reviews.js +179 -0
  23. package/dist/routes/payouts.d.ts +6 -0
  24. package/dist/routes/payouts.d.ts.map +1 -0
  25. package/dist/routes/payouts.js +40 -0
  26. package/dist/routes/sub-orders.d.ts +6 -0
  27. package/dist/routes/sub-orders.d.ts.map +1 -0
  28. package/dist/routes/sub-orders.js +44 -0
  29. package/dist/routes/util.d.ts +23 -0
  30. package/dist/routes/util.d.ts.map +1 -0
  31. package/dist/routes/util.js +41 -0
  32. package/dist/routes/vendor-portal.d.ts +14 -0
  33. package/dist/routes/vendor-portal.d.ts.map +1 -0
  34. package/dist/routes/vendor-portal.js +255 -0
  35. package/dist/routes/vendors.d.ts +11 -0
  36. package/dist/routes/vendors.d.ts.map +1 -0
  37. package/dist/routes/vendors.js +185 -0
  38. package/dist/schema.d.ts +3255 -0
  39. package/dist/schema.d.ts.map +1 -0
  40. package/dist/schema.js +225 -0
  41. package/dist/schemas/b2b.d.ts +1009 -0
  42. package/dist/schemas/b2b.d.ts.map +1 -0
  43. package/dist/schemas/b2b.js +208 -0
  44. package/dist/schemas/commission.d.ts +532 -0
  45. package/dist/schemas/commission.d.ts.map +1 -0
  46. package/dist/schemas/commission.js +113 -0
  47. package/dist/schemas/disputes-returns-reviews.d.ts +1405 -0
  48. package/dist/schemas/disputes-returns-reviews.d.ts.map +1 -0
  49. package/dist/schemas/disputes-returns-reviews.js +270 -0
  50. package/dist/schemas/payouts.d.ts +375 -0
  51. package/dist/schemas/payouts.d.ts.map +1 -0
  52. package/dist/schemas/payouts.js +78 -0
  53. package/dist/schemas/sub-orders.d.ts +303 -0
  54. package/dist/schemas/sub-orders.d.ts.map +1 -0
  55. package/dist/schemas/sub-orders.js +67 -0
  56. package/dist/schemas/vendor-portal.d.ts +1785 -0
  57. package/dist/schemas/vendor-portal.d.ts.map +1 -0
  58. package/dist/schemas/vendor-portal.js +294 -0
  59. package/dist/schemas/vendors.d.ts +1348 -0
  60. package/dist/schemas/vendors.d.ts.map +1 -0
  61. package/dist/schemas/vendors.js +245 -0
  62. package/dist/services/commission.d.ts +81 -0
  63. package/dist/services/commission.d.ts.map +1 -0
  64. package/dist/services/commission.js +98 -0
  65. package/dist/services/contract-price.d.ts +64 -0
  66. package/dist/services/contract-price.d.ts.map +1 -0
  67. package/dist/services/contract-price.js +57 -0
  68. package/dist/services/dispute.d.ts +156 -0
  69. package/dist/services/dispute.d.ts.map +1 -0
  70. package/dist/services/dispute.js +77 -0
  71. package/dist/services/payout.d.ts +126 -0
  72. package/dist/services/payout.d.ts.map +1 -0
  73. package/dist/services/payout.js +130 -0
  74. package/dist/services/return.d.ts +181 -0
  75. package/dist/services/return.d.ts.map +1 -0
  76. package/dist/services/return.js +80 -0
  77. package/dist/services/review.d.ts +70 -0
  78. package/dist/services/review.d.ts.map +1 -0
  79. package/dist/services/review.js +60 -0
  80. package/dist/services/rfq.d.ts +122 -0
  81. package/dist/services/rfq.d.ts.map +1 -0
  82. package/dist/services/rfq.js +60 -0
  83. package/dist/services/sub-order.d.ts +336 -0
  84. package/dist/services/sub-order.d.ts.map +1 -0
  85. package/dist/services/sub-order.js +121 -0
  86. package/dist/services/vendor.d.ts +528 -0
  87. package/dist/services/vendor.d.ts.map +1 -0
  88. package/dist/services/vendor.js +119 -0
  89. package/dist/types.d.ts +67 -0
  90. package/dist/types.d.ts.map +1 -0
  91. package/dist/types.js +13 -0
  92. package/package.json +43 -0
  93. package/src/analytics-models.ts +75 -0
  94. package/src/hooks.ts +215 -0
  95. package/src/index.ts +124 -0
  96. package/src/mcp-tools.ts +210 -0
  97. package/src/routes/b2b.ts +179 -0
  98. package/src/routes/commission.ts +95 -0
  99. package/src/routes/disputes-returns-reviews.ts +209 -0
  100. package/src/routes/payouts.ts +49 -0
  101. package/src/routes/sub-orders.ts +54 -0
  102. package/src/routes/util.ts +42 -0
  103. package/src/routes/vendor-portal.ts +277 -0
  104. package/src/routes/vendors.ts +201 -0
  105. package/src/schema.ts +260 -0
  106. package/src/schemas/b2b.ts +238 -0
  107. package/src/schemas/commission.ts +129 -0
  108. package/src/schemas/disputes-returns-reviews.ts +311 -0
  109. package/src/schemas/payouts.ts +90 -0
  110. package/src/schemas/sub-orders.ts +77 -0
  111. package/src/schemas/vendor-portal.ts +344 -0
  112. package/src/schemas/vendors.ts +281 -0
  113. package/src/services/commission.ts +120 -0
  114. package/src/services/contract-price.ts +80 -0
  115. package/src/services/dispute.ts +92 -0
  116. package/src/services/payout.ts +154 -0
  117. package/src/services/return.ts +92 -0
  118. package/src/services/review.ts +76 -0
  119. package/src/services/rfq.ts +82 -0
  120. package/src/services/sub-order.ts +136 -0
  121. package/src/services/vendor.ts +151 -0
  122. package/src/types.ts +164 -0
@@ -0,0 +1,311 @@
1
+ import { z, createRoute } from "@hono/zod-openapi";
2
+
3
+ const ErrorSchema = z.object({
4
+ error: z.object({
5
+ code: z.string(),
6
+ message: z.string(),
7
+ }),
8
+ });
9
+
10
+ const errorResponses = {
11
+ 401: { content: { "application/json": { schema: ErrorSchema } }, description: "Authentication required." },
12
+ 403: { content: { "application/json": { schema: ErrorSchema } }, description: "Insufficient permissions." },
13
+ 404: { content: { "application/json": { schema: ErrorSchema } }, description: "Not found." },
14
+ 422: { content: { "application/json": { schema: ErrorSchema } }, description: "Validation error." },
15
+ 500: { content: { "application/json": { schema: ErrorSchema } }, description: "Server error." },
16
+ } as const;
17
+
18
+ const DataResponseSchema = z.object({ data: z.any() });
19
+
20
+ // ═══════════════════════════════════════════════════════════════════════════════
21
+ // DISPUTES
22
+ // ═══════════════════════════════════════════════════════════════════════════════
23
+
24
+ // ─── Open Dispute ───────────────────────────────────────────────────────────
25
+
26
+ export const OpenDisputeBodySchema = z.object({
27
+ subOrderId: z.string().min(1).openapi({ example: "sub_abc123" }),
28
+ openedBy: z.string().min(1).openapi({ example: "user_xyz" }),
29
+ reason: z.string().min(1).openapi({ example: "item_not_received" }),
30
+ description: z.string().optional(),
31
+ }).openapi("OpenDisputeRequest");
32
+
33
+ export const openDisputeRoute = createRoute({
34
+ method: "post",
35
+ path: "/api/marketplace/disputes",
36
+ tags: ["Marketplace - Disputes"],
37
+ summary: "Open a dispute",
38
+ request: {
39
+ body: { content: { "application/json": { schema: OpenDisputeBodySchema } }, required: true },
40
+ },
41
+ responses: {
42
+ 201: { content: { "application/json": { schema: DataResponseSchema } }, description: "Dispute opened." },
43
+ ...errorResponses,
44
+ },
45
+ });
46
+
47
+ // ─── Respond to Dispute ─────────────────────────────────────────────────────
48
+
49
+ export const RespondDisputeBodySchema = z.object({
50
+ party: z.string().min(1).openapi({ example: "vendor" }),
51
+ note: z.string().min(1).openapi({ example: "We shipped the item on time." }),
52
+ url: z.string().url().optional().openapi({ example: "https://example.com/evidence.pdf" }),
53
+ }).openapi("RespondDisputeRequest");
54
+
55
+ export const respondDisputeRoute = createRoute({
56
+ method: "post",
57
+ path: "/api/marketplace/disputes/{id}/respond",
58
+ tags: ["Marketplace - Disputes"],
59
+ summary: "Respond to a dispute",
60
+ request: {
61
+ params: z.object({ id: z.string() }),
62
+ body: { content: { "application/json": { schema: RespondDisputeBodySchema } }, required: true },
63
+ },
64
+ responses: {
65
+ 200: { content: { "application/json": { schema: DataResponseSchema } }, description: "Response recorded." },
66
+ ...errorResponses,
67
+ },
68
+ });
69
+
70
+ // ─── Resolve Dispute ────────────────────────────────────────────────────────
71
+
72
+ export const ResolveDisputeBodySchema = z.object({
73
+ resolution: z.enum([
74
+ "refund_full", "refund_partial", "replacement", "rejected", "vendor_favor", "buyer_favor",
75
+ ]).openapi({ example: "refund_full" }),
76
+ resolvedBy: z.string().min(1).openapi({ example: "admin_001" }),
77
+ notes: z.string().optional(),
78
+ refundAmountCents: z.number().int().optional().openapi({ example: 1500 }),
79
+ }).openapi("ResolveDisputeRequest");
80
+
81
+ export const resolveDisputeRoute = createRoute({
82
+ method: "post",
83
+ path: "/api/marketplace/disputes/{id}/resolve",
84
+ tags: ["Marketplace - Disputes"],
85
+ summary: "Resolve a dispute",
86
+ request: {
87
+ params: z.object({ id: z.string() }),
88
+ body: { content: { "application/json": { schema: ResolveDisputeBodySchema } }, required: true },
89
+ },
90
+ responses: {
91
+ 200: { content: { "application/json": { schema: DataResponseSchema } }, description: "Dispute resolved." },
92
+ ...errorResponses,
93
+ },
94
+ });
95
+
96
+ // ═══════════════════════════════════════════════════════════════════════════════
97
+ // RETURNS
98
+ // ═══════════════════════════════════════════════════════════════════════════════
99
+
100
+ // ─── Request Return ─────────────────────────────────────────────────────────
101
+
102
+ export const RequestReturnBodySchema = z.object({
103
+ subOrderId: z.string().min(1).openapi({ example: "sub_abc123" }),
104
+ reason: z.string().min(1).openapi({ example: "defective" }),
105
+ customerId: z.string().optional(),
106
+ description: z.string().optional(),
107
+ lineItems: z.array(z.record(z.string(), z.unknown())).optional(),
108
+ }).openapi("RequestReturnRequest");
109
+
110
+ export const requestReturnRoute = createRoute({
111
+ method: "post",
112
+ path: "/api/marketplace/returns",
113
+ tags: ["Marketplace - Returns"],
114
+ summary: "Request a return",
115
+ request: {
116
+ body: { content: { "application/json": { schema: RequestReturnBodySchema } }, required: true },
117
+ },
118
+ responses: {
119
+ 201: { content: { "application/json": { schema: DataResponseSchema } }, description: "Return requested." },
120
+ ...errorResponses,
121
+ },
122
+ });
123
+
124
+ // ─── Ship Back ──────────────────────────────────────────────────────────────
125
+
126
+ export const ShipBackReturnBodySchema = z.object({
127
+ trackingNumber: z.string().min(1).openapi({ example: "TRACK123456" }),
128
+ }).openapi("ShipBackReturnRequest");
129
+
130
+ export const shipBackReturnRoute = createRoute({
131
+ method: "post",
132
+ path: "/api/marketplace/returns/{id}/ship-back",
133
+ tags: ["Marketplace - Returns"],
134
+ summary: "Ship back a return",
135
+ request: {
136
+ params: z.object({ id: z.string() }),
137
+ body: { content: { "application/json": { schema: ShipBackReturnBodySchema } }, required: true },
138
+ },
139
+ responses: {
140
+ 200: { content: { "application/json": { schema: DataResponseSchema } }, description: "Return shipped back." },
141
+ ...errorResponses,
142
+ },
143
+ });
144
+
145
+ // ═══════════════════════════════════════════════════════════════════════════════
146
+ // REVIEWS
147
+ // ═══════════════════════════════════════════════════════════════════════════════
148
+
149
+ // ─── Create Review ──────────────────────────────────────────────────────────
150
+
151
+ export const CreateReviewBodySchema = z.object({
152
+ rating: z.number().int().min(1).max(5).openapi({ example: 4 }),
153
+ customerId: z.string().optional(),
154
+ orderId: z.string().optional(),
155
+ title: z.string().optional(),
156
+ body: z.string().optional(),
157
+ }).openapi("CreateVendorReviewRequest");
158
+
159
+ export const createReviewRoute = createRoute({
160
+ method: "post",
161
+ path: "/api/marketplace/vendors/{id}/reviews",
162
+ tags: ["Marketplace - Reviews"],
163
+ summary: "Create a vendor review",
164
+ request: {
165
+ params: z.object({ id: z.string() }),
166
+ body: { content: { "application/json": { schema: CreateReviewBodySchema } }, required: true },
167
+ },
168
+ responses: {
169
+ 201: { content: { "application/json": { schema: DataResponseSchema } }, description: "Review created." },
170
+ ...errorResponses,
171
+ },
172
+ });
173
+
174
+ // ─── Moderate Review ────────────────────────────────────────────────────────
175
+
176
+ export const ModerateReviewBodySchema = z.object({
177
+ status: z.enum(["pending", "published", "hidden", "flagged"]).openapi({ example: "published" }),
178
+ }).openapi("ModerateReviewRequest");
179
+
180
+ export const moderateReviewRoute = createRoute({
181
+ method: "patch",
182
+ path: "/api/marketplace/reviews/{id}",
183
+ tags: ["Marketplace - Reviews"],
184
+ summary: "Moderate a review (update status)",
185
+ request: {
186
+ params: z.object({ id: z.string() }),
187
+ body: { content: { "application/json": { schema: ModerateReviewBodySchema } }, required: true },
188
+ },
189
+ responses: {
190
+ 200: { content: { "application/json": { schema: DataResponseSchema } }, description: "Review moderated." },
191
+ ...errorResponses,
192
+ },
193
+ });
194
+
195
+ // ─── List Disputes ──────────────────────────────────────────────────────────
196
+
197
+ export const listDisputesRoute = createRoute({
198
+ method: "get",
199
+ path: "/api/marketplace/disputes",
200
+ tags: ["Marketplace - Disputes"],
201
+ summary: "List disputes",
202
+ request: {
203
+ query: z.object({
204
+ status: z.string().optional(),
205
+ subOrderId: z.string().optional(),
206
+ }),
207
+ },
208
+ responses: {
209
+ 200: { content: { "application/json": { schema: DataResponseSchema } }, description: "Success" },
210
+ ...errorResponses,
211
+ },
212
+ });
213
+
214
+ // ─── Get Dispute ────────────────────────────────────────────────────────────
215
+
216
+ export const getDisputeRoute = createRoute({
217
+ method: "get",
218
+ path: "/api/marketplace/disputes/{id}",
219
+ tags: ["Marketplace - Disputes"],
220
+ summary: "Get dispute by ID",
221
+ request: {
222
+ params: z.object({ id: z.string() }),
223
+ },
224
+ responses: {
225
+ 200: { content: { "application/json": { schema: DataResponseSchema } }, description: "Success" },
226
+ ...errorResponses,
227
+ },
228
+ });
229
+
230
+ // ─── Escalate Dispute ───────────────────────────────────────────────────────
231
+
232
+ export const escalateDisputeRoute = createRoute({
233
+ method: "post",
234
+ path: "/api/marketplace/disputes/{id}/escalate",
235
+ tags: ["Marketplace - Disputes"],
236
+ summary: "Escalate a dispute",
237
+ request: {
238
+ params: z.object({ id: z.string() }),
239
+ },
240
+ responses: {
241
+ 200: { content: { "application/json": { schema: DataResponseSchema } }, description: "Dispute escalated." },
242
+ ...errorResponses,
243
+ },
244
+ });
245
+
246
+ // ─── List Returns ───────────────────────────────────────────────────────────
247
+
248
+ export const listReturnsRoute = createRoute({
249
+ method: "get",
250
+ path: "/api/marketplace/returns",
251
+ tags: ["Marketplace - Returns"],
252
+ summary: "List returns",
253
+ request: {
254
+ query: z.object({
255
+ subOrderId: z.string().optional(),
256
+ status: z.string().optional(),
257
+ }),
258
+ },
259
+ responses: {
260
+ 200: { content: { "application/json": { schema: DataResponseSchema } }, description: "Success" },
261
+ ...errorResponses,
262
+ },
263
+ });
264
+
265
+ // ─── Get Return ─────────────────────────────────────────────────────────────
266
+
267
+ export const getReturnRoute = createRoute({
268
+ method: "get",
269
+ path: "/api/marketplace/returns/{id}",
270
+ tags: ["Marketplace - Returns"],
271
+ summary: "Get return by ID",
272
+ request: {
273
+ params: z.object({ id: z.string() }),
274
+ },
275
+ responses: {
276
+ 200: { content: { "application/json": { schema: DataResponseSchema } }, description: "Success" },
277
+ ...errorResponses,
278
+ },
279
+ });
280
+
281
+ // ─── Receive Return ─────────────────────────────────────────────────────────
282
+
283
+ export const receiveReturnRoute = createRoute({
284
+ method: "post",
285
+ path: "/api/marketplace/returns/{id}/receive",
286
+ tags: ["Marketplace - Returns"],
287
+ summary: "Mark a return as received",
288
+ request: {
289
+ params: z.object({ id: z.string() }),
290
+ },
291
+ responses: {
292
+ 200: { content: { "application/json": { schema: DataResponseSchema } }, description: "Return received." },
293
+ ...errorResponses,
294
+ },
295
+ });
296
+
297
+ // ─── List Vendor Reviews ────────────────────────────────────────────────────
298
+
299
+ export const listVendorReviewsRoute = createRoute({
300
+ method: "get",
301
+ path: "/api/marketplace/vendors/{id}/reviews",
302
+ tags: ["Marketplace - Reviews"],
303
+ summary: "List reviews for a vendor",
304
+ request: {
305
+ params: z.object({ id: z.string() }),
306
+ },
307
+ responses: {
308
+ 200: { content: { "application/json": { schema: DataResponseSchema } }, description: "Success" },
309
+ ...errorResponses,
310
+ },
311
+ });
@@ -0,0 +1,90 @@
1
+ import { z, createRoute } from "@hono/zod-openapi";
2
+
3
+ const ErrorSchema = z.object({
4
+ error: z.object({
5
+ code: z.string(),
6
+ message: z.string(),
7
+ }),
8
+ });
9
+
10
+ const errorResponses = {
11
+ 401: { content: { "application/json": { schema: ErrorSchema } }, description: "Authentication required." },
12
+ 403: { content: { "application/json": { schema: ErrorSchema } }, description: "Insufficient permissions." },
13
+ 404: { content: { "application/json": { schema: ErrorSchema } }, description: "Not found." },
14
+ 422: { content: { "application/json": { schema: ErrorSchema } }, description: "Validation error." },
15
+ 500: { content: { "application/json": { schema: ErrorSchema } }, description: "Server error." },
16
+ } as const;
17
+
18
+ const PayoutResponseSchema = z.object({ data: z.any() });
19
+
20
+ // ─── Run Payout Cycle ────────────────────────────────────────────────────────
21
+
22
+ export const RunPayoutCycleBodySchema = z.object({
23
+ vendorIds: z.array(z.uuid()).optional().openapi({ description: "Limit payout run to specific vendors" }),
24
+ force: z.boolean().optional().openapi({ description: "Force payout even if below minimum threshold" }),
25
+ }).openapi("RunPayoutCycleRequest");
26
+
27
+ export const runPayoutCycleRoute = createRoute({
28
+ method: "post",
29
+ path: "/api/marketplace/payouts/run",
30
+ tags: ["Marketplace - Payouts"],
31
+ summary: "Run a payout cycle",
32
+ request: {
33
+ body: { content: { "application/json": { schema: RunPayoutCycleBodySchema } }, required: true },
34
+ },
35
+ responses: {
36
+ 200: { content: { "application/json": { schema: PayoutResponseSchema } }, description: "Payout cycle completed." },
37
+ ...errorResponses,
38
+ },
39
+ });
40
+
41
+ // ─── List Payouts ───────────────────────────────────────────────────────────
42
+
43
+ export const listPayoutsRoute = createRoute({
44
+ method: "get",
45
+ path: "/api/marketplace/payouts",
46
+ tags: ["Marketplace - Payouts"],
47
+ summary: "List payouts",
48
+ request: {
49
+ query: z.object({
50
+ vendorId: z.string().optional(),
51
+ status: z.string().optional(),
52
+ }),
53
+ },
54
+ responses: {
55
+ 200: { content: { "application/json": { schema: PayoutResponseSchema } }, description: "Success" },
56
+ ...errorResponses,
57
+ },
58
+ });
59
+
60
+ // ─── Retry Payout ───────────────────────────────────────────────────────────
61
+
62
+ export const retryPayoutRoute = createRoute({
63
+ method: "post",
64
+ path: "/api/marketplace/payouts/{id}/retry",
65
+ tags: ["Marketplace - Payouts"],
66
+ summary: "Retry a failed payout",
67
+ request: {
68
+ params: z.object({ id: z.uuid() }),
69
+ },
70
+ responses: {
71
+ 200: { content: { "application/json": { schema: PayoutResponseSchema } }, description: "Payout retried." },
72
+ ...errorResponses,
73
+ },
74
+ });
75
+
76
+ // ─── Get Payout ─────────────────────────────────────────────────────────────
77
+
78
+ export const getPayoutRoute = createRoute({
79
+ method: "get",
80
+ path: "/api/marketplace/payouts/{id}",
81
+ tags: ["Marketplace - Payouts"],
82
+ summary: "Get payout by ID",
83
+ request: {
84
+ params: z.object({ id: z.uuid() }),
85
+ },
86
+ responses: {
87
+ 200: { content: { "application/json": { schema: PayoutResponseSchema } }, description: "Success" },
88
+ ...errorResponses,
89
+ },
90
+ });
@@ -0,0 +1,77 @@
1
+ import { z, createRoute } from "@hono/zod-openapi";
2
+
3
+ const ErrorSchema = z.object({
4
+ error: z.object({
5
+ code: z.string(),
6
+ message: z.string(),
7
+ }),
8
+ });
9
+
10
+ const errorResponses = {
11
+ 401: { content: { "application/json": { schema: ErrorSchema } }, description: "Authentication required." },
12
+ 403: { content: { "application/json": { schema: ErrorSchema } }, description: "Insufficient permissions." },
13
+ 404: { content: { "application/json": { schema: ErrorSchema } }, description: "Not found." },
14
+ 422: { content: { "application/json": { schema: ErrorSchema } }, description: "Validation error." },
15
+ 500: { content: { "application/json": { schema: ErrorSchema } }, description: "Server error." },
16
+ } as const;
17
+
18
+ const SubOrderResponseSchema = z.object({ data: z.any() });
19
+
20
+ // ─── Update Sub-Order Status ─────────────────────────────────────────────────
21
+
22
+ export const UpdateSubOrderStatusBodySchema = z.object({
23
+ status: z.enum(["pending", "confirmed", "processing", "shipped", "delivered", "cancelled"])
24
+ .openapi({ example: "processing" }),
25
+ reason: z.string().optional().openapi({ example: "Admin force status change" }),
26
+ }).openapi("UpdateSubOrderStatusRequest");
27
+
28
+ export const updateSubOrderStatusRoute = createRoute({
29
+ method: "patch",
30
+ path: "/api/marketplace/sub-orders/{id}/status",
31
+ tags: ["Marketplace - Sub-Orders"],
32
+ summary: "Force a sub-order status change",
33
+ request: {
34
+ params: z.object({ id: z.uuid() }),
35
+ body: { content: { "application/json": { schema: UpdateSubOrderStatusBodySchema } }, required: true },
36
+ },
37
+ responses: {
38
+ 200: { content: { "application/json": { schema: SubOrderResponseSchema } }, description: "Sub-order status updated." },
39
+ ...errorResponses,
40
+ },
41
+ });
42
+
43
+ // ─── List Sub-Orders ────────────────────────────────────────────────────────
44
+
45
+ export const listSubOrdersRoute = createRoute({
46
+ method: "get",
47
+ path: "/api/marketplace/sub-orders",
48
+ tags: ["Marketplace - Sub-Orders"],
49
+ summary: "List sub-orders",
50
+ request: {
51
+ query: z.object({
52
+ orderId: z.string().optional(),
53
+ vendorId: z.string().optional(),
54
+ status: z.string().optional(),
55
+ }),
56
+ },
57
+ responses: {
58
+ 200: { content: { "application/json": { schema: SubOrderResponseSchema } }, description: "Success" },
59
+ ...errorResponses,
60
+ },
61
+ });
62
+
63
+ // ─── Get Sub-Order ──────────────────────────────────────────────────────────
64
+
65
+ export const getSubOrderRoute = createRoute({
66
+ method: "get",
67
+ path: "/api/marketplace/sub-orders/{id}",
68
+ tags: ["Marketplace - Sub-Orders"],
69
+ summary: "Get sub-order by ID",
70
+ request: {
71
+ params: z.object({ id: z.uuid() }),
72
+ },
73
+ responses: {
74
+ 200: { content: { "application/json": { schema: SubOrderResponseSchema } }, description: "Success" },
75
+ ...errorResponses,
76
+ },
77
+ });