generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model Project { id Int @id @default(autoincrement()) slug String @unique @db.VarChar(255) defaultLocale String @default("en") @db.VarChar(10) title String @db.VarChar(255) description String content String tags String[] @default([]) featured Boolean @default(false) category String @db.VarChar(100) date String @db.VarChar(10) github String? @db.VarChar(500) live String? @db.VarChar(500) published Boolean @default(true) imageUrl String? @db.VarChar(500) metaDescription String? keywords String? ogImage String? @db.VarChar(500) schema Json? difficulty Difficulty @default(INTERMEDIATE) timeToComplete String? @db.VarChar(100) technologies String[] @default([]) challenges String[] @default([]) lessonsLearned String[] @default([]) futureImprovements String[] @default([]) demoVideo String? @db.VarChar(500) screenshots String[] @default([]) colorScheme String @default("Dark") @db.VarChar(100) accessibility Boolean @default(true) performance Json @default("{\"loadTime\": \"1.5s\", \"bundleSize\": \"50KB\", \"lighthouse\": 90}") analytics Json @default("{\"likes\": 0, \"views\": 0, \"shares\": 0}") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") translations ProjectTranslation[] @@index([category]) @@index([featured]) @@index([published]) @@index([difficulty]) @@index([createdAt]) @@index([tags]) } model ProjectTranslation { id Int @id @default(autoincrement()) projectId Int @map("project_id") locale String @db.VarChar(10) title String @db.VarChar(255) description String content Json? metaDescription String? keywords String? ogImage String? @db.VarChar(500) schema Json? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) @@unique([projectId, locale]) @@index([locale]) @@index([projectId]) @@map("project_translations") } model ContentPage { id Int @id @default(autoincrement()) key String @unique @db.VarChar(100) status ContentStatus @default(PUBLISHED) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") translations ContentPageTranslation[] @@map("content_pages") } model ContentPageTranslation { id Int @id @default(autoincrement()) pageId Int @map("page_id") locale String @db.VarChar(10) title String? slug String? @db.VarChar(255) content Json metaDescription String? keywords String? updatedAt DateTime @updatedAt @map("updated_at") createdAt DateTime @default(now()) @map("created_at") page ContentPage @relation(fields: [pageId], references: [id], onDelete: Cascade) @@unique([pageId, locale]) @@index([locale]) @@index([slug]) @@map("content_page_translations") } model SiteSettings { id Int @id @default(1) defaultLocale String @default("en") @db.VarChar(10) locales String[] @default(["en","de"]) theme Json? updatedAt DateTime @updatedAt @map("updated_at") @@map("site_settings") } enum ContentStatus { DRAFT PUBLISHED } model PageView { id Int @id @default(autoincrement()) projectId Int? @map("project_id") page String @db.VarChar(100) ip String? @db.VarChar(45) userAgent String? @map("user_agent") referrer String? @db.VarChar(500) timestamp DateTime @default(now()) @@index([projectId]) @@index([timestamp]) @@index([page]) } model UserInteraction { id Int @id @default(autoincrement()) projectId Int @map("project_id") type InteractionType ip String? @db.VarChar(45) userAgent String? @map("user_agent") timestamp DateTime @default(now()) @@index([projectId]) @@index([type]) @@index([timestamp]) } model Contact { id Int @id @default(autoincrement()) name String @db.VarChar(255) email String @db.VarChar(255) subject String @db.VarChar(500) message String responded Boolean @default(false) responseTemplate String? @map("response_template") @db.VarChar(50) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@index([email]) @@index([responded]) @@index([createdAt]) } enum Difficulty { BEGINNER INTERMEDIATE ADVANCED EXPERT } enum InteractionType { LIKE SHARE BOOKMARK COMMENT } model ActivityStatus { id Int @id @default(1) activityType String? @map("activity_type") @db.VarChar(50) activityDetails String? @map("activity_details") @db.VarChar(255) activityProject String? @map("activity_project") @db.VarChar(255) activityLanguage String? @map("activity_language") @db.VarChar(50) activityRepo String? @map("activity_repo") @db.VarChar(500) musicPlaying Boolean @default(false) @map("music_playing") musicTrack String? @map("music_track") @db.VarChar(255) musicArtist String? @map("music_artist") @db.VarChar(255) musicAlbum String? @map("music_album") @db.VarChar(255) musicPlatform String? @map("music_platform") @db.VarChar(50) musicProgress Int? @map("music_progress") musicAlbumArt String? @map("music_album_art") @db.VarChar(500) watchingTitle String? @map("watching_title") @db.VarChar(255) watchingPlatform String? @map("watching_platform") @db.VarChar(50) watchingType String? @map("watching_type") @db.VarChar(50) gamingGame String? @map("gaming_game") @db.VarChar(255) gamingPlatform String? @map("gaming_platform") @db.VarChar(50) gamingStatus String? @map("gaming_status") @db.VarChar(50) statusMood String? @map("status_mood") @db.VarChar(50) statusMessage String? @map("status_message") @db.VarChar(500) updatedAt DateTime @default(now()) @updatedAt @map("updated_at") @@map("activity_status") }