feat: add subscription push transfers

This commit is contained in:
JetSprow
2026-05-01 04:39:15 +10:00
parent b2a50514a4
commit e718d5edab
23 changed files with 2049 additions and 27 deletions

View File

@@ -94,6 +94,21 @@ enum WalletTransactionType {
CARD_REDEEM
ADMIN_ADJUST
REFUND
SUBSCRIPTION_TRANSFER_FEE
SUBSCRIPTION_TRANSFER_REFUND
}
enum SubscriptionTransferStatus {
PENDING
ACCEPTED
REJECTED
CANCELLED
EXPIRED
}
enum SubscriptionTransferFeePayer {
SENDER
RECIPIENT
}
enum Protocol {
@@ -221,6 +236,8 @@ model User {
walletRechargeOrders WalletRechargeOrder[]
redeemedRechargeCards RechargeCard[] @relation("RechargeCardRedeemer")
createdRechargeCards RechargeCard[] @relation("RechargeCardCreator")
sentSubscriptionTransfers SubscriptionTransfer[] @relation("SubscriptionTransferSender")
receivedSubscriptionTransfers SubscriptionTransfer[] @relation("SubscriptionTransferRecipient")
}
model EmailToken {
@@ -327,6 +344,7 @@ model SubscriptionPlan {
cartItems ShoppingCartItem[]
orderItems OrderItem[]
rechargeCards RechargeCard[]
subscriptionTransfers SubscriptionTransfer[]
@@index([type, isActive, isFeatured, sortOrder])
@@index([inboundId])
@@ -353,11 +371,48 @@ model UserSubscription {
nodeClient NodeClient?
createOrder Order? @relation("OrderCreatedSubscription")
targetOrders Order[] @relation("OrderTargetSubscription")
transfers SubscriptionTransfer[]
@@index([userId])
@@index([status])
}
model SubscriptionTransfer {
id String @id @default(cuid())
subscriptionId String
planId String
senderId String
recipientId String
senderEmail String
recipientEmail String
status SubscriptionTransferStatus @default(PENDING)
feeAmount Decimal @default(0)
feePayer SubscriptionTransferFeePayer @default(SENDER)
feeChargedToId String?
feeChargedAt DateTime?
feeRefundedAt DateTime?
cycleStartedAt DateTime
expiresAt DateTime
acceptedAt DateTime?
rejectedAt DateTime?
cancelledAt DateTime?
expiredAt DateTime?
note String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
subscription UserSubscription @relation(fields: [subscriptionId], references: [id], onDelete: Cascade)
plan SubscriptionPlan @relation(fields: [planId], references: [id], onDelete: Cascade)
sender User @relation("SubscriptionTransferSender", fields: [senderId], references: [id], onDelete: Cascade)
recipient User @relation("SubscriptionTransferRecipient", fields: [recipientId], references: [id], onDelete: Cascade)
@@index([subscriptionId, status, createdAt])
@@index([senderId, createdAt])
@@index([recipientId, createdAt])
@@index([status, expiresAt])
@@index([planId, cycleStartedAt])
}
model SubscriptionAccessLog {
id String @id @default(cuid())
userId String?
@@ -930,6 +985,11 @@ model AppConfig {
inviteRewardCouponId String?
inviteRewardRate Decimal @default(0)
inviteRewardEnabled Boolean @default(false)
subscriptionTransferEnabled Boolean @default(true)
subscriptionTransferFee Decimal @default(0)
subscriptionTransferLimitPerCycle Int @default(1)
subscriptionTransferMinRemainingDays Int @default(0)
subscriptionTransferMinRemainingTrafficGb Int @default(0)
turnstileSiteKey String?
turnstileSecretKey String?
smtpEnabled Boolean @default(false)