feat: add phone frequency controls and modularize codebase
This commit is contained in:
+98
-10
@@ -32,6 +32,8 @@ model Tenant {
|
||||
riskRules RiskRule[]
|
||||
smsSendTasks SmsSendTask[]
|
||||
riskHitRecords RiskHitRecord[]
|
||||
phoneFrequencyStates PhoneFrequencyState[]
|
||||
phoneFrequencyHits PhoneFrequencyHit[]
|
||||
smsBatchTasks SmsBatchTask[]
|
||||
smsMessageRecords SmsMessageRecord[]
|
||||
smsApiRequests SmsApiRequest[]
|
||||
@@ -88,13 +90,16 @@ model User {
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
tenant Tenant? @relation(fields: [tenantId], references: [id])
|
||||
roles UserRole[]
|
||||
operationLogs OperationLog[]
|
||||
auditRecords AuditRecord[]
|
||||
createdSmsSendTasks SmsSendTask[] @relation("SmsSendTaskCreator")
|
||||
reviewedSmsSendTasks SmsSendTask[] @relation("SmsSendTaskReviewer")
|
||||
createdSmsBatchTasks SmsBatchTask[] @relation("SmsBatchTaskCreator")
|
||||
tenant Tenant? @relation(fields: [tenantId], references: [id])
|
||||
roles UserRole[]
|
||||
operationLogs OperationLog[]
|
||||
auditRecords AuditRecord[]
|
||||
createdSmsSendTasks SmsSendTask[] @relation("SmsSendTaskCreator")
|
||||
reviewedSmsSendTasks SmsSendTask[] @relation("SmsSendTaskReviewer")
|
||||
createdSmsBatchTasks SmsBatchTask[] @relation("SmsBatchTaskCreator")
|
||||
releasedPhoneFrequencyHits PhoneFrequencyHit[] @relation("PhoneFrequencyHitReleaser")
|
||||
createdPhoneFrequencyWhitelistEntries PhoneFrequencyWhitelist[] @relation("PhoneFrequencyWhitelistCreator")
|
||||
updatedPhoneFrequencyWhitelistEntries PhoneFrequencyWhitelist[] @relation("PhoneFrequencyWhitelistUpdater")
|
||||
}
|
||||
|
||||
model Role {
|
||||
@@ -440,6 +445,8 @@ model SmsApplication {
|
||||
dailyUsages SmsApplicationDailyUsage[]
|
||||
inboundLongMessages CmppInboundLongMessage[]
|
||||
riskRules RiskRule[]
|
||||
phoneFrequencyStates PhoneFrequencyState[]
|
||||
phoneFrequencyHits PhoneFrequencyHit[]
|
||||
|
||||
@@index([tenantId, status])
|
||||
@@index([status, createdAt])
|
||||
@@ -1268,9 +1275,11 @@ model RiskRule {
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
tenant Tenant? @relation(fields: [tenantId], references: [id])
|
||||
application SmsApplication? @relation(fields: [applicationId], references: [id], onDelete: Cascade)
|
||||
hits RiskHitRecord[]
|
||||
tenant Tenant? @relation(fields: [tenantId], references: [id])
|
||||
application SmsApplication? @relation(fields: [applicationId], references: [id], onDelete: Cascade)
|
||||
hits RiskHitRecord[]
|
||||
phoneFrequencyStates PhoneFrequencyState[]
|
||||
phoneFrequencyHits PhoneFrequencyHit[]
|
||||
|
||||
@@unique([applicationId, code])
|
||||
@@index([tenantId, applicationId, status, priority])
|
||||
@@ -1339,6 +1348,85 @@ model RiskHitRecord {
|
||||
@@index([ruleCode])
|
||||
}
|
||||
|
||||
model PhoneFrequencyState {
|
||||
id String @id @default(cuid())
|
||||
tenantId String
|
||||
applicationId String
|
||||
ruleId String?
|
||||
ruleCode String
|
||||
phoneNumber String
|
||||
windowStartedAt DateTime
|
||||
windowEndsAt DateTime
|
||||
count Int @default(0)
|
||||
generation Int @default(0)
|
||||
activeHitId String? @unique
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
tenant Tenant @relation(fields: [tenantId], references: [id])
|
||||
application SmsApplication @relation(fields: [applicationId], references: [id], onDelete: Cascade)
|
||||
rule RiskRule? @relation(fields: [ruleId], references: [id], onDelete: SetNull)
|
||||
activeHit PhoneFrequencyHit? @relation("ActivePhoneFrequencyHit", fields: [activeHitId], references: [id], onDelete: SetNull)
|
||||
|
||||
@@unique([applicationId, ruleCode, phoneNumber])
|
||||
@@index([tenantId, applicationId, windowEndsAt])
|
||||
@@index([ruleId])
|
||||
}
|
||||
|
||||
model PhoneFrequencyHit {
|
||||
id String @id @default(cuid())
|
||||
tenantId String
|
||||
applicationId String
|
||||
ruleId String?
|
||||
ruleCode String
|
||||
ruleName String
|
||||
phoneNumber String
|
||||
thresholdValue Int
|
||||
actualValue Int
|
||||
windowStartedAt DateTime
|
||||
windowEndsAt DateTime
|
||||
generation Int @default(0)
|
||||
action String @default("block")
|
||||
sourceType String?
|
||||
releasedAt DateTime?
|
||||
releasedById String?
|
||||
releaseReason String?
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
tenant Tenant @relation(fields: [tenantId], references: [id])
|
||||
application SmsApplication @relation(fields: [applicationId], references: [id])
|
||||
rule RiskRule? @relation(fields: [ruleId], references: [id], onDelete: SetNull)
|
||||
releasedBy User? @relation("PhoneFrequencyHitReleaser", fields: [releasedById], references: [id])
|
||||
activeForState PhoneFrequencyState? @relation("ActivePhoneFrequencyHit")
|
||||
|
||||
@@unique([applicationId, ruleCode, phoneNumber, windowStartedAt, generation])
|
||||
@@index([tenantId, applicationId, createdAt])
|
||||
@@index([applicationId, phoneNumber, createdAt])
|
||||
@@index([windowEndsAt, releasedAt])
|
||||
@@index([ruleId])
|
||||
@@index([releasedById])
|
||||
}
|
||||
|
||||
model PhoneFrequencyWhitelist {
|
||||
id String @id @default(cuid())
|
||||
phoneNumber String @unique
|
||||
status String @default("active")
|
||||
reason String
|
||||
remark String?
|
||||
createdById String
|
||||
updatedById String
|
||||
deletedAt DateTime?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
createdBy User @relation("PhoneFrequencyWhitelistCreator", fields: [createdById], references: [id])
|
||||
updatedBy User @relation("PhoneFrequencyWhitelistUpdater", fields: [updatedById], references: [id])
|
||||
|
||||
@@index([status, updatedAt])
|
||||
@@index([createdById])
|
||||
@@index([updatedById])
|
||||
}
|
||||
|
||||
model SmsBatchTask {
|
||||
id String @id @default(cuid())
|
||||
tenantId String
|
||||
|
||||
Reference in New Issue
Block a user