@optima-chat/tiktok-cli 0.5.0 → 0.7.0
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.
- package/dist/index.js +217 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -85,6 +85,33 @@ async function createAuthLink() {
|
|
|
85
85
|
return { ok: false, error: { code: "BACKEND_UNREACHABLE", message: e.message, retryable: true } };
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
|
+
async function fetchEvents(shop, query) {
|
|
89
|
+
try {
|
|
90
|
+
const qs = new URLSearchParams(query).toString();
|
|
91
|
+
const r = await fetch(`${BACKEND}/events/${shop}${qs ? "?" + qs : ""}`, { headers: authHeaders() });
|
|
92
|
+
if (r.status === 401) return { ok: false, error: { code: "AUTH_EXPIRED", message: "\u672A\u767B\u5F55\u6216 token \u5931\u6548", retryable: false } };
|
|
93
|
+
if (r.status === 404) return { ok: false, error: { code: "SHOP_NOT_AUTHORIZED", message: "\u672A\u627E\u5230\u4F60\u540D\u4E0B\u7684\u5DF2\u6388\u6743\u5E97\u94FA", retryable: false }, meta: { shop } };
|
|
94
|
+
const body = await r.json();
|
|
95
|
+
return { ok: true, data: body, meta: { shop } };
|
|
96
|
+
} catch (e) {
|
|
97
|
+
return { ok: false, error: { code: "BACKEND_UNREACHABLE", message: e.message, retryable: true } };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async function ackEvents(shop, body) {
|
|
101
|
+
try {
|
|
102
|
+
const r = await fetch(`${BACKEND}/events/${shop}/ack`, {
|
|
103
|
+
method: "POST",
|
|
104
|
+
headers: { "Content-Type": "application/json", ...authHeaders() },
|
|
105
|
+
body: JSON.stringify(body)
|
|
106
|
+
});
|
|
107
|
+
if (r.status === 401) return { ok: false, error: { code: "AUTH_EXPIRED", message: "\u672A\u767B\u5F55\u6216 token \u5931\u6548", retryable: false } };
|
|
108
|
+
if (r.status === 404) return { ok: false, error: { code: "SHOP_NOT_AUTHORIZED", message: "\u672A\u627E\u5230\u4F60\u540D\u4E0B\u7684\u5DF2\u6388\u6743\u5E97\u94FA", retryable: false }, meta: { shop } };
|
|
109
|
+
const j = await r.json();
|
|
110
|
+
return { ok: true, data: j, meta: { shop } };
|
|
111
|
+
} catch (e) {
|
|
112
|
+
return { ok: false, error: { code: "BACKEND_UNREACHABLE", message: e.message, retryable: true } };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
88
115
|
async function uploadImage(shop, filePath, useCase) {
|
|
89
116
|
try {
|
|
90
117
|
const buf = readFileSync(filePath);
|
|
@@ -135,6 +162,196 @@ var COMMANDS = [
|
|
|
135
162
|
summary: "\u8BA2\u5355\u8BE6\u60C5\uFF08--id \u5FC5\u586B\uFF09",
|
|
136
163
|
run: ({ shop, args: args2 }) => proxy("GET", shop, "/order/202309/orders/detail", { query: { ids: args2.id } })
|
|
137
164
|
},
|
|
165
|
+
// ── 售后(退货/取消)只读 ──
|
|
166
|
+
{
|
|
167
|
+
name: "orders cancellations",
|
|
168
|
+
summary: "\u53D6\u6D88\u5355\u5217\u8868\uFF08--status \u53EF\u9009\uFF0C--page-size\uFF09",
|
|
169
|
+
run: ({ shop, args: args2 }) => proxy("POST", shop, "/return_refund/202309/cancellations/search", {
|
|
170
|
+
query: { page_size: String(args2["page-size"] ?? 20) },
|
|
171
|
+
body: args2.status ? { cancel_status: args2.status } : {}
|
|
172
|
+
})
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: "orders returns",
|
|
176
|
+
summary: "\u9000\u8D27\u5355\u5217\u8868\uFF08--status \u53EF\u9009\uFF0C--page-size\uFF09",
|
|
177
|
+
run: ({ shop, args: args2 }) => proxy("POST", shop, "/return_refund/202309/returns/search", {
|
|
178
|
+
query: { page_size: String(args2["page-size"] ?? 20) },
|
|
179
|
+
body: args2.status ? { return_status: args2.status } : {}
|
|
180
|
+
})
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: "orders return-records",
|
|
184
|
+
summary: "\u9000\u8D27\u5355\u5904\u7406\u8BB0\u5F55\uFF08--id return_id\uFF09",
|
|
185
|
+
run: ({ shop, args: args2 }) => proxy("GET", shop, `/return_refund/202309/returns/${args2.id}/records`, {})
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: "orders aftersale-eligibility",
|
|
189
|
+
summary: "\u8BA2\u5355\u552E\u540E\u8D44\u683C\uFF08--order id\uFF09",
|
|
190
|
+
run: ({ shop, args: args2 }) => proxy("GET", shop, `/return_refund/202512/orders/${args2.order}/aftersale_eligibility`, {})
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
name: "orders reject-reasons",
|
|
194
|
+
summary: "\u9A73\u56DE\u53D6\u6D88/\u9000\u8D27\u7684\u5408\u6CD5\u7406\u7531\uFF08--id return_or_cancel_id\uFF09",
|
|
195
|
+
run: ({ shop, args: args2 }) => proxy("GET", shop, "/return_refund/202309/reject_reasons", {
|
|
196
|
+
query: { return_or_cancel_id: args2.id }
|
|
197
|
+
})
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
name: "orders refund-calculate",
|
|
201
|
+
summary: "\u8BA1\u7B97\u9000\u6B3E\u989D\uFF08--body-file calc.json\uFF09",
|
|
202
|
+
run: ({ shop, args: args2 }) => proxy("POST", shop, "/return_refund/202309/refunds/calculate", {
|
|
203
|
+
body: readBodyFile(args2["body-file"])
|
|
204
|
+
})
|
|
205
|
+
},
|
|
206
|
+
// ── 履约可见性 只读 ──
|
|
207
|
+
{
|
|
208
|
+
name: "orders tracking",
|
|
209
|
+
summary: "\u8BA2\u5355\u7269\u6D41\u8DDF\u8E2A\uFF08--order id\uFF09",
|
|
210
|
+
run: ({ shop, args: args2 }) => proxy("GET", shop, `/fulfillment/202309/orders/${args2.order}/tracking`, {})
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
name: "orders shipping-services",
|
|
214
|
+
summary: "\u8BA2\u5355\u53EF\u7528\u627F\u8FD0/\u914D\u9001\u670D\u52A1\uFF08--order id\uFF09",
|
|
215
|
+
run: ({ shop, args: args2 }) => proxy("POST", shop, `/fulfillment/202309/orders/${args2.order}/shipping_services/query`, {
|
|
216
|
+
body: {}
|
|
217
|
+
})
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
name: "packages search",
|
|
221
|
+
summary: "\u5305\u88F9\u5217\u8868\uFF08--page-size\uFF09",
|
|
222
|
+
run: ({ shop, args: args2 }) => proxy("POST", shop, "/fulfillment/202309/packages/search", {
|
|
223
|
+
query: { page_size: String(args2["page-size"] ?? 20) },
|
|
224
|
+
body: {}
|
|
225
|
+
})
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
name: "packages get",
|
|
229
|
+
summary: "\u5305\u88F9\u8BE6\u60C5\uFF08--package id\uFF09",
|
|
230
|
+
run: ({ shop, args: args2 }) => proxy("GET", shop, `/fulfillment/202309/packages/${args2.package}`, {})
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
name: "packages documents",
|
|
234
|
+
summary: "\u5305\u88F9\u7269\u6D41\u9762\u5355\uFF08--package id\uFF09",
|
|
235
|
+
run: ({ shop, args: args2 }) => proxy("GET", shop, `/fulfillment/202309/packages/${args2.package}/shipping_documents`, {})
|
|
236
|
+
},
|
|
237
|
+
// ── 售后审批 / 发货 写(不可逆,默认 dry-run,--apply 才提交)──
|
|
238
|
+
{
|
|
239
|
+
name: "orders cancel-approve",
|
|
240
|
+
summary: "\u6279\u51C6\u53D6\u6D88\u5355\uFF08--id cancel_id\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u6279\u3002\u4E0D\u53EF\u9006",
|
|
241
|
+
write: true,
|
|
242
|
+
preview: ({ args: args2 }) => [{
|
|
243
|
+
step: "\u6279\u51C6\u53D6\u6D88\u5355",
|
|
244
|
+
method: "POST",
|
|
245
|
+
path: `/return_refund/202309/cancellations/${args2.id}/approve`,
|
|
246
|
+
body: {}
|
|
247
|
+
}],
|
|
248
|
+
run: ({ shop, args: args2 }) => proxy("POST", shop, `/return_refund/202309/cancellations/${args2.id}/approve`, { body: {} })
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
name: "orders cancel-reject",
|
|
252
|
+
summary: "\u9A73\u56DE\u53D6\u6D88\u5355\uFF08--id --reason\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u9A73\u3002\u4E0D\u53EF\u9006",
|
|
253
|
+
write: true,
|
|
254
|
+
preview: ({ args: args2 }) => [{
|
|
255
|
+
step: "\u9A73\u56DE\u53D6\u6D88\u5355",
|
|
256
|
+
method: "POST",
|
|
257
|
+
path: `/return_refund/202309/cancellations/${args2.id}/reject`,
|
|
258
|
+
body: { reject_reason: args2.reason }
|
|
259
|
+
}],
|
|
260
|
+
run: ({ shop, args: args2 }) => proxy(
|
|
261
|
+
"POST",
|
|
262
|
+
shop,
|
|
263
|
+
`/return_refund/202309/cancellations/${args2.id}/reject`,
|
|
264
|
+
{ body: { reject_reason: args2.reason } }
|
|
265
|
+
)
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
name: "orders return-approve",
|
|
269
|
+
summary: "\u6279\u51C6\u9000\u8D27\u5355\uFF08--id return_id\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u6279\u3002\u4E0D\u53EF\u9006",
|
|
270
|
+
write: true,
|
|
271
|
+
preview: ({ args: args2 }) => [{
|
|
272
|
+
step: "\u6279\u51C6\u9000\u8D27\u5355",
|
|
273
|
+
method: "POST",
|
|
274
|
+
path: `/return_refund/202309/returns/${args2.id}/approve`,
|
|
275
|
+
body: {}
|
|
276
|
+
}],
|
|
277
|
+
run: ({ shop, args: args2 }) => proxy("POST", shop, `/return_refund/202309/returns/${args2.id}/approve`, { body: {} })
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
name: "orders return-reject",
|
|
281
|
+
summary: "\u9A73\u56DE\u9000\u8D27\u5355\uFF08--id --reason\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u9A73\u3002\u4E0D\u53EF\u9006",
|
|
282
|
+
write: true,
|
|
283
|
+
preview: ({ args: args2 }) => [{
|
|
284
|
+
step: "\u9A73\u56DE\u9000\u8D27\u5355",
|
|
285
|
+
method: "POST",
|
|
286
|
+
path: `/return_refund/202309/returns/${args2.id}/reject`,
|
|
287
|
+
body: { reject_reason: args2.reason }
|
|
288
|
+
}],
|
|
289
|
+
run: ({ shop, args: args2 }) => proxy(
|
|
290
|
+
"POST",
|
|
291
|
+
shop,
|
|
292
|
+
`/return_refund/202309/returns/${args2.id}/reject`,
|
|
293
|
+
{ body: { reject_reason: args2.reason } }
|
|
294
|
+
)
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
name: "orders create-package",
|
|
298
|
+
summary: "\u4E3A\u8BA2\u5355\u5EFA\u5305\u88F9\uFF08--order id --body-file pkg.json\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u5EFA\u3002\u4EC5\u76F4\u53D1\u5546\u5BB6\uFF08\u7269\u6D41\u9ED8\u8BA4 ERP \u7BA1\uFF09",
|
|
299
|
+
write: true,
|
|
300
|
+
preview: ({ args: args2 }) => [{
|
|
301
|
+
step: "\u5EFA\u5305\u88F9",
|
|
302
|
+
method: "POST",
|
|
303
|
+
path: `/fulfillment/202309/orders/${args2.order}/packages`,
|
|
304
|
+
body: readBodyFile(args2["body-file"])
|
|
305
|
+
}],
|
|
306
|
+
run: ({ shop, args: args2 }) => proxy(
|
|
307
|
+
"POST",
|
|
308
|
+
shop,
|
|
309
|
+
`/fulfillment/202309/orders/${args2.order}/packages`,
|
|
310
|
+
{ body: readBodyFile(args2["body-file"]) }
|
|
311
|
+
)
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
name: "packages ship",
|
|
315
|
+
summary: "\u53D1\u8D27\uFF08--package id --body-file ship.json\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u53D1\u3002\u4E0D\u53EF\u9006\uFF0C\u4EC5\u76F4\u53D1\u5546\u5BB6",
|
|
316
|
+
write: true,
|
|
317
|
+
preview: ({ args: args2 }) => [{
|
|
318
|
+
step: "\u53D1\u8D27",
|
|
319
|
+
method: "POST",
|
|
320
|
+
path: `/fulfillment/202309/packages/${args2.package}/ship`,
|
|
321
|
+
body: readBodyFile(args2["body-file"])
|
|
322
|
+
}],
|
|
323
|
+
run: ({ shop, args: args2 }) => proxy(
|
|
324
|
+
"POST",
|
|
325
|
+
shop,
|
|
326
|
+
`/fulfillment/202309/packages/${args2.package}/ship`,
|
|
327
|
+
{ body: readBodyFile(args2["body-file"]) }
|
|
328
|
+
)
|
|
329
|
+
},
|
|
330
|
+
// ── webhook 事件流(backend 自有事件库,不走 /proxy)──
|
|
331
|
+
{
|
|
332
|
+
name: "events",
|
|
333
|
+
summary: "\u67E5\u5E97\u94FA webhook \u4E8B\u4EF6\uFF08--type \u9017\u53F7\u5206\u9694 --since 1d/unix --unprocessed --limit\uFF09",
|
|
334
|
+
run: ({ shop, args: args2 }) => {
|
|
335
|
+
const q = {};
|
|
336
|
+
if (args2.type) q.type = args2.type;
|
|
337
|
+
if (args2.since) q.since = args2.since;
|
|
338
|
+
if (args2.unprocessed) q.unprocessed = "true";
|
|
339
|
+
if (args2.limit) q.limit = String(args2.limit);
|
|
340
|
+
return fetchEvents(shop, q);
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
name: "events ack",
|
|
345
|
+
summary: "\u6807\u4E8B\u4EF6\u5DF2\u5904\u7406\uFF08--ids id1,id2 \u6216 --before <ts>\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u6807",
|
|
346
|
+
write: true,
|
|
347
|
+
preview: ({ args: args2 }) => [{
|
|
348
|
+
step: "\u6807\u4E8B\u4EF6\u5DF2\u5904\u7406",
|
|
349
|
+
method: "POST",
|
|
350
|
+
path: "/events/{shop}/ack",
|
|
351
|
+
body: args2.ids ? { event_ids: String(args2.ids).split(",") } : { before: args2.before }
|
|
352
|
+
}],
|
|
353
|
+
run: ({ shop, args: args2 }) => ackEvents(shop, args2.ids ? { event_ids: String(args2.ids).split(",") } : { before: args2.before })
|
|
354
|
+
},
|
|
138
355
|
{
|
|
139
356
|
name: "analytics shop",
|
|
140
357
|
summary: "\u5E97\u94FA\u7ECF\u8425\u6570\u636E\uFF08--from --to\uFF0C\u9ED8\u8BA4\u8FD130\u5929\uFF09",
|