generator client { provider = "prisma-client-js" 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") } enum LinkType { WEBSITE GITHUB HUGGINGFACE PAPER } enum ProjectStatus { ACTIVE ARCHIVED } enum TaskStatus { PENDING IN_PROGRESS COMPLETED FAILED } enum TagCategory { FIXED_PROJECT_TYPE TECH_STACK AI_PARADIGM PROTOCOL_INTERFACE PRODUCT_FORM DOMAIN_SCENARIO RESOURCE_TYPE FREE_TAG }