paygate-mcp 3.9.0 → 4.1.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/README.md +97 -0
- package/dist/audit.d.ts +1 -1
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js.map +1 -1
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +254 -0
- package/dist/server.js.map +1 -1
- package/dist/store.d.ts +19 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +76 -0
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -67,6 +67,8 @@ Agent → PayGate (auth + billing) → Your MCP Server (stdio or HTTP)
|
|
|
67
67
|
- **Key Groups** — Policy templates that apply shared ACL, rate limits, pricing overrides, IP allowlists, and quotas to groups of API keys with automatic inheritance and key-level override support
|
|
68
68
|
- **Refund on Failure** — Automatically refund credits when downstream tool calls fail
|
|
69
69
|
- **Credit Transfers** — Atomically transfer credits between API keys with validation, audit trail, and webhook events
|
|
70
|
+
- **Bulk Key Operations** — Execute multiple key operations (create, topup, revoke) in a single request with per-operation error handling and index tracking
|
|
71
|
+
- **Key Import/Export** — Export all API keys for backup/migration (JSON or CSV) and import with conflict resolution (skip, overwrite, error modes)
|
|
70
72
|
- **Webhook Filters** — Route webhook events to different destinations based on event type and API key prefix with per-filter secrets, independent retry queues, and admin CRUD API
|
|
71
73
|
- **Webhook Events** — POST batched usage events to any URL for external billing/alerting
|
|
72
74
|
- **Config File Mode** — Load all settings from a JSON file (`--config`)
|
|
@@ -282,6 +284,9 @@ A real-time admin UI for managing keys, viewing usage, and monitoring tool calls
|
|
|
282
284
|
| `/keys` | GET | `X-Admin-Key` | List all keys (masked, with expiry status) |
|
|
283
285
|
| `/topup` | POST | `X-Admin-Key` | Add credits to an existing key |
|
|
284
286
|
| `/keys/transfer` | POST | `X-Admin-Key` | Transfer credits between API keys |
|
|
287
|
+
| `/keys/bulk` | POST | `X-Admin-Key` | Execute multiple key operations (create, topup, revoke) in one request |
|
|
288
|
+
| `/keys/export` | GET | `X-Admin-Key` | Export all API keys for backup/migration (JSON or CSV) |
|
|
289
|
+
| `/keys/import` | POST | `X-Admin-Key` | Import API keys from backup with conflict resolution |
|
|
285
290
|
| `/keys/revoke` | POST | `X-Admin-Key` | Revoke an API key |
|
|
286
291
|
| `/keys/rotate` | POST | `X-Admin-Key` | Rotate key (new key, same credits/ACL/quotas) |
|
|
287
292
|
| `/keys/acl` | POST | `X-Admin-Key` | Set tool ACL (whitelist/blacklist) on a key |
|
|
@@ -507,6 +512,96 @@ Response:
|
|
|
507
512
|
|
|
508
513
|
**Audit trail:** Every transfer logs a `key.credits_transferred` audit event with masked keys, amount, balances, and memo.
|
|
509
514
|
|
|
515
|
+
### Bulk Key Operations
|
|
516
|
+
|
|
517
|
+
Execute multiple key operations (create, topup, revoke) in a single request. Failed operations don't stop subsequent ones — each result includes success status and index for easy correlation.
|
|
518
|
+
|
|
519
|
+
```bash
|
|
520
|
+
curl -X POST http://localhost:3402/keys/bulk \
|
|
521
|
+
-H "X-Admin-Key: $ADMIN_KEY" \
|
|
522
|
+
-H "Content-Type: application/json" \
|
|
523
|
+
-d '{
|
|
524
|
+
"operations": [
|
|
525
|
+
{ "action": "create", "name": "api-key-1", "credits": 500, "tags": { "env": "prod" } },
|
|
526
|
+
{ "action": "create", "name": "api-key-2", "credits": 200 },
|
|
527
|
+
{ "action": "topup", "key": "pg_existing_key", "credits": 1000 },
|
|
528
|
+
{ "action": "revoke", "key": "pg_old_key" }
|
|
529
|
+
]
|
|
530
|
+
}'
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
Response:
|
|
534
|
+
```json
|
|
535
|
+
{
|
|
536
|
+
"total": 4,
|
|
537
|
+
"succeeded": 4,
|
|
538
|
+
"failed": 0,
|
|
539
|
+
"results": [
|
|
540
|
+
{ "index": 0, "action": "create", "success": true, "result": { "key": "pg_abc...", "name": "api-key-1", "credits": 500 } },
|
|
541
|
+
{ "index": 1, "action": "create", "success": true, "result": { "key": "pg_def...", "name": "api-key-2", "credits": 200 } },
|
|
542
|
+
{ "index": 2, "action": "topup", "success": true, "result": { "creditsAdded": 1000, "newBalance": 1500 } },
|
|
543
|
+
{ "index": 3, "action": "revoke", "success": true, "result": { "message": "Key revoked" } }
|
|
544
|
+
]
|
|
545
|
+
}
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
**Actions:** `create` (with optional name, credits, tags, namespace, allowedTools, deniedTools), `topup` (key + credits), `revoke` (key). Unknown actions return an error result without stopping the batch.
|
|
549
|
+
|
|
550
|
+
**Limits:** Maximum 100 operations per request. Empty operations array returns 400.
|
|
551
|
+
|
|
552
|
+
**Audit trail:** Each successful operation logs an individual audit event with "(bulk)" suffix.
|
|
553
|
+
|
|
554
|
+
### Key Import/Export
|
|
555
|
+
|
|
556
|
+
Export all API keys for backup or migration between PayGate instances:
|
|
557
|
+
|
|
558
|
+
```bash
|
|
559
|
+
# Export as JSON (includes full key secrets)
|
|
560
|
+
curl http://localhost:3402/keys/export \
|
|
561
|
+
-H "X-Admin-Key: $ADMIN_KEY" \
|
|
562
|
+
-o paygate-keys-backup.json
|
|
563
|
+
|
|
564
|
+
# Export as CSV
|
|
565
|
+
curl "http://localhost:3402/keys/export?format=csv" \
|
|
566
|
+
-H "X-Admin-Key: $ADMIN_KEY" \
|
|
567
|
+
-o paygate-keys-backup.csv
|
|
568
|
+
|
|
569
|
+
# Export only active keys in a specific namespace
|
|
570
|
+
curl "http://localhost:3402/keys/export?activeOnly=true&namespace=production" \
|
|
571
|
+
-H "X-Admin-Key: $ADMIN_KEY"
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
Import keys into a PayGate instance:
|
|
575
|
+
|
|
576
|
+
```bash
|
|
577
|
+
curl -X POST http://localhost:3402/keys/import \
|
|
578
|
+
-H "X-Admin-Key: $ADMIN_KEY" \
|
|
579
|
+
-H "Content-Type: application/json" \
|
|
580
|
+
-d '{
|
|
581
|
+
"keys": [{ "key": "pg_abc123...", "name": "my-key", "credits": 500, "active": true, "tags": {} }],
|
|
582
|
+
"mode": "skip"
|
|
583
|
+
}'
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
Response:
|
|
587
|
+
```json
|
|
588
|
+
{
|
|
589
|
+
"total": 1,
|
|
590
|
+
"imported": 1,
|
|
591
|
+
"overwritten": 0,
|
|
592
|
+
"skipped": 0,
|
|
593
|
+
"errors": 0,
|
|
594
|
+
"mode": "skip",
|
|
595
|
+
"results": [{ "key": "pg_abc123...", "name": "my-key", "status": "imported" }]
|
|
596
|
+
}
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
**Conflict modes:** `skip` (default) — skip keys that already exist, `overwrite` — replace existing keys, `error` — fail on duplicate keys.
|
|
600
|
+
|
|
601
|
+
**Limits:** Maximum 1000 keys per import request. Keys must start with `pg_` prefix.
|
|
602
|
+
|
|
603
|
+
**Export formats:** JSON (full records with all fields) or CSV (key subset for spreadsheet use).
|
|
604
|
+
|
|
510
605
|
### Spending Limits
|
|
511
606
|
|
|
512
607
|
Cap the total credits any API key can spend:
|
|
@@ -1990,6 +2085,8 @@ const result = await client.callTool('search', { query: 'hello' });
|
|
|
1990
2085
|
- [x] Admin API key management — Multiple admin keys with role-based permissions (super_admin, admin, viewer)
|
|
1991
2086
|
- [x] Webhook filters — Route events to multiple destinations by event type and key prefix with independent retry queues
|
|
1992
2087
|
- [x] Credit transfers — Atomically transfer credits between API keys with validation and audit trail
|
|
2088
|
+
- [x] Bulk key operations — Execute multiple create/topup/revoke operations in one request with per-operation error handling
|
|
2089
|
+
- [x] Key import/export — Export keys (JSON/CSV) for backup/migration, import with conflict resolution (skip, overwrite, error modes)
|
|
1993
2090
|
|
|
1994
2091
|
## Requirements
|
|
1995
2092
|
|
package/dist/audit.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* session lifecycle, and admin operations. Ring buffer with configurable
|
|
6
6
|
* max size and age-based retention. Zero external dependencies.
|
|
7
7
|
*/
|
|
8
|
-
export type AuditEventType = 'key.created' | 'key.revoked' | 'key.rotated' | 'key.topup' | 'key.acl_updated' | 'key.expiry_updated' | 'key.quota_updated' | 'key.tags_updated' | 'key.ip_updated' | 'key.limit_updated' | 'gate.allow' | 'gate.deny' | 'session.created' | 'session.destroyed' | 'oauth.client_registered' | 'oauth.token_issued' | 'oauth.token_revoked' | 'team.created' | 'team.updated' | 'team.deleted' | 'team.key_assigned' | 'team.key_removed' | 'admin.auth_failed' | 'admin.alerts_configured' | 'webhook.dead_letter_cleared' | 'token.created' | 'token.revoked' | 'billing.refund' | 'key.auto_topup_configured' | 'key.auto_topped_up' | 'admin_key.created' | 'admin_key.revoked' | 'group.created' | 'group.updated' | 'group.deleted' | 'group.key_assigned' | 'group.key_removed' | 'key.credits_transferred' | 'webhook_filter.created' | 'webhook_filter.updated' | 'webhook_filter.deleted';
|
|
8
|
+
export type AuditEventType = 'key.created' | 'key.revoked' | 'key.rotated' | 'key.topup' | 'key.acl_updated' | 'key.expiry_updated' | 'key.quota_updated' | 'key.tags_updated' | 'key.ip_updated' | 'key.limit_updated' | 'gate.allow' | 'gate.deny' | 'session.created' | 'session.destroyed' | 'oauth.client_registered' | 'oauth.token_issued' | 'oauth.token_revoked' | 'team.created' | 'team.updated' | 'team.deleted' | 'team.key_assigned' | 'team.key_removed' | 'admin.auth_failed' | 'admin.alerts_configured' | 'webhook.dead_letter_cleared' | 'token.created' | 'token.revoked' | 'billing.refund' | 'key.auto_topup_configured' | 'key.auto_topped_up' | 'admin_key.created' | 'admin_key.revoked' | 'group.created' | 'group.updated' | 'group.deleted' | 'group.key_assigned' | 'group.key_removed' | 'key.credits_transferred' | 'keys.exported' | 'keys.imported' | 'webhook_filter.created' | 'webhook_filter.updated' | 'webhook_filter.deleted';
|
|
9
9
|
export interface AuditEvent {
|
|
10
10
|
/** Monotonically increasing ID */
|
|
11
11
|
id: number;
|
package/dist/audit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -125,6 +125,9 @@ export declare class PayGateServer {
|
|
|
125
125
|
private handleListKeys;
|
|
126
126
|
private handleTopUp;
|
|
127
127
|
private handleCreditTransfer;
|
|
128
|
+
private handleBulkOperations;
|
|
129
|
+
private handleKeyExport;
|
|
130
|
+
private handleKeyImport;
|
|
128
131
|
private handleRevokeKey;
|
|
129
132
|
private handleRotateKey;
|
|
130
133
|
private handleSetAcl;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -335,6 +335,12 @@ class PayGateServer {
|
|
|
335
335
|
return this.handleTopUp(req, res);
|
|
336
336
|
case '/keys/transfer':
|
|
337
337
|
return this.handleCreditTransfer(req, res);
|
|
338
|
+
case '/keys/bulk':
|
|
339
|
+
return this.handleBulkOperations(req, res);
|
|
340
|
+
case '/keys/export':
|
|
341
|
+
return this.handleKeyExport(req, res);
|
|
342
|
+
case '/keys/import':
|
|
343
|
+
return this.handleKeyImport(req, res);
|
|
338
344
|
case '/balance':
|
|
339
345
|
return this.handleBalance(req, res);
|
|
340
346
|
case '/limits':
|
|
@@ -821,6 +827,9 @@ class PayGateServer {
|
|
|
821
827
|
setExpiry: 'POST /keys/expiry — Set key expiry (requires X-Admin-Key)',
|
|
822
828
|
topUp: 'POST /topup — Add credits (requires X-Admin-Key)',
|
|
823
829
|
transfer: 'POST /keys/transfer — Transfer credits between keys (requires X-Admin-Key)',
|
|
830
|
+
bulk: 'POST /keys/bulk — Bulk key operations: create, topup, revoke (requires X-Admin-Key)',
|
|
831
|
+
keyExport: 'GET /keys/export — Export all API keys for backup/migration (requires X-Admin-Key)',
|
|
832
|
+
keyImport: 'POST /keys/import — Import API keys from backup (requires X-Admin-Key)',
|
|
824
833
|
usage: 'GET /usage — Export usage data (requires X-Admin-Key)',
|
|
825
834
|
limits: 'POST /limits — Set spending limit (requires X-Admin-Key)',
|
|
826
835
|
setQuota: 'POST /keys/quota — Set usage quota (requires X-Admin-Key)',
|
|
@@ -1163,6 +1172,251 @@ class PayGateServer {
|
|
|
1163
1172
|
message: `Transferred ${credits} credits`,
|
|
1164
1173
|
}));
|
|
1165
1174
|
}
|
|
1175
|
+
// ─── /keys/bulk — Bulk key operations ──────────────────────────────────────
|
|
1176
|
+
async handleBulkOperations(req, res) {
|
|
1177
|
+
if (req.method !== 'POST') {
|
|
1178
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
1179
|
+
res.end(JSON.stringify({ error: 'Method not allowed' }));
|
|
1180
|
+
return;
|
|
1181
|
+
}
|
|
1182
|
+
if (!this.checkAdmin(req, res, 'admin'))
|
|
1183
|
+
return;
|
|
1184
|
+
const body = await this.readBody(req);
|
|
1185
|
+
let params;
|
|
1186
|
+
try {
|
|
1187
|
+
params = JSON.parse(body);
|
|
1188
|
+
}
|
|
1189
|
+
catch {
|
|
1190
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
1191
|
+
res.end(JSON.stringify({ error: 'Invalid JSON' }));
|
|
1192
|
+
return;
|
|
1193
|
+
}
|
|
1194
|
+
if (!params.operations || !Array.isArray(params.operations) || params.operations.length === 0) {
|
|
1195
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
1196
|
+
res.end(JSON.stringify({ error: 'Missing or empty "operations" array' }));
|
|
1197
|
+
return;
|
|
1198
|
+
}
|
|
1199
|
+
if (params.operations.length > 100) {
|
|
1200
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
1201
|
+
res.end(JSON.stringify({ error: 'Maximum 100 operations per request' }));
|
|
1202
|
+
return;
|
|
1203
|
+
}
|
|
1204
|
+
const results = [];
|
|
1205
|
+
for (let i = 0; i < params.operations.length; i++) {
|
|
1206
|
+
const op = params.operations[i];
|
|
1207
|
+
try {
|
|
1208
|
+
switch (op.action) {
|
|
1209
|
+
case 'create': {
|
|
1210
|
+
const name = String(op.name || 'unnamed').slice(0, 200);
|
|
1211
|
+
const credits = Math.max(0, Math.floor(Number(op.credits) || 100));
|
|
1212
|
+
if (credits <= 0) {
|
|
1213
|
+
results.push({ index: i, action: 'create', success: false, error: 'Credits must be positive' });
|
|
1214
|
+
break;
|
|
1215
|
+
}
|
|
1216
|
+
const record = this.gate.store.createKey(name, credits, {
|
|
1217
|
+
allowedTools: op.allowedTools,
|
|
1218
|
+
deniedTools: op.deniedTools,
|
|
1219
|
+
tags: op.tags,
|
|
1220
|
+
namespace: op.namespace,
|
|
1221
|
+
});
|
|
1222
|
+
if (this.redisSync) {
|
|
1223
|
+
this.redisSync.saveKey(record).catch(() => { });
|
|
1224
|
+
}
|
|
1225
|
+
this.audit.log('key.created', 'admin', `Key created (bulk): ${name}`, {
|
|
1226
|
+
keyMasked: (0, audit_1.maskKeyForAudit)(record.key), name, credits,
|
|
1227
|
+
});
|
|
1228
|
+
results.push({
|
|
1229
|
+
index: i, action: 'create', success: true,
|
|
1230
|
+
result: { key: record.key, name: record.name, credits: record.credits },
|
|
1231
|
+
});
|
|
1232
|
+
break;
|
|
1233
|
+
}
|
|
1234
|
+
case 'topup': {
|
|
1235
|
+
const key = op.key;
|
|
1236
|
+
const amount = Math.floor(Number(op.credits));
|
|
1237
|
+
if (!key) {
|
|
1238
|
+
results.push({ index: i, action: 'topup', success: false, error: 'Missing key' });
|
|
1239
|
+
break;
|
|
1240
|
+
}
|
|
1241
|
+
if (!Number.isFinite(amount) || amount <= 0) {
|
|
1242
|
+
results.push({ index: i, action: 'topup', success: false, error: 'Credits must be a positive integer' });
|
|
1243
|
+
break;
|
|
1244
|
+
}
|
|
1245
|
+
let success;
|
|
1246
|
+
if (this.redisSync) {
|
|
1247
|
+
success = await this.redisSync.atomicTopup(key, amount);
|
|
1248
|
+
}
|
|
1249
|
+
else {
|
|
1250
|
+
success = this.gate.store.addCredits(key, amount);
|
|
1251
|
+
}
|
|
1252
|
+
if (!success) {
|
|
1253
|
+
results.push({ index: i, action: 'topup', success: false, error: 'Key not found or inactive' });
|
|
1254
|
+
break;
|
|
1255
|
+
}
|
|
1256
|
+
const record = this.gate.store.getKey(key);
|
|
1257
|
+
this.audit.log('key.topup', 'admin', `Added ${amount} credits (bulk)`, {
|
|
1258
|
+
keyMasked: (0, audit_1.maskKeyForAudit)(key), creditsAdded: amount, newBalance: record?.credits,
|
|
1259
|
+
});
|
|
1260
|
+
results.push({
|
|
1261
|
+
index: i, action: 'topup', success: true,
|
|
1262
|
+
result: { keyMasked: (0, audit_1.maskKeyForAudit)(key), creditsAdded: amount, newBalance: record?.credits },
|
|
1263
|
+
});
|
|
1264
|
+
break;
|
|
1265
|
+
}
|
|
1266
|
+
case 'revoke': {
|
|
1267
|
+
const key = op.key;
|
|
1268
|
+
if (!key) {
|
|
1269
|
+
results.push({ index: i, action: 'revoke', success: false, error: 'Missing key' });
|
|
1270
|
+
break;
|
|
1271
|
+
}
|
|
1272
|
+
let success;
|
|
1273
|
+
if (this.redisSync) {
|
|
1274
|
+
success = await this.redisSync.revokeKey(key);
|
|
1275
|
+
}
|
|
1276
|
+
else {
|
|
1277
|
+
success = this.gate.store.revokeKey(key);
|
|
1278
|
+
}
|
|
1279
|
+
if (!success) {
|
|
1280
|
+
results.push({ index: i, action: 'revoke', success: false, error: 'Key not found' });
|
|
1281
|
+
break;
|
|
1282
|
+
}
|
|
1283
|
+
this.audit.log('key.revoked', 'admin', 'Key revoked (bulk)', {
|
|
1284
|
+
keyMasked: (0, audit_1.maskKeyForAudit)(key),
|
|
1285
|
+
});
|
|
1286
|
+
this.emitWebhookAdmin('key.revoked', 'admin', { keyMasked: (0, audit_1.maskKeyForAudit)(key) });
|
|
1287
|
+
results.push({
|
|
1288
|
+
index: i, action: 'revoke', success: true,
|
|
1289
|
+
result: { keyMasked: (0, audit_1.maskKeyForAudit)(key) },
|
|
1290
|
+
});
|
|
1291
|
+
break;
|
|
1292
|
+
}
|
|
1293
|
+
default:
|
|
1294
|
+
results.push({ index: i, action: op.action || 'unknown', success: false, error: `Unknown action: ${op.action}` });
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
catch (e) {
|
|
1298
|
+
results.push({ index: i, action: op.action || 'unknown', success: false, error: e.message || 'Internal error' });
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
const succeeded = results.filter(r => r.success).length;
|
|
1302
|
+
const failed = results.filter(r => !r.success).length;
|
|
1303
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
1304
|
+
res.end(JSON.stringify({
|
|
1305
|
+
total: results.length,
|
|
1306
|
+
succeeded,
|
|
1307
|
+
failed,
|
|
1308
|
+
results,
|
|
1309
|
+
}));
|
|
1310
|
+
}
|
|
1311
|
+
// ─── /keys/export — Export all API keys for backup ────────────────────────
|
|
1312
|
+
handleKeyExport(req, res) {
|
|
1313
|
+
if (req.method !== 'GET') {
|
|
1314
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
1315
|
+
res.end(JSON.stringify({ error: 'Method not allowed' }));
|
|
1316
|
+
return;
|
|
1317
|
+
}
|
|
1318
|
+
if (!this.checkAdmin(req, res, 'admin'))
|
|
1319
|
+
return;
|
|
1320
|
+
const urlParts = req.url?.split('?') || [];
|
|
1321
|
+
const params = new URLSearchParams(urlParts[1] || '');
|
|
1322
|
+
const namespace = params.get('namespace') || undefined;
|
|
1323
|
+
const activeOnly = params.get('activeOnly') === 'true';
|
|
1324
|
+
const format = params.get('format') || 'json';
|
|
1325
|
+
const keys = this.gate.store.exportKeys({ namespace, activeOnly });
|
|
1326
|
+
this.audit.log('keys.exported', 'admin', `Exported ${keys.length} keys`, {
|
|
1327
|
+
count: keys.length, namespace: namespace || 'all', activeOnly,
|
|
1328
|
+
});
|
|
1329
|
+
if (format === 'csv') {
|
|
1330
|
+
const headers = ['key', 'name', 'credits', 'totalSpent', 'totalCalls', 'createdAt', 'lastUsedAt', 'active', 'namespace', 'expiresAt', 'spendingLimit'];
|
|
1331
|
+
const rows = keys.map(k => headers.map(h => {
|
|
1332
|
+
const v = k[h];
|
|
1333
|
+
if (v === null || v === undefined)
|
|
1334
|
+
return '';
|
|
1335
|
+
const s = String(v);
|
|
1336
|
+
return s.includes(',') || s.includes('"') || s.includes('\n') ? `"${s.replace(/"/g, '""')}"` : s;
|
|
1337
|
+
}).join(','));
|
|
1338
|
+
const csv = [headers.join(','), ...rows].join('\n');
|
|
1339
|
+
res.writeHead(200, {
|
|
1340
|
+
'Content-Type': 'text/csv',
|
|
1341
|
+
'Content-Disposition': `attachment; filename="paygate-keys-${new Date().toISOString().slice(0, 10)}.csv"`,
|
|
1342
|
+
});
|
|
1343
|
+
res.end(csv);
|
|
1344
|
+
return;
|
|
1345
|
+
}
|
|
1346
|
+
// JSON format
|
|
1347
|
+
res.writeHead(200, {
|
|
1348
|
+
'Content-Type': 'application/json',
|
|
1349
|
+
'Content-Disposition': `attachment; filename="paygate-keys-${new Date().toISOString().slice(0, 10)}.json"`,
|
|
1350
|
+
});
|
|
1351
|
+
res.end(JSON.stringify({
|
|
1352
|
+
version: '1.0',
|
|
1353
|
+
exportedAt: new Date().toISOString(),
|
|
1354
|
+
count: keys.length,
|
|
1355
|
+
keys,
|
|
1356
|
+
}, null, 2));
|
|
1357
|
+
}
|
|
1358
|
+
// ─── /keys/import — Import API keys from backup ───────────────────────────
|
|
1359
|
+
async handleKeyImport(req, res) {
|
|
1360
|
+
if (req.method !== 'POST') {
|
|
1361
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
1362
|
+
res.end(JSON.stringify({ error: 'Method not allowed' }));
|
|
1363
|
+
return;
|
|
1364
|
+
}
|
|
1365
|
+
if (!this.checkAdmin(req, res, 'admin'))
|
|
1366
|
+
return;
|
|
1367
|
+
const body = await this.readBody(req);
|
|
1368
|
+
let params;
|
|
1369
|
+
try {
|
|
1370
|
+
params = JSON.parse(body);
|
|
1371
|
+
}
|
|
1372
|
+
catch {
|
|
1373
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
1374
|
+
res.end(JSON.stringify({ error: 'Invalid JSON' }));
|
|
1375
|
+
return;
|
|
1376
|
+
}
|
|
1377
|
+
if (!params.keys || !Array.isArray(params.keys) || params.keys.length === 0) {
|
|
1378
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
1379
|
+
res.end(JSON.stringify({ error: 'Missing or empty "keys" array' }));
|
|
1380
|
+
return;
|
|
1381
|
+
}
|
|
1382
|
+
if (params.keys.length > 1000) {
|
|
1383
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
1384
|
+
res.end(JSON.stringify({ error: 'Maximum 1000 keys per import request' }));
|
|
1385
|
+
return;
|
|
1386
|
+
}
|
|
1387
|
+
const mode = (params.mode === 'overwrite' || params.mode === 'error') ? params.mode : 'skip';
|
|
1388
|
+
const results = this.gate.store.importKeys(params.keys, mode);
|
|
1389
|
+
// Sync imported keys to Redis if available
|
|
1390
|
+
if (this.redisSync) {
|
|
1391
|
+
for (const r of results) {
|
|
1392
|
+
if (r.status === 'imported' || r.status === 'overwritten') {
|
|
1393
|
+
// Find the full key from the store to sync
|
|
1394
|
+
const allKeys = this.gate.store.exportKeys();
|
|
1395
|
+
const full = allKeys.find(k => k.key.slice(0, 10) + '...' === r.key);
|
|
1396
|
+
if (full) {
|
|
1397
|
+
this.redisSync.saveKey(full).catch(() => { });
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
}
|
|
1402
|
+
const imported = results.filter(r => r.status === 'imported').length;
|
|
1403
|
+
const overwritten = results.filter(r => r.status === 'overwritten').length;
|
|
1404
|
+
const skipped = results.filter(r => r.status === 'skipped').length;
|
|
1405
|
+
const errors = results.filter(r => r.status === 'error').length;
|
|
1406
|
+
this.audit.log('keys.imported', 'admin', `Imported ${imported + overwritten} keys (${skipped} skipped, ${errors} errors)`, {
|
|
1407
|
+
imported, overwritten, skipped, errors, mode,
|
|
1408
|
+
});
|
|
1409
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
1410
|
+
res.end(JSON.stringify({
|
|
1411
|
+
total: results.length,
|
|
1412
|
+
imported,
|
|
1413
|
+
overwritten,
|
|
1414
|
+
skipped,
|
|
1415
|
+
errors,
|
|
1416
|
+
mode,
|
|
1417
|
+
results,
|
|
1418
|
+
}));
|
|
1419
|
+
}
|
|
1166
1420
|
// ─── /keys/revoke — Revoke a key ──────────────────────────────────────────
|
|
1167
1421
|
async handleRevokeKey(req, res) {
|
|
1168
1422
|
if (req.method !== 'POST') {
|