diff --git a/backend/package.json b/backend/package.json index cba270ce..c2e3902f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -5,6 +5,7 @@ "main": "dist/index.js", "scripts": { "dev": "tsx watch src/index.ts", + "prebuild": "npm run prisma:generate", "build": "tsc", "start": "node dist/index.js", "test": "jest --runInBand", diff --git a/backend/prisma/migrations/20260925010000_add_idempotency_key/migration.sql b/backend/prisma/migrations/20260925010000_add_idempotency_key/migration.sql new file mode 100644 index 00000000..3eaf9ec6 --- /dev/null +++ b/backend/prisma/migrations/20260925010000_add_idempotency_key/migration.sql @@ -0,0 +1,23 @@ +-- CreateTable +CREATE TABLE "IdempotencyKey" ( + "id" TEXT NOT NULL PRIMARY KEY, + "keyId" TEXT NOT NULL, + "tenantId" TEXT NOT NULL, + "walletAddress" TEXT, + "operation" TEXT NOT NULL, + "status" TEXT NOT NULL DEFAULT 'pending', + "requestHash" TEXT NOT NULL, + "responseHash" TEXT, + "responseBody" TEXT, + "statusCode" INTEGER, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "completedAt" DATETIME, + "expiresAt" DATETIME NOT NULL +); + +-- CreateIndex +CREATE INDEX "IdempotencyKey_expiresAt_idx" ON "IdempotencyKey"("expiresAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "IdempotencyKey_keyId_tenantId_key" ON "IdempotencyKey"("keyId", "tenantId"); + diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index 632280fb..13ba1fab 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -604,3 +604,22 @@ model WriteAheadAuditEntry { @@index([configType]) @@index([actor]) } + +model IdempotencyKey { + id String @id @default(uuid()) + keyId String + tenantId String + walletAddress String? + operation String + status String @default("pending") // pending | completed | failed + requestHash String + responseHash String? + responseBody String? + statusCode Int? + createdAt DateTime @default(now()) + completedAt DateTime? + expiresAt DateTime + + @@unique([keyId, tenantId]) + @@index([expiresAt]) +} diff --git a/backend/schema-snapshots/get-_health.json b/backend/schema-snapshots/get-_health.json index 31d8f6b4..05101c57 100644 --- a/backend/schema-snapshots/get-_health.json +++ b/backend/schema-snapshots/get-_health.json @@ -81,6 +81,15 @@ "degraded", "unknown" ] + }, + "indexer": { + "type": "string", + "enum": [ + "up", + "down", + "degraded", + "unknown" + ] } }, "required": [ @@ -90,7 +99,8 @@ "databasePrimary", "databaseReplica", "prisma", - "jobs" + "jobs", + "indexer" ], "additionalProperties": false }, diff --git a/backend/schema-snapshots/get-_ready.json b/backend/schema-snapshots/get-_ready.json index 6e39ca57..cca01144 100644 --- a/backend/schema-snapshots/get-_ready.json +++ b/backend/schema-snapshots/get-_ready.json @@ -21,13 +21,17 @@ }, "prisma": { "type": "boolean" + }, + "indexer": { + "type": "boolean" } }, "required": [ "cache", "stellarRpc", "database", - "prisma" + "prisma", + "indexer" ], "additionalProperties": false }