self-replicating/packages/orchestrator/prisma/schema.prisma

264 lines
6.1 KiB
Plaintext

// Prisma schema for Self-Replicating Business System
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
// ============================================
// BUSINESS MODEL
// ============================================
model Business {
id String @id @default(cuid())
name String
idea String @db.Text
status BusinessStatus @default(VALIDATING)
viable Boolean?
// URLs
mvpUrl String?
landingPageUrl String?
// Feature flags
seoOptimized Boolean @default(false)
adsActive Boolean @default(false)
emailAutomation Boolean @default(false)
// Revenue metrics
monthlyRevenue Float @default(0)
totalRevenue Float @default(0)
// Validation data (JSONB)
validationResult Json?
targetAudience String?
budget Float?
// Relationships
workflows WorkflowRun[]
campaigns Campaign[]
metrics Metric[]
decisions Decision[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([status, monthlyRevenue])
@@index([createdAt])
}
enum BusinessStatus {
VALIDATING
VALIDATION_FAILED
DEVELOPING_MVP
LAUNCHING
RUNNING_ADS
OPTIMIZING
SCALING
SELLING
SHUTDOWN
PAUSED
}
// ============================================
// WORKFLOW EXECUTION MODEL
// ============================================
model WorkflowRun {
id String @id @default(cuid())
businessId String
business Business @relation(fields: [businessId], references: [id], onDelete: Cascade)
workflowType WorkflowType
status WorkflowStatus @default(PENDING)
inputData Json @default("{}")
outputData Json?
error String? @db.Text
attempts Int @default(0)
maxRetries Int @default(3)
startedAt DateTime?
completedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([businessId, workflowType])
@@index([status])
@@index([createdAt])
}
enum WorkflowType {
MARKET_VALIDATION
MVP_DEVELOPMENT
LANDING_PAGE_SEO
PAID_ADS
CONTENT_MARKETING
EMAIL_AUTOMATION
ANALYTICS_SETUP
OPTIMIZATION_LOOP
}
enum WorkflowStatus {
PENDING
IN_PROGRESS
COMPLETED
FAILED
RETRYING
}
// ============================================
// CAMPAIGN MODEL
// ============================================
model Campaign {
id String @id @default(cuid())
businessId String
business Business @relation(fields: [businessId], references: [id], onDelete: Cascade)
platform Platform
campaignId String? // External campaign ID
adSetId String? // External ad set ID
name String
budget Float
dailyBudget Float?
active Boolean @default(true)
// Metrics
impressions Int @default(0)
clicks Int @default(0)
conversions Int @default(0)
spend Float @default(0)
revenue Float @default(0)
// Campaign config (JSONB)
targeting Json?
creative Json?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([businessId, platform])
@@index([active])
}
enum Platform {
FACEBOOK
GOOGLE
ORGANIC
}
// ============================================
// METRICS MODEL
// ============================================
model Metric {
id String @id @default(cuid())
businessId String
business Business @relation(fields: [businessId], references: [id], onDelete: Cascade)
timestamp DateTime @default(now())
// Financial metrics
revenue Float @default(0)
adSpend Float @default(0)
profit Float @default(0)
roas Float? // Return on Ad Spend
// Traffic metrics
visitors Int @default(0)
pageViews Int @default(0)
bounceRate Float?
avgSessionDuration Float?
// Conversion metrics
conversions Int @default(0)
conversionRate Float?
// Source breakdown (JSONB)
sourceBreakdown Json?
createdAt DateTime @default(now())
@@index([businessId, timestamp])
@@index([timestamp])
}
// ============================================
// DECISION MODEL
// ============================================
model Decision {
id String @id @default(cuid())
businessId String
business Business @relation(fields: [businessId], references: [id], onDelete: Cascade)
decisionType DecisionType
action String @db.Text
reasoning String @db.Text
revenueAtDecision Float?
metricsSnapshot Json? // Snapshot of all metrics at decision time
executed Boolean @default(false)
executedAt DateTime?
executionResult Json?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([businessId, decisionType])
@@index([executed])
@@index([createdAt])
}
enum DecisionType {
SCALE_PRODUCT
SELL_BUSINESS
SHUTDOWN
PAUSE_CAMPAIGN
INCREASE_BUDGET
HIRE_VA
}
// ============================================
// ALERT/NOTIFICATION MODEL
// ============================================
model Alert {
id String @id @default(cuid())
businessId String?
type AlertType
severity AlertSeverity @default(INFO)
title String
message String @db.Text
metadata Json?
read Boolean @default(false)
acknowledged Boolean @default(false)
createdAt DateTime @default(now())
@@index([businessId])
@@index([type, severity])
@@index([read])
}
enum AlertType {
WORKFLOW_FAILED
WORKFLOW_COMPLETED
REVENUE_MILESTONE
DECISION_EXECUTED
API_ERROR
BUDGET_THRESHOLD
SYSTEM_ERROR
}
enum AlertSeverity {
INFO
WARNING
ERROR
CRITICAL
}