// HMarket Veritabanı Şeması // MySQL için Prisma ORM konfigürasyonu generator client { provider = "prisma-client-js" } datasource db { provider = "mysql" url = env("DATABASE_URL") } // Kullanıcı modeli model User { id String @id @default(cuid()) email String @unique username String @unique firstName String lastName String password String? // OAuth kullanıcıları için opsiyonel avatar String? googleId String? @unique // Google OAuth ID authProvider String @default("local") // "local", "google" isActive Boolean @default(true) isAdmin Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt lastLoginAt DateTime? // İlişkiler ownedLists ShoppingList[] @relation("ListOwner") sharedLists ListMember[] notifications Notification[] deviceTokens DeviceToken[] activities Activity[] @@map("users") } // Cihaz token'ları (Push notification için) model DeviceToken { id String @id @default(cuid()) userId String token String @unique platform String // "ios", "android", "web" isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@map("device_tokens") } // Alışveriş listesi modeli model ShoppingList { id String @id @default(cuid()) name String description String? color String @default("#2196F3") // Hex renk kodu isActive Boolean @default(true) ownerId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // İlişkiler owner User @relation("ListOwner", fields: [ownerId], references: [id], onDelete: Cascade) members ListMember[] items ListItem[] activities Activity[] invitations ListInvitation[] @@map("shopping_lists") } // Liste üyeleri (çoklu kullanıcı desteği) model ListMember { id String @id @default(cuid()) listId String userId String role String @default("member") // "admin", "member", "viewer" joinedAt DateTime @default(now()) // İlişkiler list ShoppingList @relation(fields: [listId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([listId, userId]) @@map("list_members") } // Liste davetleri model ListInvitation { id String @id @default(cuid()) listId String email String role String @default("member") token String @unique isUsed Boolean @default(false) expiresAt DateTime createdAt DateTime @default(now()) list ShoppingList @relation(fields: [listId], references: [id], onDelete: Cascade) @@map("list_invitations") } // Ürün kategorileri model Category { id String @id @default(cuid()) name String @unique description String? icon String? // Icon adı veya URL color String @default("#757575") sortOrder Int @default(0) isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // İlişkiler products Product[] @@map("categories") } // Ürün modeli model Product { id String @id @default(cuid()) name String description String? barcode String? // barkod opsiyonel brand String? unit String? // Ürün varsayılan birimi categoryId String? image String? isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // İlişkiler category Category? @relation(fields: [categoryId], references: [id], onDelete: SetNull) listItems ListItem[] priceHistory PriceHistory[] @@map("products") } // Liste öğeleri model ListItem { id String @id @default(cuid()) listId String productId String? customName String? // Ürün yoksa manuel isim quantity Float @default(1) unit String @default("adet") // "kg", "lt", "adet", vb. price Decimal? // SQLite: Decimal stored as String note String? isPurchased Boolean @default(false) purchasedAt DateTime? purchasedBy String? priority Int @default(0) // 0: normal, 1: önemli, 2: acil sortOrder Int @default(0) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // İlişkiler list ShoppingList @relation(fields: [listId], references: [id], onDelete: Cascade) product Product? @relation(fields: [productId], references: [id], onDelete: SetNull) @@map("list_items") } // Fiyat geçmişi model PriceHistory { id String @id @default(cuid()) productId String price Decimal // SQLite: Decimal stored as String store String? // Mağaza adı location String? // Konum bilgisi source String @default("user") // "user", "api", "scraping" createdAt DateTime @default(now()) // İlişkiler product Product @relation(fields: [productId], references: [id], onDelete: Cascade) @@map("price_history") } // Bildirimler model Notification { id String @id @default(cuid()) userId String title String message String type String // "list_shared", "item_added", "item_purchased", "price_alert" data String? // Ek veri (JSON format - SQLite String olarak saklanır) isRead Boolean @default(false) createdAt DateTime @default(now()) // İlişkiler user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@map("notifications") } // Aktivite logu (gerçek zamanlı güncellemeler için) model Activity { id String @id @default(cuid()) listId String userId String action String // "item_added", "item_removed", "item_updated", "item_purchased" details String? // Aktivite detayları (JSON - SQLite String olarak saklanır) createdAt DateTime @default(now()) // İlişkiler list ShoppingList @relation(fields: [listId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@map("activities") } // Sistem ayarları model Setting { id String @id @default(cuid()) key String @unique value String type String @default("string") // "string", "number", "boolean", "json" createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("settings") }