generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } enum Role { ADMIN USER } model User { id String @id @default(cuid()) name String? email String @unique password String? role Role @default(USER) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? accounts Account[] sessions Session[] } model Account { id String @id @default(cuid()) userId String type String provider String providerAccountId String refresh_token String? @db.Text access_token String? @db.Text expires_at Int? token_type String? scope String? id_token String? @db.Text session_state String? user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([provider, providerAccountId]) } model Session { id String @id @default(cuid()) sessionToken String @unique userId String expires DateTime user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model VerificationToken { id_dummy String @id @default(cuid()) // Dummy ID to avoid next-auth adapter issue identifier String token String @unique expires DateTime @@unique([identifier, token]) } model Category { id String @id @default(cuid()) slug String @unique nameTr String nameEn String nameRu String listings Listing[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Neighborhood { id String @id @default(cuid()) slug String @unique nameTr String nameEn String nameRu String listings Listing[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Listing { id String @id @default(cuid()) slug String @unique categoryId String neighborhoodId String city String @default("marmaris") nameTr String nameEn String nameRu String descriptionTr String descriptionEn String descriptionRu String address String phone String? whatsapp String? website String? instagram String? priceRange Int // 1-3 rating Float? // 0-5 isLocalApproved Boolean @default(false) latitude Float? longitude Float? openingHours Json? images Gallery[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? category Category @relation(fields: [categoryId], references: [id]) neighborhood Neighborhood @relation(fields: [neighborhoodId], references: [id]) // Phase 2 Fields menuUrl String? isFeatured Boolean @default(false) featuredUntil DateTime? collections Collection[] @relation("CollectionListings") instagramFeed InstagramFeedCache? // Phase 3 Fields hasWidgetInstalled Boolean @default(false) widgetInstalledAt DateTime? widgetSiteUrl String? analytics ListingAnalyticsDaily[] events Event[] } model Gallery { id String @id @default(cuid()) listingId String url String createdAt DateTime @default(now()) listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade) } model BusinessSubmission { id String @id @default(cuid()) businessName String categoryId String neighborhoodId String address String phone String? whatsapp String? description String contactName String contactEmail String imageUrl String? status String @default("PENDING") // PENDING, APPROVED, REJECTED createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model ContactMessage { id String @id @default(cuid()) name String email String subject String // Genel, İşbirliği, Hata Bildirimi, Diğer message String isRead Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model BlogPost { id String @id @default(cuid()) slug String @unique titleTr String titleEn String titleRu String contentTr String @db.Text contentEn String @db.Text contentRu String @db.Text coverImage String? tags String[] relatedListingIds String[] publishedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? } model Collection { id String @id @default(cuid()) slug String @unique titleTr String titleEn String titleRu String descriptionTr String @db.Text descriptionEn String @db.Text descriptionRu String @db.Text coverImage String? listings Listing[] @relation("CollectionListings") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model InstagramFeedCache { id String @id @default(cuid()) listingId String @unique handle String posts Json // [{ imageUrl, caption, permalink, postedAt }] fetchedAt DateTime @default(now()) listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade) } model ListingAnalyticsDaily { id String @id @default(cuid()) listingId String date DateTime views Int @default(0) whatsappClicks Int @default(0) phoneClicks Int @default(0) menuClicks Int @default(0) listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade) @@unique([listingId, date]) } model Event { id String @id @default(cuid()) slug String @unique listingId String? titleTr String titleEn String titleRu String descriptionTr String @db.Text descriptionEn String @db.Text descriptionRu String @db.Text startDate DateTime endDate DateTime? coverImage String? // Openinary isSponsored Boolean @default(false) listing Listing? @relation(fields: [listingId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? } model GeneratedItinerary { id String @id @default(cuid()) paramsHash String @unique params Json // budget, groupType, interests, days content String @db.Text listingIds String[] createdAt DateTime @default(now()) } model WidgetPartner { id String @id @default(cuid()) name String url String neighborhoodSlug String? isActive Boolean @default(true) isHidden Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt }