Phase F
Some checks failed
CI / Node — lint, typecheck, test, build (push) Failing after 10s
CI / Go — node-agent tests (push) Failing after 8s
CI / Go — edge-gateway build (push) Successful in 18s

This commit is contained in:
smueller
2026-06-26 15:05:01 +02:00
parent 333ad1cc7d
commit 15cf302afc
23 changed files with 2116 additions and 8 deletions

View File

@@ -152,6 +152,26 @@ enum SsoTicketKind {
ADMIN
}
enum IntegrationEventStatus {
PENDING
ACKNOWLEDGED
DEAD_LETTER
}
enum ReconciliationSeverity {
INFO
WARNING
BLOCKING
DESTRUCTIVE
SECURITY
}
enum UsageExportStatus {
DRAFT
EXPORTED
ADJUSTED
}
model User {
id String @id @default(uuid())
email String @unique
@@ -724,6 +744,10 @@ model WhmcsInstallation {
serviceLinks WhmcsServiceLink[]
operations IntegrationOperation[]
ssoTickets SsoTicket[]
events IntegrationEvent[]
syncCursor IntegrationSyncCursor?
reconciliationIssues ReconciliationIssue[]
usageExports WhmcsUsageExport[]
@@map("whmcs_installations")
}
@@ -752,6 +776,7 @@ model WhmcsServiceLink {
status WhmcsServiceStatus @default(PENDING)
suspendedAt DateTime? @db.Timestamptz(3)
terminatedAt DateTime? @db.Timestamptz(3)
lastReconciledAt DateTime? @db.Timestamptz(3)
metadata Json?
createdAt DateTime @default(now()) @db.Timestamptz(3)
updatedAt DateTime @updatedAt @db.Timestamptz(3)
@@ -807,3 +832,76 @@ model SsoTicket {
@@index([installationId, createdAt])
@@map("sso_tickets")
}
model IntegrationEvent {
id String @id @default(uuid())
installationId String
eventType String
payload Json
dedupeKey String @unique
status IntegrationEventStatus @default(PENDING)
acknowledgedAt DateTime? @db.Timestamptz(3)
deadLetteredAt DateTime? @db.Timestamptz(3)
deadLetterReason String?
createdAt DateTime @default(now()) @db.Timestamptz(3)
installation WhmcsInstallation @relation(fields: [installationId], references: [id], onDelete: Cascade)
@@index([installationId, status, createdAt])
@@index([installationId, createdAt])
@@map("integration_events")
}
model IntegrationSyncCursor {
id String @id @default(uuid())
installationId String @unique
eventsCursor String?
updatedAt DateTime @updatedAt @db.Timestamptz(3)
installation WhmcsInstallation @relation(fields: [installationId], references: [id], onDelete: Cascade)
@@map("integration_sync_cursors")
}
model ReconciliationIssue {
id String @id @default(uuid())
installationId String
runId String
externalServiceId String?
serverId String?
code String
severity ReconciliationSeverity
message String
details Json?
autoRepaired Boolean @default(false)
resolvedAt DateTime? @db.Timestamptz(3)
createdAt DateTime @default(now()) @db.Timestamptz(3)
installation WhmcsInstallation @relation(fields: [installationId], references: [id], onDelete: Cascade)
@@index([installationId, runId])
@@index([installationId, resolvedAt])
@@map("reconciliation_issues")
}
model WhmcsUsageExport {
id String @id @default(uuid())
installationId String
externalServiceId String
serverId String
periodStart DateTime @db.Timestamptz(3)
periodEnd DateTime @db.Timestamptz(3)
metrics Json
contentHash String
status UsageExportStatus @default(DRAFT)
isTestMode Boolean @default(false)
adjustmentOfId String?
exportedAt DateTime? @db.Timestamptz(3)
createdAt DateTime @default(now()) @db.Timestamptz(3)
installation WhmcsInstallation @relation(fields: [installationId], references: [id], onDelete: Cascade)
@@unique([installationId, externalServiceId, periodStart, periodEnd, isTestMode])
@@index([installationId, periodEnd])
@@map("whmcs_usage_exports")
}