Files

188 lines
5.2 KiB
Plaintext

generator client {
provider = "prisma-client-js"
binaryTargets = ["native", "debian-openssl-3.0.x", "debian-openssl-1.1.x"]
previewFeatures = ["postgresqlExtensions"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model ExternalLink {
id String @id @default(cuid())
type LinkType
url String
title String?
projectId String
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
@@unique([projectId, url])
@@index([projectId], map: "idx_link_projectId")
@@index([type], map: "idx_link_type")
@@index([type, url], map: "idx_link_type_url")
@@index([url], map: "idx_link_url")
@@map("external_links")
}
model ProjectDiscoveryTask {
id String @id @default(cuid())
status TaskStatus @default(PENDING)
sourceUrl String
sourceType String @default("manual")
explorationData Json?
explorationSummary String?
errorMessage String?
retryCount Int @default(0)
lastRetryAt DateTime?
projectId String?
createdAt DateTime @default(now())
startedAt DateTime?
completedAt DateTime?
updatedAt DateTime @updatedAt
project Project? @relation(fields: [projectId], references: [id])
@@index([projectId], map: "idx_task_project_id")
@@index([sourceUrl], map: "idx_task_source_url")
@@index([status, createdAt], map: "idx_task_status_created")
@@map("project_discovery_tasks")
}
model ProjectTag {
projectId String
tagId String
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
tag Tag @relation(fields: [tagId], references: [id], onDelete: Cascade)
@@id([projectId, tagId])
@@index([tagId])
@@map("project_tags")
}
model Project {
id String @id @default(cuid())
name String
nameEn String?
slug String @unique
description String
descriptionEn String?
content String?
contentEn String?
githubStars Int @default(0)
githubStarsUpdatedAt DateTime?
status ProjectStatus @default(ACTIVE)
source String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
embedding Unsupported("vector")?
embeddingUpdatedAt DateTime?
links ExternalLink[]
projectDiscoveryTasks ProjectDiscoveryTask[]
tags ProjectTag[]
@@index([embedding], map: "idx_project_embedding_cosine")
@@index([slug], map: "idx_project_slug")
@@index([status, createdAt], map: "idx_project_status_createdAt")
@@index([status, githubStars], map: "idx_project_status_github_stars")
@@map("projects")
}
model Tag {
id String @id @default(cuid())
name String @unique
nameEn String?
slug String @unique
category TagCategory @default(FREE_TAG)
createdAt DateTime @default(now())
projects ProjectTag[]
@@index([category], map: "idx_tag_category")
@@index([slug], map: "idx_tag_slug")
@@map("tags")
}
model Signal {
id String @id @default(cuid())
source String
sourceUrl String
title String
titleEn String?
summary String
summaryEn String?
topic String?
topicEn String?
tags Json
sections Json
engagement Int @default(0)
hotScore Int @default(0)
isHot Boolean @default(false)
publishedAt DateTime
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([source, sourceUrl], map: "uniq_signal_source_url")
@@index([source, publishedAt], map: "idx_signal_source_published")
@@index([isActive, publishedAt], map: "idx_signal_active_published")
@@index([isActive, isHot, hotScore, publishedAt], map: "idx_signal_active_hot_sort")
@@index([engagement], map: "idx_signal_engagement")
@@index([hotScore], map: "idx_signal_hot_score")
@@map("signals")
}
model ProjectSubmission {
id String @id @default(cuid())
url String
normalizedUrl String @unique
projectName String?
description String?
submitterName String?
submitterEmail String?
locale String @default("zh")
status ProjectSubmissionStatus @default(PENDING)
reviewNotes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([status, createdAt], map: "idx_project_submission_status_createdAt")
@@index([locale], map: "idx_project_submission_locale")
@@map("project_submissions")
}
enum LinkType {
WEBSITE
GITHUB
HUGGINGFACE
PAPER
}
enum ProjectStatus {
ACTIVE
ARCHIVED
}
enum TaskStatus {
PENDING
IN_PROGRESS
COMPLETED
FAILED
}
enum ProjectSubmissionStatus {
PENDING
APPROVED
REJECTED
IMPORTED
}
enum TagCategory {
FIXED_PROJECT_TYPE
TECH_STACK
AI_PARADIGM
PROTOCOL_INTERFACE
PRODUCT_FORM
DOMAIN_SCENARIO
RESOURCE_TYPE
FREE_TAG
}