hMarket Trae ilk versiyon

This commit is contained in:
hOLOlu
2026-02-03 01:22:08 +03:00
commit 2b861156fe
74 changed files with 42127 additions and 0 deletions

View File

@@ -0,0 +1,220 @@
-- CreateTable
CREATE TABLE `users` (
`id` VARCHAR(191) NOT NULL,
`email` VARCHAR(191) NOT NULL,
`username` VARCHAR(191) NOT NULL,
`firstName` VARCHAR(191) NOT NULL,
`lastName` VARCHAR(191) NOT NULL,
`password` VARCHAR(191) NULL,
`avatar` VARCHAR(191) NULL,
`googleId` VARCHAR(191) NULL,
`authProvider` VARCHAR(191) NOT NULL DEFAULT 'local',
`isActive` BOOLEAN NOT NULL DEFAULT true,
`isAdmin` BOOLEAN NOT NULL DEFAULT false,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
`lastLoginAt` DATETIME(3) NULL,
UNIQUE INDEX `users_email_key`(`email`),
UNIQUE INDEX `users_username_key`(`username`),
UNIQUE INDEX `users_googleId_key`(`googleId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `device_tokens` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`token` VARCHAR(191) NOT NULL,
`platform` VARCHAR(191) NOT NULL,
`isActive` BOOLEAN NOT NULL DEFAULT true,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `device_tokens_token_key`(`token`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `shopping_lists` (
`id` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
`description` VARCHAR(191) NULL,
`color` VARCHAR(191) NOT NULL DEFAULT '#2196F3',
`isActive` BOOLEAN NOT NULL DEFAULT true,
`ownerId` VARCHAR(191) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `list_members` (
`id` VARCHAR(191) NOT NULL,
`listId` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`role` VARCHAR(191) NOT NULL DEFAULT 'member',
`joinedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `list_members_listId_userId_key`(`listId`, `userId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `list_invitations` (
`id` VARCHAR(191) NOT NULL,
`listId` VARCHAR(191) NOT NULL,
`email` VARCHAR(191) NOT NULL,
`role` VARCHAR(191) NOT NULL DEFAULT 'member',
`token` VARCHAR(191) NOT NULL,
`isUsed` BOOLEAN NOT NULL DEFAULT false,
`expiresAt` DATETIME(3) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `list_invitations_token_key`(`token`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `categories` (
`id` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
`description` VARCHAR(191) NULL,
`icon` VARCHAR(191) NULL,
`color` VARCHAR(191) NOT NULL DEFAULT '#757575',
`sortOrder` INTEGER NOT NULL DEFAULT 0,
`isActive` BOOLEAN NOT NULL DEFAULT true,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `categories_name_key`(`name`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `products` (
`id` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
`description` VARCHAR(191) NULL,
`barcode` VARCHAR(191) NULL,
`brand` VARCHAR(191) NULL,
`unit` VARCHAR(191) NULL,
`categoryId` VARCHAR(191) NULL,
`image` VARCHAR(191) NULL,
`isActive` BOOLEAN NOT NULL DEFAULT true,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `products_barcode_key`(`barcode`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `list_items` (
`id` VARCHAR(191) NOT NULL,
`listId` VARCHAR(191) NOT NULL,
`productId` VARCHAR(191) NULL,
`customName` VARCHAR(191) NULL,
`quantity` DOUBLE NOT NULL DEFAULT 1,
`unit` VARCHAR(191) NOT NULL DEFAULT 'adet',
`price` DECIMAL(10, 2) NULL,
`note` VARCHAR(191) NULL,
`isPurchased` BOOLEAN NOT NULL DEFAULT false,
`purchasedAt` DATETIME(3) NULL,
`purchasedBy` VARCHAR(191) NULL,
`priority` INTEGER NOT NULL DEFAULT 0,
`sortOrder` INTEGER NOT NULL DEFAULT 0,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `price_history` (
`id` VARCHAR(191) NOT NULL,
`productId` VARCHAR(191) NOT NULL,
`price` DECIMAL(10, 2) NOT NULL,
`store` VARCHAR(191) NULL,
`location` VARCHAR(191) NULL,
`source` VARCHAR(191) NOT NULL DEFAULT 'user',
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `notifications` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`title` VARCHAR(191) NOT NULL,
`message` VARCHAR(191) NOT NULL,
`type` VARCHAR(191) NOT NULL,
`data` JSON NULL,
`isRead` BOOLEAN NOT NULL DEFAULT false,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `activities` (
`id` VARCHAR(191) NOT NULL,
`listId` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NOT NULL,
`action` VARCHAR(191) NOT NULL,
`details` JSON NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `settings` (
`id` VARCHAR(191) NOT NULL,
`key` VARCHAR(191) NOT NULL,
`value` VARCHAR(191) NOT NULL,
`type` VARCHAR(191) NOT NULL DEFAULT 'string',
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `settings_key_key`(`key`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey
ALTER TABLE `device_tokens` ADD CONSTRAINT `device_tokens_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `shopping_lists` ADD CONSTRAINT `shopping_lists_ownerId_fkey` FOREIGN KEY (`ownerId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `list_members` ADD CONSTRAINT `list_members_listId_fkey` FOREIGN KEY (`listId`) REFERENCES `shopping_lists`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `list_members` ADD CONSTRAINT `list_members_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `list_invitations` ADD CONSTRAINT `list_invitations_listId_fkey` FOREIGN KEY (`listId`) REFERENCES `shopping_lists`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `products` ADD CONSTRAINT `products_categoryId_fkey` FOREIGN KEY (`categoryId`) REFERENCES `categories`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `list_items` ADD CONSTRAINT `list_items_listId_fkey` FOREIGN KEY (`listId`) REFERENCES `shopping_lists`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `list_items` ADD CONSTRAINT `list_items_productId_fkey` FOREIGN KEY (`productId`) REFERENCES `products`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `price_history` ADD CONSTRAINT `price_history_productId_fkey` FOREIGN KEY (`productId`) REFERENCES `products`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `notifications` ADD CONSTRAINT `notifications_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `activities` ADD CONSTRAINT `activities_listId_fkey` FOREIGN KEY (`listId`) REFERENCES `shopping_lists`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `activities` ADD CONSTRAINT `activities_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

View File

@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (i.e. Git)
provider = "mysql"

View File

@@ -0,0 +1,232 @@
// HMarket Veritabanı Şeması
// MariaDB 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? @unique
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? @db.Decimal(10, 2)
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 @db.Decimal(10, 2)
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 Json? // Ek veri (JSON format)
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 Json? // Aktivite detayları
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")
}

389
backend/prisma/seed.js Normal file
View File

@@ -0,0 +1,389 @@
const { PrismaClient } = require('@prisma/client');
const bcrypt = require('bcryptjs');
const prisma = new PrismaClient();
async function main() {
console.log('🌱 Veritabanı seed işlemi başlatılıyor...');
// Admin kullanıcısı oluştur
const hashedPassword = await bcrypt.hash('admin123', 12);
const adminUser = await prisma.user.upsert({
where: { email: 'admin@hmarket.com' },
update: {},
create: {
email: 'admin@hmarket.com',
username: 'admin',
firstName: 'Admin',
lastName: 'User',
password: hashedPassword,
isAdmin: true,
},
});
console.log('✅ Admin kullanıcısı oluşturuldu:', adminUser.email);
// Test kullanıcıları oluştur
const testUsers = [
{
email: 'ahmet@test.com',
username: 'ahmet',
firstName: 'Ahmet',
lastName: 'Yılmaz',
password: await bcrypt.hash('test123', 12),
},
{
email: 'ayse@test.com',
username: 'ayse',
firstName: 'Ayşe',
lastName: 'Kaya',
password: await bcrypt.hash('test123', 12),
},
{
email: 'mehmet@test.com',
username: 'mehmet',
firstName: 'Mehmet',
lastName: 'Demir',
password: await bcrypt.hash('test123', 12),
},
];
for (const userData of testUsers) {
const user = await prisma.user.upsert({
where: { email: userData.email },
update: {},
create: userData,
});
console.log('✅ Test kullanıcısı oluşturuldu:', user.email);
}
// Kategoriler oluştur
const categories = [
{ name: 'Meyve & Sebze', description: 'Taze meyve ve sebzeler', icon: '🥕', color: '#4CAF50' },
{ name: 'Et & Tavuk', description: 'Kırmızı et, beyaz et ve şarküteri ürünleri', icon: '🥩', color: '#F44336' },
{ name: 'Süt Ürünleri', description: 'Süt, peynir, yoğurt ve diğer süt ürünleri', icon: '🥛', color: '#2196F3' },
{ name: 'Fırın & Pastane', description: 'Ekmek, pasta ve unlu mamuller', icon: '🍞', color: '#FF9800' },
{ name: 'Atıştırmalık', description: 'Çikolata, bisküvi ve atıştırmalık ürünler', icon: '🍿', color: '#9C27B0' },
{ name: 'İçecek', description: 'Alkolsüz içecekler ve sıcak içecekler', icon: '🥤', color: '#00BCD4' },
{ name: 'Temizlik', description: 'Ev temizlik ürünleri ve deterjanlar', icon: '🧽', color: '#607D8B' },
{ name: 'Kişisel Bakım', description: 'Kişisel hijyen ve bakım ürünleri', icon: '🧴', color: '#E91E63' },
{ name: 'Bebek', description: 'Bebek bakım ürünleri ve mama', icon: '🍼', color: '#FFEB3B' },
{ name: 'Dondurulmuş', description: 'Dondurulmuş gıda ürünleri', icon: '🧊', color: '#3F51B5' },
];
for (const categoryData of categories) {
const category = await prisma.category.upsert({
where: { name: categoryData.name },
update: {},
create: categoryData,
});
console.log('✅ Kategori oluşturuldu:', category.name);
}
// Örnek ürünler oluştur
const products = [
// Meyve & Sebze
{ name: 'Elma', categoryName: 'Meyve & Sebze', barcode: '1234567890123', averagePrice: 12.50 },
{ name: 'Muz', categoryName: 'Meyve & Sebze', barcode: '1234567890124', averagePrice: 18.00 },
{ name: 'Domates', categoryName: 'Meyve & Sebze', barcode: '1234567890125', averagePrice: 8.75 },
{ name: 'Salatalık', categoryName: 'Meyve & Sebze', barcode: '1234567890126', averagePrice: 6.50 },
{ name: 'Soğan', categoryName: 'Meyve & Sebze', barcode: '1234567890127', averagePrice: 4.25 },
{ name: 'Patates', categoryName: 'Meyve & Sebze', barcode: '1234567890137', averagePrice: 5.75 },
{ name: 'Havuç', categoryName: 'Meyve & Sebze', barcode: '1234567890138', averagePrice: 7.50 },
{ name: 'Biber', categoryName: 'Meyve & Sebze', barcode: '1234567890139', averagePrice: 15.00 },
{ name: 'Portakal', categoryName: 'Meyve & Sebze', barcode: '1234567890140', averagePrice: 10.00 },
{ name: 'Limon', categoryName: 'Meyve & Sebze', barcode: '1234567890141', averagePrice: 8.00 },
// Süt Ürünleri
{ name: 'Süt 1L', categoryName: 'Süt Ürünleri', barcode: '1234567890128', averagePrice: 8.75 },
{ name: 'Yoğurt 500g', categoryName: 'Süt Ürünleri', barcode: '1234567890129', averagePrice: 12.50 },
{ name: 'Beyaz Peynir', categoryName: 'Süt Ürünleri', barcode: '1234567890130', averagePrice: 45.00 },
{ name: 'Kaşar Peyniri', categoryName: 'Süt Ürünleri', barcode: '1234567890131', averagePrice: 65.00 },
{ name: 'Tereyağı', categoryName: 'Süt Ürünleri', barcode: '1234567890142', averagePrice: 35.00 },
{ name: 'Yumurta 30\'lu', categoryName: 'Süt Ürünleri', barcode: '1234567890143', averagePrice: 85.00 },
{ name: 'Krema', categoryName: 'Süt Ürünleri', barcode: '1234567890144', averagePrice: 15.50 },
// Fırın & Pastane
{ name: 'Ekmek', categoryName: 'Fırın & Pastane', barcode: '1234567890132', averagePrice: 4.50 },
{ name: 'Simit', categoryName: 'Fırın & Pastane', barcode: '1234567890133', averagePrice: 2.50 },
{ name: 'Pide', categoryName: 'Fırın & Pastane', barcode: '1234567890145', averagePrice: 8.00 },
{ name: 'Çörek', categoryName: 'Fırın & Pastane', barcode: '1234567890146', averagePrice: 6.50 },
{ name: 'Kek', categoryName: 'Fırın & Pastane', barcode: '1234567890147', averagePrice: 25.00 },
// İçecek
{ name: 'Su 1.5L', categoryName: 'İçecek', barcode: '1234567890134', averagePrice: 2.50 },
{ name: 'Çay', categoryName: 'İçecek', barcode: '1234567890135', averagePrice: 35.00 },
{ name: 'Kahve', categoryName: 'İçecek', barcode: '1234567890136', averagePrice: 85.00 },
{ name: 'Meyve Suyu', categoryName: 'İçecek', barcode: '1234567890148', averagePrice: 12.50 },
{ name: 'Kola', categoryName: 'İçecek', barcode: '1234567890149', averagePrice: 8.75 },
{ name: 'Ayran', categoryName: 'İçecek', barcode: '1234567890150', averagePrice: 4.50 },
// Et & Tavuk
{ name: 'Tavuk But', categoryName: 'Et & Tavuk', barcode: '1234567890151', averagePrice: 45.00 },
{ name: 'Dana Kıyma', categoryName: 'Et & Tavuk', barcode: '1234567890152', averagePrice: 120.00 },
{ name: 'Köfte', categoryName: 'Et & Tavuk', barcode: '1234567890153', averagePrice: 85.00 },
{ name: 'Sosis', categoryName: 'Et & Tavuk', barcode: '1234567890154', averagePrice: 25.00 },
// Temizlik
{ name: 'Deterjan', categoryName: 'Temizlik', barcode: '1234567890155', averagePrice: 45.00 },
{ name: 'Sabun', categoryName: 'Temizlik', barcode: '1234567890156', averagePrice: 8.50 },
{ name: 'Şampuan', categoryName: 'Temizlik', barcode: '1234567890157', averagePrice: 35.00 },
{ name: 'Diş Macunu', categoryName: 'Kişisel Bakım', barcode: '1234567890158', averagePrice: 18.50 },
// Atıştırmalık
{ name: 'Çikolata', categoryName: 'Atıştırmalık', barcode: '1234567890159', averagePrice: 12.50 },
{ name: 'Bisküvi', categoryName: 'Atıştırmalık', barcode: '1234567890160', averagePrice: 8.75 },
{ name: 'Cips', categoryName: 'Atıştırmalık', barcode: '1234567890161', averagePrice: 6.50 },
];
for (const productData of products) {
const category = await prisma.category.findUnique({
where: { name: productData.categoryName }
});
if (category) {
const product = await prisma.product.upsert({
where: { barcode: productData.barcode },
update: {},
create: {
name: productData.name,
barcode: productData.barcode,
categoryId: category.id,
},
});
console.log('✅ Ürün oluşturuldu:', product.name);
}
}
// Örnek alışveriş listeleri oluştur
const ahmetUser = await prisma.user.findUnique({
where: { email: 'ahmet@test.com' }
});
const ayseUser = await prisma.user.findUnique({
where: { email: 'ayse@test.com' }
});
const mehmetUser = await prisma.user.findUnique({
where: { email: 'mehmet@test.com' }
});
// Ahmet için alışveriş listeleri
if (ahmetUser) {
const shoppingLists = [
{
name: 'Haftalık Alışveriş',
description: 'Bu haftanın market alışverişi',
color: '#4CAF50',
items: [
{ productName: 'Elma', quantity: 2, unit: 'kg', price: 15.50 },
{ productName: 'Süt 1L', quantity: 1, unit: 'adet', price: 8.75 },
{ customName: 'Deterjan', quantity: 1, unit: 'adet', price: 25.00, note: 'Çamaşır deterjanı' },
{ productName: 'Ekmek', quantity: 2, unit: 'adet', price: 9.00 },
{ productName: 'Yumurta 30\'lu', quantity: 1, unit: 'adet', price: 85.00 },
]
},
{
name: 'Kahvaltı Malzemeleri',
description: 'Kahvaltı için gerekli ürünler',
color: '#FF9800',
items: [
{ productName: 'Ekmek', quantity: 2, unit: 'adet', price: 9.00 },
{ productName: 'Beyaz Peynir', quantity: 1, unit: 'kg', price: 45.00 },
{ productName: 'Tereyağı', quantity: 1, unit: 'adet', price: 35.00 },
{ productName: 'Domates', quantity: 1, unit: 'kg', price: 8.75 },
{ productName: 'Salatalık', quantity: 2, unit: 'adet', price: 13.00 },
{ productName: 'Çay', quantity: 1, unit: 'adet', price: 35.00 },
]
}
];
for (const listData of shoppingLists) {
const shoppingList = await prisma.shoppingList.create({
data: {
name: listData.name,
description: listData.description,
color: listData.color,
ownerId: ahmetUser.id,
},
});
for (const itemData of listData.items) {
let productId = null;
if (itemData.productName) {
const product = await prisma.product.findFirst({
where: { name: itemData.productName }
});
if (product) {
productId = product.id;
}
}
await prisma.listItem.create({
data: {
listId: shoppingList.id,
productId: productId,
customName: itemData.customName,
quantity: itemData.quantity,
unit: itemData.unit,
price: itemData.price,
note: itemData.note,
},
});
}
console.log('✅ Alışveriş listesi oluşturuldu:', shoppingList.name);
}
}
// Ayşe için alışveriş listeleri
if (ayseUser) {
const ayseShoppingLists = [
{
name: 'Parti Alışverişi',
description: 'Doğum günü partisi için',
color: '#E91E63',
items: [
{ productName: 'Kek', quantity: 1, unit: 'adet', price: 25.00 },
{ productName: 'Çikolata', quantity: 5, unit: 'adet', price: 62.50 },
{ productName: 'Bisküvi', quantity: 3, unit: 'paket', price: 26.25 },
{ productName: 'Kola', quantity: 6, unit: 'adet', price: 52.50 },
{ productName: 'Meyve Suyu', quantity: 4, unit: 'adet', price: 50.00 },
{ customName: 'Parti Süsleri', quantity: 1, unit: 'set', price: 45.00 },
]
},
{
name: 'Temizlik Malzemeleri',
description: 'Ev temizliği için gerekli ürünler',
color: '#607D8B',
items: [
{ productName: 'Deterjan', quantity: 2, unit: 'adet', price: 90.00 },
{ productName: 'Sabun', quantity: 3, unit: 'adet', price: 25.50 },
{ productName: 'Şampuan', quantity: 1, unit: 'adet', price: 35.00 },
{ customName: 'Cam Temizleyici', quantity: 1, unit: 'adet', price: 18.50 },
{ customName: 'Yer Bezi', quantity: 2, unit: 'adet', price: 15.00 },
]
}
];
for (const listData of ayseShoppingLists) {
const shoppingList = await prisma.shoppingList.create({
data: {
name: listData.name,
description: listData.description,
color: listData.color,
ownerId: ayseUser.id,
},
});
for (const itemData of listData.items) {
let productId = null;
if (itemData.productName) {
const product = await prisma.product.findFirst({
where: { name: itemData.productName }
});
if (product) {
productId = product.id;
}
}
await prisma.listItem.create({
data: {
listId: shoppingList.id,
productId: productId,
customName: itemData.customName,
quantity: itemData.quantity,
unit: itemData.unit,
price: itemData.price,
},
});
}
console.log('✅ Alışveriş listesi oluşturuldu:', shoppingList.name);
}
}
// Mehmet için alışveriş listesi
if (mehmetUser) {
const mehmetShoppingList = {
name: 'Et ve Protein',
description: 'Protein ihtiyacı için et ürünleri',
color: '#F44336',
items: [
{ productName: 'Tavuk But', quantity: 2, unit: 'kg', price: 90.00 },
{ productName: 'Dana Kıyma', quantity: 1, unit: 'kg', price: 120.00 },
{ productName: 'Köfte', quantity: 1, unit: 'kg', price: 85.00 },
{ productName: 'Sosis', quantity: 2, unit: 'paket', price: 50.00 },
{ productName: 'Yumurta 30\'lu', quantity: 1, unit: 'adet', price: 85.00 },
]
};
const shoppingList = await prisma.shoppingList.create({
data: {
name: mehmetShoppingList.name,
description: mehmetShoppingList.description,
color: mehmetShoppingList.color,
ownerId: mehmetUser.id,
},
});
for (const itemData of mehmetShoppingList.items) {
let productId = null;
if (itemData.productName) {
const product = await prisma.product.findFirst({
where: { name: itemData.productName }
});
if (product) {
productId = product.id;
}
}
await prisma.listItem.create({
data: {
listId: shoppingList.id,
productId: productId,
quantity: itemData.quantity,
unit: itemData.unit,
price: itemData.price,
},
});
}
console.log('✅ Alışveriş listesi oluşturuldu:', shoppingList.name);
}
console.log('✅ Tüm örnek alışveriş listeleri oluşturuldu');
// Sistem ayarları
const settings = [
{ key: 'app_name', value: 'HMarket', type: 'string' },
{ key: 'app_version', value: '1.0.0', type: 'string' },
{ key: 'max_list_members', value: '10', type: 'number' },
{ key: 'enable_notifications', value: 'true', type: 'boolean' },
{ key: 'default_currency', value: 'TL', type: 'string' },
];
for (const settingData of settings) {
await prisma.setting.upsert({
where: { key: settingData.key },
update: { value: settingData.value },
create: settingData,
});
console.log('✅ Ayar oluşturuldu:', settingData.key);
}
console.log('🎉 Seed işlemi tamamlandı!');
}
main()
.catch((e) => {
console.error('❌ Seed işlemi sırasında hata:', e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});