/
masterOK
/
FEF
Обзор
Документация
Войти
/
masterOK
/
FEF
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
seed.ts
670 строк
26 KB
masterOK
upload files
10 ноя 2025, 19:52
10 ноя 2025, 19:52
2cb4a49
Код
Авторство
О чём код?
import { db } from "./db"; import * as schema from "@shared/schema"; import bcrypt from "bcrypt"; async function seed() { console.log("🌱 Starting database seed..."); try { const existingUsers = await db.select().from(schema.users); if (existingUsers.length > 0) { console.log("✓ Database already seeded, skipping..."); return; } const adminPasswordHash = await bcrypt.hash("10242131Vv", 10); const passwordHash = await bcrypt.hash("password123", 10); console.log("Creating users..."); const users = await db .insert(schema.users) .values([ { email: "uslugi_admin@uslugi.ru", passwordHash: adminPasswordHash, role: "admin", fullName: "Администратор USLUGI.ru", phone: "+7 (999) 123-45-67", city: "Москва", }, { email: "ivan@example.ru", passwordHash, role: "client", fullName: "Иван Петров", phone: "+7 (999) 111-11-11", city: "Москва", latitude: "55.7558", longitude: "37.6173", }, { email: "maria@example.ru", passwordHash, role: "client", fullName: "Мария Смирнова", phone: "+7 (999) 222-22-22", city: "Санкт-Петербург", latitude: "59.9343", longitude: "30.3351", }, { email: "master1@example.ru", passwordHash, role: "master", fullName: "Александр Мастеров", phone: "+7 (999) 333-33-33", city: "Москва", avatarUrl: "https://api.dicebear.com/7.x/avataaars/svg?seed=master1", latitude: "55.7512", longitude: "37.6184", }, { email: "master2@example.ru", passwordHash, role: "master", fullName: "Дмитрий Ремонтов", phone: "+7 (999) 444-44-44", city: "Москва", avatarUrl: "https://api.dicebear.com/7.x/avataaars/svg?seed=master2", latitude: "55.7600", longitude: "37.6200", }, { email: "master3@example.ru", passwordHash, role: "master", fullName: "Сергей Электриков", phone: "+7 (999) 555-55-55", city: "Санкт-Петербург", avatarUrl: "https://api.dicebear.com/7.x/avataaars/svg?seed=master3", latitude: "59.9311", longitude: "30.3609", }, { email: "master4@example.ru", passwordHash, role: "master", fullName: "Николай Сантехников", phone: "+7 (999) 666-66-66", city: "Москва", avatarUrl: "https://api.dicebear.com/7.x/avataaars/svg?seed=master4", latitude: "55.7450", longitude: "37.6300", }, { email: "master5@example.ru", passwordHash, role: "master", fullName: "Андрей Плиточник", phone: "+7 (999) 777-77-77", city: "Казань", avatarUrl: "https://api.dicebear.com/7.x/avataaars/svg?seed=master5", latitude: "55.7887", longitude: "49.1221", }, ]) .returning(); console.log(`✓ Created ${users.length} users`); const masterUsers = users.filter((u) => u.role === "master"); console.log("Creating categories..."); const categories = await db .insert(schema.categories) .values([ { name: "Ремонт квартир", description: "Комплексный и частичный ремонт жилых помещений", icon: "🏠", type: "service", }, { name: "Электрика", description: "Электромонтажные работы любой сложности", icon: "⚡", type: "service", }, { name: "Сантехника", description: "Установка и ремонт сантехники", icon: "🚰", type: "service", }, { name: "Отделочные работы", description: "Плитка, обои, покраска, штукатурка", icon: "🎨", type: "service", }, { name: "Мебель", description: "Сборка и ремонт мебели", icon: "🪑", type: "service", }, { name: "Бытовая техника", description: "Ремонт стиральных машин, холодильников и другой техники", icon: "🔧", type: "service", }, { name: "Клининг", description: "Уборка квартир, офисов, химчистка", icon: "🧹", type: "service", }, { name: "Компьютеры и IT", description: "Настройка компьютеров, установка ПО, ремонт техники", icon: "💻", type: "service", }, { name: "Автомобили", description: "Ремонт и обслуживание автомобилей", icon: "🚗", type: "service", }, { name: "Юридические услуги", description: "Консультации, составление документов", icon: "⚖️", type: "service", }, { name: "Красота и здоровье", description: "Парикмахерские услуги, косметология, массаж", icon: "💇", type: "service", }, { name: "Обучение", description: "Репетиторство, курсы, тренинги", icon: "📚", type: "service", }, { name: "Грузоперевозки", description: "Перевозка грузов, переезды", icon: "🚚", type: "service", }, { name: "Строительство", description: "Строительные и монтажные работы", icon: "🏗️", type: "service", }, { name: "Садоводство", description: "Уход за садом, ландшафтный дизайн", icon: "🌳", type: "service", }, { name: "Авто", description: "Продажа автомобилей, запчастей и аксессуаров", icon: "🚗", type: "listing", }, { name: "Недвижимость", description: "Квартиры, дома, коммерческая недвижимость", icon: "🏢", type: "listing", }, { name: "Электроника", description: "Телефоны, ноутбуки, компьютеры, техника", icon: "📱", type: "listing", }, { name: "Мебель и интерьер", description: "Мебель для дома и офиса", icon: "🛋️", type: "listing", }, { name: "Одежда и обувь", description: "Новая и б/у одежда и обувь", icon: "👔", type: "listing", }, { name: "Товары для дома", description: "Бытовая техника, посуда, текстиль", icon: "🏡", type: "listing", }, { name: "Хобби и спорт", description: "Спортивный инвентарь, музыкальные инструменты", icon: "⚽", type: "listing", }, { name: "Детские товары", description: "Игрушки, коляски, детская мебель", icon: "👶", type: "listing", }, ]) .returning(); console.log(`✓ Created ${categories.length} categories`); console.log("Creating car brands..."); const carBrands = await db .insert(schema.carBrands) .values([ { name: "BMW", isPopular: true }, { name: "Mercedes-Benz", isPopular: true }, { name: "Audi", isPopular: true }, { name: "Toyota", isPopular: true }, { name: "Honda", isPopular: true }, { name: "Volkswagen", isPopular: true }, { name: "Ford", isPopular: true }, { name: "Nissan", isPopular: true }, { name: "Kia", isPopular: true }, { name: "Hyundai", isPopular: true }, { name: "Mazda", isPopular: true }, { name: "Lexus", isPopular: true }, { name: "Volvo", isPopular: true }, { name: "Škoda", isPopular: true }, { name: "Renault", isPopular: true }, { name: "Peugeot", isPopular: true }, { name: "Chevrolet", isPopular: true }, { name: "Mitsubishi", isPopular: true }, { name: "Subaru", isPopular: false }, { name: "Suzuki", isPopular: false }, { name: "Opel", isPopular: false }, { name: "Infiniti", isPopular: false }, { name: "Jeep", isPopular: false }, { name: "Land Rover", isPopular: false }, { name: "Porsche", isPopular: false }, { name: "ВАЗ (Lada)", isPopular: true }, { name: "ГАЗ", isPopular: false }, { name: "УАЗ", isPopular: false }, { name: "Chery", isPopular: false }, { name: "Geely", isPopular: false }, { name: "Haval", isPopular: false }, { name: "Dongfeng", isPopular: false }, ]) .returning(); console.log(`✓ Created ${carBrands.length} car brands`); console.log("Creating master profiles..."); const masters = await db .insert(schema.masters) .values([ { userId: masterUsers[0].id, specialization: "Комплексный ремонт квартир", experienceYears: 15, description: "Занимаюсь ремонтом квартир более 15 лет. Выполняю все виды работ: от косметического до капитального ремонта. Работаю с проверенными материалами и современным оборудованием.", hourlyRate: "2000", isVerified: true, rating: "4.9", completedOrders: 120, latitude: "55.751244", longitude: "37.618423", }, { userId: masterUsers[1].id, specialization: "Электромонтажные работы", experienceYears: 10, description: "Профессиональный электрик с опытом работы 10 лет. Выполняю установку розеток, выключателей, светильников, замену проводки, подключение электроприборов.", hourlyRate: "1800", isVerified: true, rating: "4.8", completedOrders: 95, latitude: "55.755826", longitude: "37.617300", }, { userId: masterUsers[2].id, specialization: "Электрика и автоматика", experienceYears: 8, description: "Специализируюсь на электромонтажных работах и системах автоматизации. Установка умного дома, видеонаблюдения, домофонов.", hourlyRate: "1700", isVerified: true, rating: "4.7", completedOrders: 78, latitude: "59.939095", longitude: "30.315868", }, { userId: masterUsers[3].id, specialization: "Сантехнические работы", experienceYears: 12, description: "Выполняю все виды сантехнических работ: установка и замена смесителей, унитазов, ванн, душевых кабин. Монтаж водопровода и канализации.", hourlyRate: "1600", isVerified: true, rating: "4.9", completedOrders: 110, latitude: "55.753215", longitude: "37.622504", }, { userId: masterUsers[4].id, specialization: "Укладка плитки", experienceYears: 7, description: "Профессионально занимаюсь укладкой керамической плитки, керамогранита, мозаики. Работаю аккуратно и качественно.", hourlyRate: "1500", isVerified: false, rating: "4.6", completedOrders: 65, latitude: "55.790139", longitude: "49.134349", }, ]) .returning(); console.log(`✓ Created ${masters.length} master profiles`); console.log("Creating services..."); const services = []; services.push( ...(await db .insert(schema.services) .values([ { masterId: masters[0].id, categoryId: categories[0].id, title: "Косметический ремонт квартиры", description: "Покраска стен, поклейка обоев, замена напольного покрытия", price: "50000", durationMinutes: 4800, deliveryType: "offline", }, { masterId: masters[0].id, categoryId: categories[0].id, title: "Капитальный ремонт квартиры", description: "Полный ремонт под ключ с заменой всех коммуникаций", price: "350000", durationMinutes: 14400, deliveryType: "offline", }, { masterId: masters[1].id, categoryId: categories[1].id, title: "Установка розеток и выключателей", description: "Профессиональная установка с гарантией", price: "500", durationMinutes: 60, deliveryType: "offline", }, { masterId: masters[1].id, categoryId: categories[1].id, title: "Замена электропроводки", description: "Полная замена проводки в квартире", price: "45000", durationMinutes: 2400, deliveryType: "offline", }, { masterId: masters[2].id, categoryId: categories[1].id, title: "Установка системы умный дом", description: "Монтаж и настройка системы автоматизации", price: "35000", durationMinutes: 1200, deliveryType: "online", }, { masterId: masters[3].id, categoryId: categories[2].id, title: "Замена смесителя", description: "Демонтаж старого и установка нового смесителя", price: "1500", durationMinutes: 120, deliveryType: "offline", }, { masterId: masters[3].id, categoryId: categories[2].id, title: "Установка душевой кабины", description: "Монтаж душевой кабины с подключением к коммуникациям", price: "8000", durationMinutes: 480, deliveryType: "offline", }, { masterId: masters[4].id, categoryId: categories[3].id, title: "Укладка керамической плитки", description: "Укладка плитки в ванной или на кухне", price: "1200", durationMinutes: 480, deliveryType: "offline", }, ]) .returning()) ); console.log(`✓ Created ${services.length} services`); console.log("Creating achievements..."); const achievements = await db .insert(schema.achievements) .values([ { name: "Первый заказ", description: "Совершите свой первый заказ на платформе", icon: "🎯", points: 10, criteriaType: "orders_count", criteriaValue: 1, }, { name: "Активный клиент", description: "Совершите 5 заказов", icon: "⭐", points: 50, criteriaType: "orders_count", criteriaValue: 5, }, { name: "Постоянный клиент", description: "Совершите 10 заказов", icon: "💎", points: 100, criteriaType: "orders_count", criteriaValue: 10, }, { name: "Первый отзыв", description: "Оставьте первый отзыв о работе мастера", icon: "✍️", points: 5, criteriaType: "reviews_count", criteriaValue: 1, }, { name: "Новичок мастер", description: "Выполните первый заказ как мастер", icon: "🔨", points: 20, criteriaType: "completed_orders", criteriaValue: 1, }, { name: "Опытный мастер", description: "Выполните 10 заказов как мастер", icon: "🏆", points: 100, criteriaType: "completed_orders", criteriaValue: 10, }, { name: "Профессионал", description: "Выполните 50 заказов как мастер", icon: "👑", points: 500, criteriaType: "completed_orders", criteriaValue: 50, }, { name: "Высокий рейтинг", description: "Получите рейтинг 4.8 и выше", icon: "⭐", points: 200, criteriaType: "rating", criteriaValue: 48, }, { name: "Верифицированный мастер", description: "Пройдите верификацию на платформе", icon: "✅", points: 150, criteriaType: "verified", criteriaValue: 1, }, { name: "Щедрый клиент", description: "Потратьте более 100,000 рублей на услуги", icon: "💰", points: 300, criteriaType: "total_spent", criteriaValue: 100000, }, ]) .returning(); console.log(`✓ Created ${achievements.length} achievements`); console.log("Creating sample articles..."); const adminUser = users.find((u) => u.role === "admin")!; const articles = await db .insert(schema.articles) .values([ { authorId: adminUser.id, title: "Как выбрать мастера для ремонта квартиры", content: "При выборе мастера для ремонта важно обратить внимание на несколько ключевых факторов:\n\n1. Опыт работы - чем больше опыт, тем выше качество\n2. Портфолио - попросите показать примеры выполненных работ\n3. Отзывы - изучите отзывы других клиентов\n4. Цена - не всегда самая низкая цена означает лучшее предложение\n5. Договор - обязательно заключайте письменный договор\n\nНа платформе USLUGI.ru все мастера проходят проверку, что гарантирует качество услуг.", category: "Советы", tags: ["ремонт", "советы", "выбор мастера"], isPublished: true, status: "approved", }, { authorId: adminUser.id, title: "Электрика в квартире: что нужно знать", content: "Электрические работы требуют особого внимания к безопасности. Вот основные правила:\n\n- Всегда отключайте электричество перед началом работ\n- Используйте качественные материалы\n- Не экономьте на автоматах защиты\n- Доверяйте работу профессионалам\n\nНаши мастера имеют все необходимые допуски и сертификаты для выполнения электромонтажных работ.", category: "Электрика", tags: ["электрика", "безопасность", "ремонт"], isPublished: true, status: "approved", }, { authorId: adminUser.id, title: "Тренды в дизайне интерьера 2024", content: "В 2024 году в дизайне интерьера преобладают:\n\n- Натуральные материалы и текстуры\n- Экологичность и устойчивость\n- Минимализм с акцентами\n- Теплые природные оттенки\n- Умные технологии в доме\n\nНаши мастера помогут воплотить любые дизайнерские решения в жизнь!", category: "Дизайн", tags: ["дизайн", "интерьер", "тренды"], isPublished: true, status: "approved", }, ]) .returning(); console.log(`✓ Created ${articles.length} articles`); const autoCategory = categories.find((c) => c.name === "Авто"); const electronicsCategory = categories.find((c) => c.name === "Электроника"); console.log("Creating sample listings..."); const listings = await db .insert(schema.listings) .values([ { ownerId: users[1].id, categoryId: autoCategory!.id, title: "Toyota Camry 2018", description: "Продаю автомобиль в отличном состоянии. Один владелец, полная история обслуживания. Комплектация: кожаный салон, камера заднего вида, навигация.", price: "1850000", currency: "RUB", autoBrand: "Toyota", autoModel: "Camry", autoYear: 2018, autoMileage: 65000, condition: "good", location: "Москва, м. Проспект Мира", contactPhone: "+7 (999) 111-11-11", images: ["https://images.unsplash.com/photo-1621007947382-bb3c3994e3fb?w=800"], status: "active", }, { ownerId: users[2].id, categoryId: autoCategory!.id, title: "BMW X5 2020", description: "Топовая комплектация, все опции. Пробег небольшой, состояние отличное. Обслуживался только у официального дилера.", price: "4200000", currency: "RUB", autoBrand: "BMW", autoModel: "X5", autoYear: 2020, autoMileage: 42000, condition: "like_new", location: "Санкт-Петербург", contactPhone: "+7 (999) 222-22-22", images: ["https://images.unsplash.com/photo-1555215695-3004980ad54e?w=800"], status: "active", }, { ownerId: users[1].id, categoryId: electronicsCategory!.id, title: "iPhone 14 Pro 256GB", description: "Продаю iPhone 14 Pro в идеальном состоянии. Полный комплект, чехол в подарок. Батарея 98%.", price: "85000", currency: "RUB", condition: "like_new", location: "Москва", contactPhone: "+7 (999) 111-11-11", images: ["https://images.unsplash.com/photo-1678685888221-cda773a3dcdb?w=800"], status: "active", }, ]) .returning(); console.log(`✓ Created ${listings.length} listings`); console.log("✅ Seed completed successfully!"); console.log(` 📊 Summary: - Users: ${users.length} - Masters: ${masters.length} - Categories: ${categories.length} (${categories.filter(c => c.type === "service").length} services, ${categories.filter(c => c.type === "listing").length} listings) - Services: ${services.length} - Achievements: ${achievements.length} - Articles: ${articles.length} - Listings: ${listings.length} 🔑 Test credentials: Admin: admin@masterok.ru / password123 Client: ivan@example.ru / password123 Master: master1@example.ru / password123 `); } catch (error) { console.error("❌ Seed failed:", error); throw error; } } export { seed };