Skip to main content

Prisma Schema Reference

The Prisma database stores merchant settings, scan jobs, and threat results. This document describes the key models.

Core Models​

Session​

Shopify session storage (managed by @shopify/shopify-app-session-storage-prisma).

model Session {
id String @id
shop String
state String
isOnline Boolean @default(false)
scope String?
expires DateTime?
accessToken String
userId BigInt?
firstName String?
lastName String?
email String?
accountOwner Boolean @default(false)
locale String?
collaborator Boolean? @default(false)
emailVerified Boolean? @default(false)
}

MerchantSettings​

Central settings and billing state per shop.

model MerchantSettings {
id String @id @default(cuid())
shop String @unique

// Billing
plan String @default("free")
billingStatus String @default("active")
subscriptionId String?
currentPeriodStart DateTime?
currentPeriodEnd DateTime?
trialStartedAt DateTime?
trialEndsAt DateTime?

// Protection settings
protectionRightClick Boolean @default(true)
protectionCopy Boolean @default(true)
protectionDevTools Boolean @default(false)
protectionViewSource Boolean @default(false)
protectionImages Boolean @default(true)
protectionTextSelection Boolean @default(false)

// Feature flags
botDetectionEnabled Boolean @default(false)
spyDetectionEnabled Boolean @default(false)
ipBlockingEnabled Boolean @default(false)

// Injection method
injectionMethod String @default("app_embed")
scriptTagId String?

// Dismissed UI elements
dismissedBanners String[] @default([])

createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}

IP Blocking​

IPBlockingConfig​

IP/country blocking rules.

model IPBlockingConfig {
id String @id @default(cuid())
shop String @unique
enabled Boolean @default(false)
blockedIPs String[] @default([])
blockedCIDRs String[] @default([])
blockedCountries String[] @default([])
allowedIPs String[] @default([])
blockVPN Boolean @default(false)
blockDatacenter Boolean @default(false)
blockTor Boolean @default(false)
updatedAt DateTime @updatedAt
}

Fraud Detection​

FraudOrder​

Fraud-flagged orders from Shopify webhooks.

model FraudOrder {
id String @id @default(cuid())
shop String
shopifyOrderId String
orderNumber String

// Risk assessment
riskLevel String // low, medium, high, critical
riskScore Int
riskSignals String[]

// Order details
email String?
customerName String?
totalPrice Decimal?
currency String?

// Visitor correlation
visitorId String?
sessionId String?
visitorSessionIds String[] @default([])

// Status
status String @default("pending") // pending, reviewed, confirmed_fraud, false_positive
reviewedAt DateTime?
reviewNote String?

createdAt DateTime @default(now())
updatedAt DateTime @updatedAt

@@unique([shop, shopifyOrderId])
}

Scanning Models​

ProductScanJob​

Background scan job for threat detection.

model ProductScanJob {
id String @id @default(cuid())
shop String

// Status
status String @default("pending") // pending, processing, completed, failed
claimedBy String?
claimedAt DateTime?
completedAt DateTime?
error String?
retryCount Int @default(0)

// Products scanned
products ScannedProduct[]

// Results
phishingDomains PhishingDomain[]
marketplaceThreats MarketplaceThreat[]

createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}

ScannedProduct​

Individual product being scanned.

model ScannedProduct {
id String @id @default(cuid())
productScanJobId String
productScanJob ProductScanJob @relation(fields: [productScanJobId], references: [id])

shopifyProductId String
title String
handle String
imageUrl String?
price Decimal?
vendor String?

createdAt DateTime @default(now())
}

Phishing Detection​

PhishingDomain​

Detected phishing domains.

model PhishingDomain {
id String @id @default(cuid())
shop String
productScanJobId String?
productScanJob ProductScanJob? @relation(fields: [productScanJobId], references: [id])

domain String
status String @default("pending") // pending, active, taken_down, false_positive, safe
confidence Int
signals String[]

// WHOIS data
registrar String?
createdDate DateTime?
expiresDate DateTime?
privacyProtected Boolean?

// Analysis
contentSimilarity Float?
logoSimilarity Float?

firstSeen DateTime @default(now())
lastChecked DateTime @default(now())

@@unique([shop, domain])
}

PhishingWhitelist​

Domains marked as safe.

model PhishingWhitelist {
id String @id @default(cuid())
shop String
domain String
reason String?
createdAt DateTime @default(now())

@@unique([shop, domain])
}

Marketplace Monitoring​

MarketplaceThreat​

Detected counterfeit listings.

model MarketplaceThreat {
id String @id @default(cuid())
shop String
productScanJobId String?

// Source
platform String // amazon, ebay, walmart, etsy, aliexpress
listingUrl String
listingTitle String
listingPrice Decimal?
sellerName String?
sellerRating Float?

// Match data
matchedProductId String?
matchScore Float

// Assessment
threatType String // counterfeit, gray_market, unauthorized
confidence Int
signals String[]

// Status
status String @default("pending") // pending, confirmed, taken_down, false_positive

createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}

Takedowns​

Takedown​

DMCA takedown requests.

model Takedown {
id String @id @default(cuid())
shop String

// Target
targetUrl String
targetPlatform String
targetType String // counterfeit, phishing, trademark

// Status
status String @default("draft") // draft, sent, pending, completed, rejected
sentAt DateTime?
responseAt DateTime?
responseNote String?

// Evidence
evidenceUrls String[]
originalProductUrl String?

// Notice details
noticeType String @default("dmca") // dmca, trademark, platform_specific
noticeContent String?

createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}

Alerts​

AlertConfig​

Alert configuration per shop.

model AlertConfig {
id String @id @default(cuid())
shop String @unique

// Email alerts
emailEnabled Boolean @default(true)
emailAddresses String[]

// Webhook alerts
webhookEnabled Boolean @default(false)
webhookUrl String?

// Alert types
alertOnBot Boolean @default(true)
alertOnSpy Boolean @default(true)
alertOnPhishing Boolean @default(true)
alertOnCounterfeit Boolean @default(true)
alertOnFraud Boolean @default(true)

// Frequency
digestFrequency String @default("realtime") // realtime, daily, weekly

updatedAt DateTime @updatedAt
}

AlertLog​

Sent alert history.

model AlertLog {
id String @id @default(cuid())
shop String
alertType String
channel String // email, webhook
recipient String
content String?
status String // sent, failed
error String?
sentAt DateTime @default(now())
}

Feedback​

Feedback​

User feedback and bug reports.

model Feedback {
id String @id @default(cuid())
shop String
type String // bug, feature, nps, general
message String
rating Int? // 1-10 for NPS
email String?
status String @default("new")
createdAt DateTime @default(now())
}

Feature​

Feature request tracking.

model Feature {
id String @id @default(cuid())
title String
description String?
status String @default("proposed") // proposed, planned, in_progress, released
votes Int @default(0)
createdAt DateTime @default(now())
}