payment-kit 1.29.1 → 1.29.2
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/api/dev.ts +41 -2
- package/api/hono.d.ts +42 -0
- package/api/node-sqlite.d.ts +12 -0
- package/api/src/bootstrap.ts +36 -0
- package/api/src/crons/base.ts +3 -3
- package/api/src/crons/currency.ts +1 -1
- package/api/src/crons/index.ts +27 -24
- package/api/src/crons/metering-subscription-detection.ts +1 -1
- package/api/src/crons/overdue-detection.ts +2 -2
- package/api/src/crons/retry-pending-events.ts +6 -0
- package/api/src/index.ts +22 -161
- package/api/src/integrations/app-store/client.ts +3 -4
- package/api/src/integrations/app-store/handlers/subscription.ts +7 -7
- package/api/src/integrations/app-store/signed-data-verifier.ts +3 -2
- package/api/src/integrations/arcblock/token.ts +21 -7
- package/api/src/integrations/google-play/handlers/subscription.ts +6 -6
- package/api/src/integrations/google-play/handlers/voided.ts +2 -2
- package/api/src/integrations/google-play/verify.ts +3 -2
- package/api/src/integrations/iap-reconcile.ts +3 -5
- package/api/src/integrations/stripe/handlers/invoice.ts +2 -2
- package/api/src/integrations/stripe/handlers/subscription.ts +3 -3
- package/api/src/libs/archive/query.ts +19 -0
- package/api/src/libs/audit.ts +61 -4
- package/api/src/libs/auth.ts +99 -38
- package/api/src/libs/context.ts +78 -1
- package/api/src/libs/currency.ts +2 -2
- package/api/src/libs/dayjs.ts +8 -2
- package/api/src/libs/drivers/auth-storage.ts +118 -0
- package/api/src/libs/drivers/cron.ts +264 -0
- package/api/src/libs/drivers/db.ts +170 -0
- package/api/src/libs/drivers/identity.ts +81 -0
- package/api/src/libs/drivers/index.ts +40 -0
- package/api/src/libs/drivers/locks.ts +226 -0
- package/api/src/libs/drivers/migrate-runner.ts +70 -0
- package/api/src/libs/drivers/queue.ts +104 -0
- package/api/src/libs/drivers/secrets.ts +194 -0
- package/api/src/libs/env.ts +170 -54
- package/api/src/libs/exchange-rate/service.ts +7 -6
- package/api/src/libs/http-fetch-adapter.ts +50 -0
- package/api/src/libs/invoice.ts +1 -1
- package/api/src/libs/lock.ts +51 -47
- package/api/src/libs/logger.ts +48 -8
- package/api/src/libs/notification/index.ts +1 -1
- package/api/src/libs/notification/template/customer-credit-low-balance.ts +2 -1
- package/api/src/libs/notification/template/customer-revenue-succeeded.ts +1 -1
- package/api/src/libs/notification/template/customer-reward-succeeded.ts +1 -1
- package/api/src/libs/overdraft-protection.ts +1 -1
- package/api/src/libs/payout.ts +1 -1
- package/api/src/libs/queue/index.ts +259 -52
- package/api/src/libs/queue/runtime.ts +175 -0
- package/api/src/libs/resource.ts +3 -3
- package/api/src/libs/secrets.ts +38 -0
- package/api/src/libs/session.ts +3 -2
- package/api/src/libs/subscription.ts +5 -5
- package/api/src/libs/tenant.ts +92 -0
- package/api/src/libs/url.ts +3 -3
- package/api/src/libs/util.ts +21 -13
- package/api/src/middlewares/hono/cdn.ts +63 -0
- package/api/src/middlewares/hono/context.ts +73 -0
- package/api/src/middlewares/hono/csrf.ts +72 -0
- package/api/src/middlewares/hono/fallback.ts +194 -0
- package/api/src/middlewares/hono/pipeline.ts +73 -0
- package/api/src/middlewares/hono/resource-mount.ts +42 -0
- package/api/src/middlewares/hono/resource.ts +63 -0
- package/api/src/middlewares/hono/security.ts +214 -0
- package/api/src/middlewares/hono/session.ts +114 -0
- package/api/src/middlewares/hono/xss.ts +61 -0
- package/api/src/queues/auto-recharge.ts +12 -10
- package/api/src/queues/checkout-session.ts +17 -12
- package/api/src/queues/credit-consume.ts +40 -36
- package/api/src/queues/credit-grant.ts +25 -18
- package/api/src/queues/credit-reconciliation.ts +7 -5
- package/api/src/queues/discount-status.ts +9 -6
- package/api/src/queues/event.ts +12 -4
- package/api/src/queues/exchange-rate-health.ts +49 -30
- package/api/src/queues/invoice.ts +18 -15
- package/api/src/queues/notification.ts +14 -7
- package/api/src/queues/payment.ts +41 -28
- package/api/src/queues/payout.ts +9 -5
- package/api/src/queues/refund.ts +18 -12
- package/api/src/queues/subscription.ts +83 -53
- package/api/src/queues/token-transfer.ts +15 -10
- package/api/src/queues/usage-record.ts +8 -5
- package/api/src/queues/vendors/commission.ts +7 -5
- package/api/src/queues/vendors/fulfillment-coordinator.ts +17 -13
- package/api/src/queues/vendors/fulfillment.ts +4 -2
- package/api/src/queues/vendors/return-processor.ts +5 -3
- package/api/src/queues/vendors/return-scanner.ts +5 -4
- package/api/src/queues/vendors/status-check.ts +10 -7
- package/api/src/queues/webhook.ts +60 -32
- package/api/src/routes/connect/shared.ts +1 -2
- package/api/src/routes/connect/subscribe.ts +3 -3
- package/api/src/routes/{archive.ts → hono/archive.ts} +69 -64
- package/api/src/routes/{auto-recharge-configs.ts → hono/auto-recharge-configs.ts} +39 -28
- package/api/src/routes/{checkout-sessions.ts → hono/checkout-sessions.ts} +790 -923
- package/api/src/routes/{coupons.ts → hono/coupons.ts} +93 -76
- package/api/src/routes/{credit-grants.ts → hono/credit-grants.ts} +140 -126
- package/api/src/routes/hono/credit-tokens.ts +43 -0
- package/api/src/routes/{credit-transactions.ts → hono/credit-transactions.ts} +37 -29
- package/api/src/routes/{customers.ts → hono/customers.ts} +193 -223
- package/api/src/routes/{donations.ts → hono/donations.ts} +41 -32
- package/api/src/routes/{entitlements.ts → hono/entitlements.ts} +28 -25
- package/api/src/routes/{events.ts → hono/events.ts} +107 -71
- package/api/src/routes/{exchange-rate-providers.ts → hono/exchange-rate-providers.ts} +138 -126
- package/api/src/routes/hono/exchange-rates.ts +77 -0
- package/api/src/routes/hono/index.ts +115 -0
- package/api/src/routes/{integrations → hono/integrations}/app-store.ts +68 -48
- package/api/src/routes/{integrations → hono/integrations}/google-play.ts +78 -58
- package/api/src/routes/hono/integrations/stripe.ts +74 -0
- package/api/src/routes/{invoices.ts → hono/invoices.ts} +253 -244
- package/api/src/routes/{meter-events.ts → hono/meter-events.ts} +120 -110
- package/api/src/routes/hono/meters.ts +288 -0
- package/api/src/routes/hono/passports.ts +73 -0
- package/api/src/routes/{payment-currencies.ts → hono/payment-currencies.ts} +219 -197
- package/api/src/routes/{payment-intents.ts → hono/payment-intents.ts} +136 -132
- package/api/src/routes/{payment-links.ts → hono/payment-links.ts} +145 -128
- package/api/src/routes/{payment-methods.ts → hono/payment-methods.ts} +125 -93
- package/api/src/routes/{payment-stats.ts → hono/payment-stats.ts} +30 -25
- package/api/src/routes/{payouts.ts → hono/payouts.ts} +55 -47
- package/api/src/routes/{prices.ts → hono/prices.ts} +265 -242
- package/api/src/routes/{pricing-table.ts → hono/pricing-table.ts} +94 -87
- package/api/src/routes/{products.ts → hono/products.ts} +172 -159
- package/api/src/routes/{promotion-codes.ts → hono/promotion-codes.ts} +207 -185
- package/api/src/routes/hono/redirect.ts +24 -0
- package/api/src/routes/{refunds.ts → hono/refunds.ts} +96 -80
- package/api/src/routes/{settings.ts → hono/settings.ts} +64 -55
- package/api/src/routes/{subscription-items.ts → hono/subscription-items.ts} +64 -57
- package/api/src/routes/{subscriptions.ts → hono/subscriptions.ts} +475 -528
- package/api/src/routes/{tax-rates.ts → hono/tax-rates.ts} +71 -70
- package/api/src/routes/hono/tool.ts +69 -0
- package/api/src/routes/{usage-records.ts → hono/usage-records.ts} +47 -42
- package/api/src/routes/{vendor.ts → hono/vendor.ts} +315 -167
- package/api/src/routes/{webhook-attempts.ts → hono/webhook-attempts.ts} +17 -13
- package/api/src/routes/hono/webhook-endpoints.ts +126 -0
- package/api/src/service.ts +667 -0
- package/api/src/store/migrations/20230911-seeding.ts +2 -1
- package/api/src/store/migrations/20260609-remove-did-space-jobs.ts +23 -0
- package/api/src/store/migrations/20260610-tenant-columns.ts +40 -0
- package/api/src/store/migrations/20260611-tenant-backfill.ts +33 -0
- package/api/src/store/models/auto-recharge-config.ts +22 -10
- package/api/src/store/models/checkout-session.ts +15 -14
- package/api/src/store/models/coupon.ts +29 -20
- package/api/src/store/models/credit-grant.ts +38 -29
- package/api/src/store/models/credit-transaction.ts +32 -21
- package/api/src/store/models/customer.ts +19 -17
- package/api/src/store/models/discount.ts +11 -2
- package/api/src/store/models/entitlement-grant.ts +21 -9
- package/api/src/store/models/entitlement-product.ts +21 -9
- package/api/src/store/models/entitlement.ts +19 -10
- package/api/src/store/models/event.ts +18 -9
- package/api/src/store/models/exchange-rate-provider.ts +17 -4
- package/api/src/store/models/invoice-item.ts +18 -9
- package/api/src/store/models/invoice.ts +16 -8
- package/api/src/store/models/meter-event.ts +27 -9
- package/api/src/store/models/meter.ts +31 -22
- package/api/src/store/models/payment-currency.ts +25 -8
- package/api/src/store/models/payment-intent.ts +15 -6
- package/api/src/store/models/payment-link.ts +15 -6
- package/api/src/store/models/payment-method.ts +38 -22
- package/api/src/store/models/payment-stat.ts +18 -9
- package/api/src/store/models/payout.ts +15 -6
- package/api/src/store/models/price-quote.ts +17 -8
- package/api/src/store/models/price.ts +24 -12
- package/api/src/store/models/pricing-table.ts +29 -20
- package/api/src/store/models/product-vendor.ts +20 -10
- package/api/src/store/models/product.ts +15 -6
- package/api/src/store/models/promotion-code.ts +14 -6
- package/api/src/store/models/refund.ts +15 -6
- package/api/src/store/models/revenue-snapshot.ts +21 -9
- package/api/src/store/models/setting.ts +18 -9
- package/api/src/store/models/setup-intent.ts +36 -27
- package/api/src/store/models/subscription-item.ts +21 -9
- package/api/src/store/models/subscription-schedule.ts +21 -9
- package/api/src/store/models/subscription.ts +21 -10
- package/api/src/store/models/tax-rate.ts +29 -21
- package/api/src/store/models/usage-record.ts +11 -2
- package/api/src/store/models/webhook-attempt.ts +18 -9
- package/api/src/store/models/webhook-endpoint.ts +18 -9
- package/api/src/store/scoped-core.ts +55 -0
- package/api/src/store/scoped.ts +247 -0
- package/api/src/store/sequelize.ts +66 -22
- package/api/src/store/sql-migrations.ts +20 -0
- package/api/src/store/tenant-backfill.ts +260 -0
- package/api/src/store/tenant-model.ts +124 -0
- package/api/src/store/tenant-tables.ts +50 -0
- package/api/tests/embedded/embedded-multi-mode-d3.spec.ts +257 -0
- package/api/tests/fixtures/bare-query-violation.ts +13 -0
- package/api/tests/fixtures/core-env-violation.ts +10 -0
- package/api/tests/fixtures/host-read-violation.ts +19 -0
- package/api/tests/fixtures/tenants.ts +4 -0
- package/api/tests/integrations/iap-tenant.spec.ts +284 -0
- package/api/tests/libs/archive-query.spec.ts +26 -0
- package/api/tests/libs/audit-tenant.spec.ts +153 -0
- package/api/tests/libs/context.spec.ts +204 -0
- package/api/tests/libs/core-config.spec.ts +115 -0
- package/api/tests/libs/cron-driver-d2.spec.ts +237 -0
- package/api/tests/libs/crons-conservation-d2.spec.ts +52 -0
- package/api/tests/libs/lock-tenant.spec.ts +66 -0
- package/api/tests/libs/scoped.spec.ts +222 -0
- package/api/tests/libs/secrets-facade.spec.ts +52 -0
- package/api/tests/libs/tenancy-slot-authority.spec.ts +209 -0
- package/api/tests/libs/tenant-middleware.spec.ts +42 -0
- package/api/tests/libs/tenant-scanner.spec.ts +120 -0
- package/api/tests/middlewares/hono/cdn.spec.ts +70 -0
- package/api/tests/middlewares/hono/context.spec.ts +113 -0
- package/api/tests/middlewares/hono/csrf.spec.ts +136 -0
- package/api/tests/middlewares/hono/fallback.spec.ts +67 -0
- package/api/tests/middlewares/hono/pipeline.spec.ts +47 -0
- package/api/tests/middlewares/hono/security.spec.ts +181 -0
- package/api/tests/middlewares/hono/session.spec.ts +42 -0
- package/api/tests/middlewares/hono/xss.spec.ts +81 -0
- package/api/tests/models/tenant-backfill.spec.ts +287 -0
- package/api/tests/models/tenant-columns-model.spec.ts +46 -0
- package/api/tests/models/tenant-columns.spec.ts +161 -0
- package/api/tests/queues/credit-consume-batch.spec.ts +8 -1
- package/api/tests/queues/credit-consume.spec.ts +8 -1
- package/api/tests/queues/event-tenant.spec.ts +236 -0
- package/api/tests/queues/exchange-rate-health-tenant-d6.spec.ts +62 -0
- package/api/tests/queues/queue-parity.spec.ts +249 -0
- package/api/tests/queues/queue-runtime-surface.spec.ts +277 -0
- package/api/tests/queues/queue-teardown-d2.spec.ts +127 -0
- package/api/tests/queues/tenant-matrix-a.spec.ts +245 -0
- package/api/tests/queues/tenant-matrix-b.spec.ts +168 -0
- package/api/tests/routes/connect/hono-attach.spec.ts +107 -0
- package/api/tests/service/collapse.spec.ts +96 -0
- package/api/tests/store/tenant-crosscut.spec.ts +202 -0
- package/api/tests/store/tenant-model-spike.spec.ts +177 -0
- package/api/tests/store/tenant-model.spec.ts +162 -0
- package/api/tests/store/tenant-residual.spec.ts +196 -0
- package/api/third.d.ts +4 -0
- package/blocklet.yml +1 -1
- package/cloudflare/README.md +26 -6
- package/cloudflare/build.ts +28 -13
- package/cloudflare/did-connect-auth.ts +0 -217
- package/cloudflare/migrations/0006_tenant_columns.sql +46 -0
- package/cloudflare/migrations/0007_tenant_backfill_indexes.sql +65 -0
- package/cloudflare/migrations/0008_schema_parity.sql +16 -0
- package/cloudflare/migrations/0009_remove_did_space_jobs.sql +5 -0
- package/cloudflare/queue-runtime-mode.ts +13 -0
- package/cloudflare/run-build.js +10 -56
- package/cloudflare/shims/blocklet-sdk/asset-host-transformer.ts +20 -0
- package/cloudflare/shims/blocklet-sdk/config.ts +8 -1
- package/cloudflare/shims/blocklet-sdk/login.ts +12 -0
- package/cloudflare/shims/blocklet-sdk/service-api.ts +14 -0
- package/cloudflare/shims/blocklet-sdk/session.ts +4 -2
- package/cloudflare/shims/blocklet-sdk/util-constants.ts +8 -0
- package/cloudflare/shims/blocklet-sdk/util-csrf.ts +13 -0
- package/cloudflare/shims/blocklet-sdk/util-wallet.ts +8 -0
- package/cloudflare/shims/cron.ts +38 -158
- package/cloudflare/shims/events.ts +124 -0
- package/cloudflare/shims/fastq.ts +15 -1
- package/cloudflare/shims/nedb-storage.ts +16 -8
- package/cloudflare/shims/xss.ts +8 -0
- package/cloudflare/tenant-middleware.ts +36 -0
- package/cloudflare/tests/tenant-middleware.spec.ts +160 -0
- package/cloudflare/tests/worker-handler-gate.spec.ts +44 -0
- package/cloudflare/worker.ts +204 -433
- package/cloudflare/wrangler.local-e2e.jsonc +26 -0
- package/jest.config.js +3 -1
- package/package.json +33 -38
- package/scripts/core-env-whitelist.json +1 -0
- package/scripts/e2e-12b-runtime.ts +149 -0
- package/scripts/e2e-core-config.ts +125 -0
- package/scripts/e2e-d1-tenancy.ts +116 -0
- package/scripts/e2e-d2-cron-queue.ts +139 -0
- package/scripts/e2e-d3-embedded-multi.ts +171 -0
- package/scripts/e2e-hono-s2.ts +125 -0
- package/scripts/e2e-hono-s3e.ts +135 -0
- package/scripts/e2e-hono-s4.ts +114 -0
- package/scripts/e2e-migration-contract.ts +100 -0
- package/scripts/e2e-s0.ts +61 -0
- package/scripts/e2e-s1.ts +107 -0
- package/scripts/e2e-s2.ts +178 -0
- package/scripts/e2e-s3.ts +110 -0
- package/scripts/e2e-s4.ts +191 -0
- package/scripts/e2e-s5.ts +139 -0
- package/scripts/e2e-s6.ts +127 -0
- package/scripts/e2e-tenant-model.ts +119 -0
- package/scripts/e2e-tenant-worker.ts +199 -0
- package/scripts/gen-sql-migrations.js +46 -0
- package/scripts/phase8-codemod.js +219 -0
- package/scripts/phase9a-env-getters-codemod.js +82 -0
- package/scripts/scan-core-env.js +109 -0
- package/scripts/scan-tenant-queries.js +235 -0
- package/scripts/schema-drift-guard.ts +210 -0
- package/scripts/tenant-scan-whitelist.json +1 -0
- package/src/env.d.ts +13 -1
- package/tsconfig.json +1 -1
- package/api/src/libs/did-space.ts +0 -235
- package/api/src/libs/middleware.ts +0 -50
- package/api/src/libs/security.ts +0 -192
- package/api/src/queues/space.ts +0 -662
- package/api/src/routes/credit-tokens.ts +0 -38
- package/api/src/routes/exchange-rates.ts +0 -87
- package/api/src/routes/index.ts +0 -142
- package/api/src/routes/integrations/stripe.ts +0 -61
- package/api/src/routes/meters.ts +0 -274
- package/api/src/routes/passports.ts +0 -68
- package/api/src/routes/redirect.ts +0 -20
- package/api/src/routes/tool.ts +0 -65
- package/api/src/routes/webhook-endpoints.ts +0 -126
- package/api/tests/routes/credit-grants.spec.ts +0 -1261
- package/cloudflare/shims/did-space-js.ts +0 -17
- package/cloudflare/shims/did-space.ts +0 -11
- package/cloudflare/shims/express-compat/index.ts +0 -80
- package/cloudflare/shims/express-compat/types.ts +0 -41
- package/cloudflare/shims/lock.ts +0 -115
- package/cloudflare/shims/queue.ts +0 -611
- package/cloudflare/tests/shims/queue-delayed-persist.spec.ts +0 -87
- package/cloudflare/tests/shims/queue-scheduled.spec.ts +0 -186
|
@@ -1,23 +1,27 @@
|
|
|
1
|
+
// Phase 3 (express→hono) — hono fork of routes/payment-methods.ts. Sub-app with
|
|
2
|
+
// routes relative to /api/payment-methods (mounted via mountResourceGroup). The
|
|
3
|
+
// business logic is unchanged; only the express plumbing becomes hono:
|
|
4
|
+
// req.body → c.get('sanitizedBody'); res.status(n).json(x) → c.json(x, n).
|
|
1
5
|
import { getUrl } from '@blocklet/sdk/lib/component';
|
|
2
6
|
import { fromTokenToUnit } from '@ocap/util';
|
|
3
7
|
import { ethers } from 'ethers';
|
|
4
|
-
import {
|
|
8
|
+
import { Hono } from 'hono';
|
|
5
9
|
import pick from 'lodash/pick';
|
|
6
10
|
import { InferAttributes, Op, WhereOptions } from 'sequelize';
|
|
7
11
|
import cloneDeep from 'lodash/cloneDeep';
|
|
8
12
|
import merge from 'lodash/merge';
|
|
9
13
|
import Joi from 'joi';
|
|
10
|
-
import { ensureWebhookRegistered, cleanupStripeWebhook, validateStripeKeys } from '
|
|
11
|
-
import logger from '
|
|
12
|
-
import { authenticate } from '
|
|
13
|
-
import { PaymentCurrency } from '
|
|
14
|
-
import { PaymentMethod, TPaymentMethod } from '
|
|
15
|
-
import type { EVMChainType, PaymentMethodSettings } from '
|
|
16
|
-
import { ethWallet, wallet } from '
|
|
17
|
-
import { EVM_CHAIN_TYPES } from '
|
|
18
|
-
import { getTokenSummaryByDid } from '
|
|
19
|
-
|
|
20
|
-
const
|
|
14
|
+
import { ensureWebhookRegistered, cleanupStripeWebhook, validateStripeKeys } from '../../integrations/stripe/setup';
|
|
15
|
+
import logger from '../../libs/logger';
|
|
16
|
+
import { authenticate } from '../../middlewares/hono/security';
|
|
17
|
+
import { PaymentCurrency } from '../../store/models/payment-currency';
|
|
18
|
+
import { PaymentMethod, TPaymentMethod } from '../../store/models/payment-method';
|
|
19
|
+
import type { EVMChainType, PaymentMethodSettings } from '../../store/models/types';
|
|
20
|
+
import { ethWallet, wallet } from '../../libs/auth';
|
|
21
|
+
import { EVM_CHAIN_TYPES } from '../../libs/constants';
|
|
22
|
+
import { getTokenSummaryByDid } from '../../integrations/arcblock/stake';
|
|
23
|
+
|
|
24
|
+
const app = new Hono();
|
|
21
25
|
|
|
22
26
|
const auth = authenticate<PaymentMethod>({ component: true, roles: ['owner', 'admin'] });
|
|
23
27
|
|
|
@@ -26,43 +30,44 @@ const paymentMethodCreateSchema = Joi.object({
|
|
|
26
30
|
description: Joi.string().max(255).required(),
|
|
27
31
|
}).unknown(true);
|
|
28
32
|
|
|
29
|
-
|
|
30
|
-
const
|
|
33
|
+
app.post('/', auth, async (c) => {
|
|
34
|
+
const body = c.get('sanitizedBody') ?? {};
|
|
35
|
+
const raw: Partial<TPaymentMethod> = body;
|
|
31
36
|
|
|
32
|
-
raw.livemode =
|
|
37
|
+
raw.livemode = c.get('livemode');
|
|
33
38
|
raw.locked = false;
|
|
34
39
|
raw.active = true;
|
|
35
|
-
const { error } = paymentMethodCreateSchema.validate(pick(
|
|
40
|
+
const { error } = paymentMethodCreateSchema.validate(pick(body, ['name', 'description']));
|
|
36
41
|
if (error) {
|
|
37
|
-
return
|
|
42
|
+
return c.json({ error: error.message }, 400);
|
|
38
43
|
}
|
|
39
44
|
|
|
40
45
|
if (!raw.name) {
|
|
41
|
-
return
|
|
46
|
+
return c.json({ error: 'payment method name is required' }, 400);
|
|
42
47
|
}
|
|
43
48
|
if (!raw.description) {
|
|
44
|
-
return
|
|
49
|
+
return c.json({ error: 'payment method description is required' }, 400);
|
|
45
50
|
}
|
|
46
51
|
|
|
47
52
|
if (!raw.settings) {
|
|
48
|
-
return
|
|
53
|
+
return c.json({ error: 'payment method settings is required' }, 400);
|
|
49
54
|
}
|
|
50
55
|
|
|
51
56
|
if (raw.type === 'stripe') {
|
|
52
57
|
const exist = await PaymentMethod.findOne({ where: { type: 'stripe', livemode: raw.livemode } });
|
|
53
58
|
if (exist) {
|
|
54
|
-
return
|
|
59
|
+
return c.json({ error: 'stripe payment method already exist' }, 400);
|
|
55
60
|
}
|
|
56
61
|
|
|
57
62
|
if (!raw.settings.stripe?.publishable_key) {
|
|
58
|
-
return
|
|
63
|
+
return c.json({ error: 'stripe publishable key is required' }, 400);
|
|
59
64
|
}
|
|
60
65
|
if (!raw.settings.stripe?.secret_key) {
|
|
61
|
-
return
|
|
66
|
+
return c.json({ error: 'stripe secret key is required' }, 400);
|
|
62
67
|
}
|
|
63
68
|
const isValid = await validateStripeKeys(raw.settings.stripe.secret_key);
|
|
64
69
|
if (!isValid) {
|
|
65
|
-
return
|
|
70
|
+
return c.json({ error: 'Invalid Stripe API keys' }, 400);
|
|
66
71
|
}
|
|
67
72
|
|
|
68
73
|
raw.settings = pick(PaymentMethod.encryptSettings(raw.settings), ['stripe']) as PaymentMethodSettings;
|
|
@@ -106,19 +111,19 @@ router.post('/', auth, async (req, res) => {
|
|
|
106
111
|
|
|
107
112
|
ensureWebhookRegistered().catch(console.error);
|
|
108
113
|
|
|
109
|
-
return
|
|
114
|
+
return c.json({ ...method.toJSON(), payment_currencies: [currency.toJSON()] });
|
|
110
115
|
}
|
|
111
116
|
|
|
112
117
|
if (EVM_CHAIN_TYPES.includes(raw.type as string)) {
|
|
113
118
|
const paymentType = raw.type as EVMChainType;
|
|
114
119
|
if (!raw.settings[paymentType]?.api_host) {
|
|
115
|
-
return
|
|
120
|
+
return c.json({ error: `${paymentType} api_host is required` }, 400);
|
|
116
121
|
}
|
|
117
122
|
if (!raw.settings[paymentType]?.explorer_host) {
|
|
118
|
-
return
|
|
123
|
+
return c.json({ error: `${paymentType} explorer_host is required` }, 400);
|
|
119
124
|
}
|
|
120
125
|
if (!raw.settings[paymentType]?.native_symbol) {
|
|
121
|
-
return
|
|
126
|
+
return c.json({ error: `${paymentType} native_symbol is required` }, 400);
|
|
122
127
|
}
|
|
123
128
|
|
|
124
129
|
try {
|
|
@@ -132,14 +137,14 @@ router.post('/', auth, async (req, res) => {
|
|
|
132
137
|
});
|
|
133
138
|
} catch (err) {
|
|
134
139
|
logger.error(`verify ${paymentType} api endpoint failed`, err);
|
|
135
|
-
return
|
|
140
|
+
return c.json({ error: (err as any).message }, 400);
|
|
136
141
|
}
|
|
137
142
|
|
|
138
143
|
const exist = await PaymentMethod.findOne({
|
|
139
144
|
where: { type: paymentType, [`settings.${paymentType}.chain_id`]: raw.settings[paymentType]?.chain_id },
|
|
140
145
|
});
|
|
141
146
|
if (exist) {
|
|
142
|
-
return
|
|
147
|
+
return c.json({ error: `${paymentType} payment method already exist` }, 400);
|
|
143
148
|
}
|
|
144
149
|
|
|
145
150
|
raw.settings = pick(PaymentMethod.encryptSettings(raw.settings), [paymentType]) as PaymentMethodSettings;
|
|
@@ -180,30 +185,40 @@ router.post('/', auth, async (req, res) => {
|
|
|
180
185
|
metadata: {},
|
|
181
186
|
});
|
|
182
187
|
await method.update({ default_currency_id: currency.id });
|
|
183
|
-
return
|
|
188
|
+
return c.json({ ...method.toJSON(), payment_currencies: [currency.toJSON()] });
|
|
184
189
|
}
|
|
185
190
|
|
|
186
191
|
if (raw.type === 'google_play') {
|
|
187
192
|
if (!raw.settings.google_play?.package_name) {
|
|
188
|
-
return
|
|
193
|
+
return c.json({ error: 'google_play package_name is required' }, 400);
|
|
189
194
|
}
|
|
190
195
|
if (!raw.settings.google_play?.service_account_json) {
|
|
191
|
-
return
|
|
196
|
+
return c.json({ error: 'google_play service_account_json is required' }, 400);
|
|
192
197
|
}
|
|
193
198
|
try {
|
|
194
199
|
const parsed = JSON.parse(raw.settings.google_play.service_account_json);
|
|
195
200
|
if (!parsed.client_email || !parsed.private_key) {
|
|
196
|
-
return
|
|
201
|
+
return c.json({ error: 'service_account_json missing client_email or private_key' }, 400);
|
|
197
202
|
}
|
|
198
203
|
} catch {
|
|
199
|
-
return
|
|
204
|
+
return c.json({ error: 'service_account_json is not valid JSON' }, 400);
|
|
200
205
|
}
|
|
201
206
|
|
|
202
|
-
|
|
203
|
-
|
|
207
|
+
// Phase 6 (W1-4b): a channel identifier (package_name) must be unique
|
|
208
|
+
// across the WHOLE deployment regardless of tenant — the S2S webhook
|
|
209
|
+
// reverse-maps package_name -> tenant and ambiguity would misroute
|
|
210
|
+
// notifications. Per-tenant duplicates of the same identifier are
|
|
211
|
+
// therefore refused at registration time.
|
|
212
|
+
const sameType = await PaymentMethod.findAll({ where: { type: 'google_play', livemode: raw.livemode } });
|
|
213
|
+
const identifierTaken = sameType.some((m) => {
|
|
214
|
+
const settings = PaymentMethod.decryptSettings(m.settings);
|
|
215
|
+
return settings.google_play?.package_name === raw.settings?.google_play?.package_name;
|
|
204
216
|
});
|
|
205
|
-
if (
|
|
206
|
-
return
|
|
217
|
+
if (identifierTaken) {
|
|
218
|
+
return c.json(
|
|
219
|
+
{ error: 'this package_name is already registered in this deployment', code: 'CHANNEL_ID_TAKEN' },
|
|
220
|
+
400
|
|
221
|
+
);
|
|
207
222
|
}
|
|
208
223
|
|
|
209
224
|
raw.settings = pick(PaymentMethod.encryptSettings(raw.settings), ['google_play']) as PaymentMethodSettings;
|
|
@@ -234,16 +249,16 @@ router.post('/', auth, async (req, res) => {
|
|
|
234
249
|
});
|
|
235
250
|
await method.update({ default_currency_id: currency.id });
|
|
236
251
|
|
|
237
|
-
return
|
|
252
|
+
return c.json({ ...method.toJSON(), payment_currencies: [currency.toJSON()] });
|
|
238
253
|
}
|
|
239
254
|
|
|
240
255
|
if (raw.type === 'app_store') {
|
|
241
256
|
if (!raw.settings.app_store?.bundle_id) {
|
|
242
|
-
return
|
|
257
|
+
return c.json({ error: 'app_store bundle_id is required' }, 400);
|
|
243
258
|
}
|
|
244
259
|
const env = raw.settings.app_store?.environment;
|
|
245
260
|
if (env !== 'production' && env !== 'sandbox') {
|
|
246
|
-
return
|
|
261
|
+
return c.json({ error: 'app_store environment must be production or sandbox' }, 400);
|
|
247
262
|
}
|
|
248
263
|
// Server API credentials are optional — StoreKit 2 JWS verify doesn't need them.
|
|
249
264
|
// But if any of the three is set, all three must be set together.
|
|
@@ -258,17 +273,33 @@ router.post('/', auth, async (req, res) => {
|
|
|
258
273
|
!raw.settings.app_store?.key_id ||
|
|
259
274
|
!raw.settings.app_store?.private_key_pem
|
|
260
275
|
) {
|
|
261
|
-
return
|
|
262
|
-
|
|
263
|
-
|
|
276
|
+
return c.json(
|
|
277
|
+
{
|
|
278
|
+
error: 'app_store Server API credentials must include all of issuer_id, key_id, private_key_pem',
|
|
279
|
+
},
|
|
280
|
+
400
|
|
281
|
+
);
|
|
264
282
|
}
|
|
265
283
|
}
|
|
266
284
|
|
|
267
|
-
|
|
268
|
-
|
|
285
|
+
// Phase 6 (W1-4b): bundle_id (+environment) must be deployment-unique —
|
|
286
|
+
// see the google_play comment above for why.
|
|
287
|
+
const sameType = await PaymentMethod.findAll({ where: { type: 'app_store', livemode: raw.livemode } });
|
|
288
|
+
const identifierTaken = sameType.some((m) => {
|
|
289
|
+
const settings = PaymentMethod.decryptSettings(m.settings);
|
|
290
|
+
return (
|
|
291
|
+
settings.app_store?.bundle_id === raw.settings?.app_store?.bundle_id &&
|
|
292
|
+
settings.app_store?.environment === raw.settings?.app_store?.environment
|
|
293
|
+
);
|
|
269
294
|
});
|
|
270
|
-
if (
|
|
271
|
-
return
|
|
295
|
+
if (identifierTaken) {
|
|
296
|
+
return c.json(
|
|
297
|
+
{
|
|
298
|
+
error: 'this bundle_id/environment is already registered in this deployment',
|
|
299
|
+
code: 'CHANNEL_ID_TAKEN',
|
|
300
|
+
},
|
|
301
|
+
400
|
|
302
|
+
);
|
|
272
303
|
}
|
|
273
304
|
|
|
274
305
|
raw.settings = pick(PaymentMethod.encryptSettings(raw.settings), ['app_store']) as PaymentMethodSettings;
|
|
@@ -298,16 +329,16 @@ router.post('/', auth, async (req, res) => {
|
|
|
298
329
|
});
|
|
299
330
|
await method.update({ default_currency_id: currency.id });
|
|
300
331
|
|
|
301
|
-
return
|
|
332
|
+
return c.json({ ...method.toJSON(), payment_currencies: [currency.toJSON()] });
|
|
302
333
|
}
|
|
303
334
|
|
|
304
335
|
// FIXME: support bitcoin payment methods
|
|
305
336
|
|
|
306
|
-
return
|
|
337
|
+
return c.json({ error: 'payment method type is not supported' }, 400);
|
|
307
338
|
});
|
|
308
339
|
|
|
309
|
-
|
|
310
|
-
const
|
|
340
|
+
app.get('/', auth, async (c) => {
|
|
341
|
+
const query = c.req.query();
|
|
311
342
|
const where: WhereOptions<InferAttributes<PaymentMethod>> = {};
|
|
312
343
|
|
|
313
344
|
if (typeof query.active === 'string') {
|
|
@@ -325,34 +356,35 @@ router.get('/', auth, async (req, res) => {
|
|
|
325
356
|
if (query.addresses === 'true') {
|
|
326
357
|
try {
|
|
327
358
|
const [arcblock, ethereum] = await Promise.all([
|
|
328
|
-
getTokenSummaryByDid(wallet.address, !!
|
|
329
|
-
getTokenSummaryByDid(ethWallet.address, !!
|
|
359
|
+
getTokenSummaryByDid(wallet.address, !!c.get('livemode'), 'arcblock'),
|
|
360
|
+
getTokenSummaryByDid(ethWallet.address, !!c.get('livemode'), EVM_CHAIN_TYPES),
|
|
330
361
|
]);
|
|
331
|
-
|
|
362
|
+
return c.json({
|
|
332
363
|
list,
|
|
333
364
|
addresses: { arcblock: wallet.address, ethereum: ethWallet.address },
|
|
334
365
|
balances: { ...arcblock, ...ethereum },
|
|
335
366
|
});
|
|
336
367
|
} catch (err) {
|
|
337
|
-
logger.error('get token summary failed', err.message);
|
|
338
|
-
|
|
368
|
+
logger.error('get token summary failed', (err as any).message);
|
|
369
|
+
return c.json({
|
|
339
370
|
list,
|
|
340
371
|
addresses: { arcblock: wallet.address, ethereum: ethWallet.address },
|
|
341
372
|
balances: {},
|
|
342
|
-
error: `get token summary failed: ${err.message}`,
|
|
373
|
+
error: `get token summary failed: ${(err as any).message}`,
|
|
343
374
|
});
|
|
344
375
|
}
|
|
345
376
|
} else {
|
|
346
|
-
|
|
377
|
+
return c.json(list);
|
|
347
378
|
}
|
|
348
379
|
} catch (err) {
|
|
349
380
|
logger.error('get payment methods failed', err);
|
|
350
|
-
|
|
381
|
+
return c.json({ error: (err as any).message }, 400);
|
|
351
382
|
}
|
|
352
383
|
});
|
|
353
384
|
|
|
354
|
-
|
|
355
|
-
|
|
385
|
+
// registered before /:id so the static segment wins
|
|
386
|
+
app.get('/types', auth, (c) => {
|
|
387
|
+
return c.json([
|
|
356
388
|
{
|
|
357
389
|
type: 'arcblock',
|
|
358
390
|
name: 'ArcBlock',
|
|
@@ -392,38 +424,36 @@ router.get('/types', auth, (_, res) => {
|
|
|
392
424
|
]);
|
|
393
425
|
});
|
|
394
426
|
|
|
395
|
-
|
|
427
|
+
app.get('/:id', auth, async (c) => {
|
|
396
428
|
const doc = await PaymentMethod.findOne({
|
|
397
|
-
where: { [Op.or]: [{ id: req.
|
|
429
|
+
where: { [Op.or]: [{ id: c.req.param('id') }, { name: c.req.param('id') }] },
|
|
398
430
|
});
|
|
399
431
|
|
|
400
432
|
if (doc) {
|
|
401
|
-
|
|
402
|
-
} else {
|
|
403
|
-
res.status(404).json(null);
|
|
433
|
+
return c.json(doc);
|
|
404
434
|
}
|
|
435
|
+
return c.json(null, 404);
|
|
405
436
|
});
|
|
406
437
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
const
|
|
438
|
+
// registered before /:id so the static segment '/settings' wins
|
|
439
|
+
app.put('/:id/settings', auth, async (c) => {
|
|
440
|
+
const id = c.req.param('id');
|
|
441
|
+
const settings = c.get('sanitizedBody') ?? {};
|
|
410
442
|
try {
|
|
411
443
|
const paymentMethod = await PaymentMethod.findOne({ where: { id } });
|
|
412
444
|
if (!paymentMethod) {
|
|
413
|
-
return
|
|
445
|
+
return c.json({ error: 'payment method not found' }, 400);
|
|
414
446
|
}
|
|
415
447
|
if (paymentMethod.type !== 'arcblock') {
|
|
416
|
-
return
|
|
417
|
-
.status(400)
|
|
418
|
-
.json({ error: `Updating settings is not supported for the ${paymentMethod.type} payment method` });
|
|
448
|
+
return c.json({ error: `Updating settings is not supported for the ${paymentMethod.type} payment method` }, 400);
|
|
419
449
|
}
|
|
420
450
|
const updateSettings = merge(cloneDeep(paymentMethod.settings), settings);
|
|
421
451
|
const doc = await paymentMethod.update({
|
|
422
452
|
settings: updateSettings,
|
|
423
453
|
});
|
|
424
|
-
return
|
|
454
|
+
return c.json(doc);
|
|
425
455
|
} catch (err) {
|
|
426
|
-
return
|
|
456
|
+
return c.json({ error: (err as any).message }, 400);
|
|
427
457
|
}
|
|
428
458
|
});
|
|
429
459
|
|
|
@@ -432,17 +462,19 @@ const updateMethodSchema = Joi.object({
|
|
|
432
462
|
description: Joi.string().empty('').max(255).optional(),
|
|
433
463
|
logo: Joi.string().empty('').optional(),
|
|
434
464
|
}).unknown(true);
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
const
|
|
465
|
+
|
|
466
|
+
app.put('/:id', auth, async (c) => {
|
|
467
|
+
const id = c.req.param('id');
|
|
468
|
+
const body = c.get('sanitizedBody') ?? {};
|
|
469
|
+
const { error, value: raw } = updateMethodSchema.validate(pick(body, ['name', 'description', 'logo']));
|
|
438
470
|
if (error) {
|
|
439
|
-
return
|
|
471
|
+
return c.json({ error: error.message }, 400);
|
|
440
472
|
}
|
|
441
473
|
|
|
442
474
|
try {
|
|
443
475
|
const method = await PaymentMethod.findByPk(id);
|
|
444
476
|
if (!method) {
|
|
445
|
-
return
|
|
477
|
+
return c.json({ error: 'Payment method not found' }, 404);
|
|
446
478
|
}
|
|
447
479
|
const updateData: Partial<TPaymentMethod> = {
|
|
448
480
|
name: raw.name ?? method.name,
|
|
@@ -452,17 +484,17 @@ router.put('/:id', auth, async (req, res) => {
|
|
|
452
484
|
if ('logo' in method.dataValues || raw.logo !== undefined) {
|
|
453
485
|
updateData.logo = raw.logo ?? method.logo;
|
|
454
486
|
}
|
|
455
|
-
let updateSettings = 'settings' in
|
|
487
|
+
let updateSettings = 'settings' in body ? body.settings : null;
|
|
456
488
|
if (EVM_CHAIN_TYPES.includes(method.type as string) && updateSettings) {
|
|
457
489
|
const paymentType = method.type as EVMChainType;
|
|
458
490
|
if (!updateSettings[paymentType]?.api_host) {
|
|
459
|
-
return
|
|
491
|
+
return c.json({ error: `${paymentType} api_host is required` }, 400);
|
|
460
492
|
}
|
|
461
493
|
if (!updateSettings[paymentType]?.explorer_host) {
|
|
462
|
-
return
|
|
494
|
+
return c.json({ error: `${paymentType} explorer_host is required` }, 400);
|
|
463
495
|
}
|
|
464
496
|
if (!updateSettings[paymentType]?.native_symbol) {
|
|
465
|
-
return
|
|
497
|
+
return c.json({ error: `${paymentType} native_symbol is required` }, 400);
|
|
466
498
|
}
|
|
467
499
|
try {
|
|
468
500
|
const provider = new ethers.JsonRpcProvider(updateSettings[paymentType]?.api_host);
|
|
@@ -475,21 +507,21 @@ router.put('/:id', auth, async (req, res) => {
|
|
|
475
507
|
});
|
|
476
508
|
} catch (err) {
|
|
477
509
|
logger.error(`verify ${paymentType} api endpoint failed`, err);
|
|
478
|
-
return
|
|
510
|
+
return c.json({ error: (err as any).message }, 400);
|
|
479
511
|
}
|
|
480
512
|
updateData.settings = pick(PaymentMethod.encryptSettings(updateSettings), [paymentType]) as PaymentMethodSettings;
|
|
481
513
|
}
|
|
482
514
|
if (method.type === 'stripe') {
|
|
483
515
|
if (!updateSettings.stripe?.publishable_key) {
|
|
484
|
-
return
|
|
516
|
+
return c.json({ error: 'stripe publishable key is required' }, 400);
|
|
485
517
|
}
|
|
486
518
|
if (!updateSettings.stripe?.secret_key) {
|
|
487
|
-
return
|
|
519
|
+
return c.json({ error: 'stripe secret key is required' }, 400);
|
|
488
520
|
}
|
|
489
521
|
if (method.settings?.stripe?.secret_key !== updateSettings.stripe.secret_key) {
|
|
490
522
|
const isValid = await validateStripeKeys(updateSettings.stripe.secret_key);
|
|
491
523
|
if (!isValid) {
|
|
492
|
-
return
|
|
524
|
+
return c.json({ error: 'Invalid Stripe API keys' }, 400);
|
|
493
525
|
}
|
|
494
526
|
updateSettings.stripe.webhook_signing_secret = null;
|
|
495
527
|
updateSettings = PaymentMethod.encryptSettings(updateSettings);
|
|
@@ -502,10 +534,10 @@ router.put('/:id', auth, async (req, res) => {
|
|
|
502
534
|
if (method.type === 'stripe') {
|
|
503
535
|
ensureWebhookRegistered().catch(console.error);
|
|
504
536
|
}
|
|
505
|
-
return
|
|
537
|
+
return c.json(updatedMethod);
|
|
506
538
|
} catch (err) {
|
|
507
|
-
return
|
|
539
|
+
return c.json({ error: (err as any).message }, 400);
|
|
508
540
|
}
|
|
509
541
|
});
|
|
510
542
|
|
|
511
|
-
export default
|
|
543
|
+
export default app;
|
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
|
|
1
|
+
// Phase 3a (express→hono) — hono fork of routes/payment-stats.ts. Sub-app with
|
|
2
|
+
// routes relative to /api/payment-stats (mounted via mountResourceGroup). The
|
|
3
|
+
// business logic is unchanged; only the express plumbing becomes hono:
|
|
4
|
+
// req.query → c.req.query(); req.livemode → c.get('livemode'); res.json(x) → return c.json(x).
|
|
5
|
+
import { Hono } from 'hono';
|
|
2
6
|
import Joi from 'joi';
|
|
3
7
|
import { Op, type WhereOptions } from 'sequelize';
|
|
4
8
|
import { joinURL } from 'ufo';
|
|
5
9
|
|
|
6
10
|
import { BN } from '@ocap/util';
|
|
7
|
-
import { getPaymentStat } from '
|
|
8
|
-
import { getTokenSummaryByDid } from '
|
|
9
|
-
import { createListParamSchema, getOrder } from '
|
|
10
|
-
import { ethWallet, wallet } from '
|
|
11
|
-
import dayjs from '
|
|
12
|
-
import { authenticate } from '
|
|
11
|
+
import { getPaymentStat } from '../../crons/payment-stat';
|
|
12
|
+
import { getTokenSummaryByDid } from '../../integrations/arcblock/stake';
|
|
13
|
+
import { createListParamSchema, getOrder } from '../../libs/api';
|
|
14
|
+
import { ethWallet, wallet } from '../../libs/auth';
|
|
15
|
+
import dayjs from '../../libs/dayjs';
|
|
16
|
+
import { authenticate } from '../../middlewares/hono/security';
|
|
13
17
|
import {
|
|
14
18
|
CreditGrant,
|
|
15
19
|
EVMChainType,
|
|
@@ -23,11 +27,11 @@ import {
|
|
|
23
27
|
Refund,
|
|
24
28
|
RevenueSnapshot,
|
|
25
29
|
Subscription,
|
|
26
|
-
} from '
|
|
27
|
-
import { EVM_CHAIN_TYPES } from '
|
|
28
|
-
import logger from '
|
|
30
|
+
} from '../../store/models';
|
|
31
|
+
import { EVM_CHAIN_TYPES } from '../../libs/constants';
|
|
32
|
+
import logger from '../../libs/logger';
|
|
29
33
|
|
|
30
|
-
const
|
|
34
|
+
const app = new Hono();
|
|
31
35
|
const auth = authenticate<PaymentStat>({ component: true, roles: ['owner', 'admin'] });
|
|
32
36
|
const BILLING_REASON_EXCLUSIONS = ['stake', 'stake_overdraft_protection', 'recharge'];
|
|
33
37
|
|
|
@@ -42,8 +46,9 @@ const summaryQuerySchema = Joi.object({
|
|
|
42
46
|
start: Joi.number().positive().optional().empty(''),
|
|
43
47
|
end: Joi.number().positive().optional().empty(''),
|
|
44
48
|
});
|
|
45
|
-
|
|
46
|
-
|
|
49
|
+
|
|
50
|
+
app.get('/', auth, async (c) => {
|
|
51
|
+
const { page, pageSize, ...query } = await schema.validateAsync(c.req.query(), { stripUnknown: true });
|
|
47
52
|
const where: WhereOptions = {};
|
|
48
53
|
|
|
49
54
|
if (typeof query.livemode === 'boolean') {
|
|
@@ -66,7 +71,7 @@ router.get('/', auth, async (req, res) => {
|
|
|
66
71
|
try {
|
|
67
72
|
const { rows: list, count } = await PaymentStat.findAndCountAll({
|
|
68
73
|
where,
|
|
69
|
-
order: getOrder(req.query, [['created_at', 'ASC']]),
|
|
74
|
+
order: getOrder(c.req.query(), [['created_at', 'ASC']]),
|
|
70
75
|
include: [],
|
|
71
76
|
});
|
|
72
77
|
|
|
@@ -76,7 +81,7 @@ router.get('/', auth, async (req, res) => {
|
|
|
76
81
|
list.push(
|
|
77
82
|
// @ts-ignore
|
|
78
83
|
...currencies
|
|
79
|
-
.filter((x) => x.livemode === !!
|
|
84
|
+
.filter((x) => x.livemode === !!c.get('livemode'))
|
|
80
85
|
.map((currency) => ({
|
|
81
86
|
livemode: currency.livemode,
|
|
82
87
|
timestamp,
|
|
@@ -88,10 +93,10 @@ router.get('/', auth, async (req, res) => {
|
|
|
88
93
|
);
|
|
89
94
|
}
|
|
90
95
|
|
|
91
|
-
|
|
96
|
+
return c.json({ count, list });
|
|
92
97
|
} catch (err) {
|
|
93
98
|
logger.error(err);
|
|
94
|
-
|
|
99
|
+
return c.json({ count: 0, list: [] });
|
|
95
100
|
}
|
|
96
101
|
});
|
|
97
102
|
|
|
@@ -472,23 +477,23 @@ async function getRevenueStats(livemode: boolean, currencyId?: string, start?: n
|
|
|
472
477
|
return byCurrency;
|
|
473
478
|
}
|
|
474
479
|
|
|
475
|
-
|
|
480
|
+
app.get('/summary', auth, async (c) => {
|
|
476
481
|
try {
|
|
477
482
|
const {
|
|
478
483
|
currency_id: currencyId,
|
|
479
484
|
start,
|
|
480
485
|
end,
|
|
481
|
-
} = await summaryQuerySchema.validateAsync(req.query, {
|
|
486
|
+
} = await summaryQuerySchema.validateAsync(c.req.query(), {
|
|
482
487
|
stripUnknown: true,
|
|
483
488
|
});
|
|
484
|
-
const livemode = !!
|
|
489
|
+
const livemode = !!c.get('livemode');
|
|
485
490
|
const [arcblock, ethereum, links, revenueByCurrency] = await Promise.all([
|
|
486
|
-
getTokenSummaryByDid(wallet.address, !!
|
|
487
|
-
getTokenSummaryByDid(ethWallet.address, !!
|
|
491
|
+
getTokenSummaryByDid(wallet.address, !!c.get('livemode'), 'arcblock'),
|
|
492
|
+
getTokenSummaryByDid(ethWallet.address, !!c.get('livemode'), EVM_CHAIN_TYPES),
|
|
488
493
|
getCurrencyLinks(livemode),
|
|
489
494
|
getRevenueStats(livemode, currencyId, start, end),
|
|
490
495
|
]);
|
|
491
|
-
|
|
496
|
+
return c.json({
|
|
492
497
|
links,
|
|
493
498
|
balances: { ...arcblock, ...ethereum },
|
|
494
499
|
addresses: { arcblock: wallet.address, ethereum: ethWallet.address },
|
|
@@ -503,8 +508,8 @@ router.get('/summary', auth, async (req, res) => {
|
|
|
503
508
|
});
|
|
504
509
|
} catch (err) {
|
|
505
510
|
logger.error(err);
|
|
506
|
-
|
|
511
|
+
return c.json(null);
|
|
507
512
|
}
|
|
508
513
|
});
|
|
509
514
|
|
|
510
|
-
export default
|
|
515
|
+
export default app;
|