fix: make SMS retry side effects idempotent
This commit is contained in:
+38
@@ -0,0 +1,38 @@
|
||||
ALTER TABLE "SmsSubmitRecord"
|
||||
ADD COLUMN "retryOfSubmitRecordId" TEXT;
|
||||
|
||||
CREATE UNIQUE INDEX "SmsSubmitRecord_retryOfSubmitRecordId_key"
|
||||
ON "SmsSubmitRecord"("retryOfSubmitRecordId");
|
||||
|
||||
ALTER TABLE "SmsSubmitRecord"
|
||||
ADD CONSTRAINT "SmsSubmitRecord_retryOfSubmitRecordId_fkey"
|
||||
FOREIGN KEY ("retryOfSubmitRecordId") REFERENCES "SmsSubmitRecord"("id")
|
||||
ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
ALTER TABLE "AccountTransaction"
|
||||
ADD COLUMN "idempotencyKey" TEXT;
|
||||
|
||||
CREATE UNIQUE INDEX "AccountTransaction_idempotencyKey_key"
|
||||
ON "AccountTransaction"("idempotencyKey");
|
||||
|
||||
ALTER TABLE "CmppDownstreamDelivery"
|
||||
ADD COLUMN "dedupeKey" TEXT;
|
||||
|
||||
WITH ranked_receipts AS (
|
||||
SELECT id,
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY "messageRecordId", "deliveryType"
|
||||
ORDER BY "createdAt", id
|
||||
) AS row_number
|
||||
FROM "CmppDownstreamDelivery"
|
||||
WHERE "messageRecordId" IS NOT NULL
|
||||
AND "deliveryType" = 'receipt'
|
||||
)
|
||||
UPDATE "CmppDownstreamDelivery" AS delivery
|
||||
SET "dedupeKey" = 'receipt:' || delivery."messageRecordId"
|
||||
FROM ranked_receipts
|
||||
WHERE delivery.id = ranked_receipts.id
|
||||
AND ranked_receipts.row_number = 1;
|
||||
|
||||
CREATE UNIQUE INDEX "CmppDownstreamDelivery_dedupeKey_key"
|
||||
ON "CmppDownstreamDelivery"("dedupeKey");
|
||||
+28
-23
@@ -318,6 +318,7 @@ model AccountTransaction {
|
||||
id String @id @default(cuid())
|
||||
tenantId String
|
||||
transactionType String
|
||||
idempotencyKey String? @unique
|
||||
amountCents BigInt @default(0)
|
||||
balanceAfter BigInt @default(0)
|
||||
relatedType String?
|
||||
@@ -1441,30 +1442,33 @@ model CmppSubmitSession {
|
||||
}
|
||||
|
||||
model SmsSubmitRecord {
|
||||
id String @id @default(cuid())
|
||||
tenantId String?
|
||||
batchTaskId String?
|
||||
messageRecordId String
|
||||
channelId String
|
||||
sessionId String?
|
||||
submitId String @unique
|
||||
sequenceId Int?
|
||||
gatewayMessageId String?
|
||||
submitStatus String @default("queued")
|
||||
costUnitPrice BigInt @default(0)
|
||||
costAmountCents BigInt @default(0)
|
||||
errorCode String?
|
||||
errorMessage String?
|
||||
submittedAt DateTime?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
id String @id @default(cuid())
|
||||
tenantId String?
|
||||
batchTaskId String?
|
||||
messageRecordId String
|
||||
channelId String
|
||||
sessionId String?
|
||||
retryOfSubmitRecordId String? @unique
|
||||
submitId String @unique
|
||||
sequenceId Int?
|
||||
gatewayMessageId String?
|
||||
submitStatus String @default("queued")
|
||||
costUnitPrice BigInt @default(0)
|
||||
costAmountCents BigInt @default(0)
|
||||
errorCode String?
|
||||
errorMessage String?
|
||||
submittedAt DateTime?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
tenant Tenant? @relation(fields: [tenantId], references: [id])
|
||||
batchTask SmsBatchTask? @relation(fields: [batchTaskId], references: [id], onDelete: Cascade)
|
||||
messageRecord SmsMessageRecord @relation(fields: [messageRecordId], references: [id], onDelete: Cascade)
|
||||
channel SmsChannel @relation(fields: [channelId], references: [id])
|
||||
session CmppSubmitSession? @relation(fields: [sessionId], references: [id])
|
||||
segmentAudits SmsMessageSegmentAudit[]
|
||||
tenant Tenant? @relation(fields: [tenantId], references: [id])
|
||||
batchTask SmsBatchTask? @relation(fields: [batchTaskId], references: [id], onDelete: Cascade)
|
||||
messageRecord SmsMessageRecord @relation(fields: [messageRecordId], references: [id], onDelete: Cascade)
|
||||
channel SmsChannel @relation(fields: [channelId], references: [id])
|
||||
session CmppSubmitSession? @relation(fields: [sessionId], references: [id])
|
||||
retryOfSubmitRecord SmsSubmitRecord? @relation("SmsSubmitRetry", fields: [retryOfSubmitRecordId], references: [id])
|
||||
retrySubmit SmsSubmitRecord? @relation("SmsSubmitRetry")
|
||||
segmentAudits SmsMessageSegmentAudit[]
|
||||
|
||||
@@index([tenantId, createdAt])
|
||||
@@index([messageRecordId])
|
||||
@@ -1728,6 +1732,7 @@ model CmppDownstreamDelivery {
|
||||
applicationId String
|
||||
messageRecordId String?
|
||||
messageId String?
|
||||
dedupeKey String? @unique
|
||||
deliveryType String
|
||||
status String @default("pending")
|
||||
payload Json
|
||||
|
||||
Reference in New Issue
Block a user