From 1ce40fd40ac7313f643d45c2dccb6f7f74ad3ba2 Mon Sep 17 00:00:00 2001 From: shop Date: Sat, 16 May 2026 21:12:18 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20seed.js=20=D0=BD=D0=B5=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=88=D0=B0=D0=B5=D1=82=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=86=D0=B5=D1=81=D1=81=20=D0=BF=D1=80=D0=B8=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D1=83=D1=81=D0=BA=D0=B5=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit process.exit(0) при существующих товарах убивал Node до app.listen — 502 от Caddy. Co-authored-by: Cursor --- src/seed.js | 240 +++++++++++++++++++++++++++----------------------- src/server.js | 2 +- 2 files changed, 129 insertions(+), 113 deletions(-) diff --git a/src/seed.js b/src/seed.js index e92afc4..1327088 100644 --- a/src/seed.js +++ b/src/seed.js @@ -1,119 +1,135 @@ const { db } = require('./db'); -const count = db.prepare('SELECT COUNT(*) AS n FROM products').get().n; -if (count > 0) { - console.log('База уже содержит товары, пропуск seed.'); - process.exit(0); -} - -const insertCategory = db.prepare( - 'INSERT INTO categories (slug, name) VALUES (?, ?)' -); -const insertProduct = db.prepare(` - INSERT INTO products (category_id, slug, name, description, price_cents, stock, image_url) - VALUES (?, ?, ?, ?, ?, ?, ?) -`); - -const categories = [ - { slug: 'electronics', name: 'Электроника' }, - { slug: 'clothing', name: 'Одежда' }, - { slug: 'home', name: 'Дом и быт' }, -]; - -const categoryIds = {}; -const seed = db.transaction(() => { - for (const c of categories) { - const r = insertCategory.run(c.slug, c.name); - categoryIds[c.slug] = r.lastInsertRowid; +function runSeed() { + const count = db.prepare('SELECT COUNT(*) AS n FROM products').get().n; + if (count > 0) { + console.log('База уже содержит товары, пропуск seed.'); + return; } - const products = [ - { - cat: 'electronics', - slug: 'wireless-headphones', - name: 'Беспроводные наушники', - description: 'Шумоподавление, 30 ч автономности, Bluetooth 5.3.', - price: 499000, - stock: 24, - image: 'https://images.unsplash.com/photo-1505740420928-5e560c06d30e?w=400&h=400&fit=crop', - }, - { - cat: 'electronics', - slug: 'smart-watch', - name: 'Умные часы', - description: 'Пульс, GPS, водозащита IP68.', - price: 1299000, - stock: 15, - image: 'https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=400&h=400&fit=crop', - }, - { - cat: 'electronics', - slug: 'mechanical-keyboard', - name: 'Механическая клавиатура', - description: 'Hot-swap, RGB подсветка, переключатели Brown.', - price: 749000, - stock: 18, - image: 'https://images.unsplash.com/photo-1587829741301-dc798b83add3?w=400&h=400&fit=crop', - }, - { - cat: 'clothing', - slug: 'cotton-tshirt', - name: 'Хлопковая футболка', - description: '100% хлопок, унисекс, размеры S–XL.', - price: 199000, - stock: 50, - image: 'https://images.unsplash.com/photo-1521572163474-6864f9cf17ab?w=400&h=400&fit=crop', - }, - { - cat: 'clothing', - slug: 'denim-jacket', - name: 'Джинсовая куртка', - description: 'Классический крой, прочный деним.', - price: 459000, - stock: 12, - image: 'https://images.unsplash.com/photo-1551028711-00167b16eac5?w=400&h=400&fit=crop', - }, - { - cat: 'home', - slug: 'ceramic-mug', - name: 'Керамическая кружка', - description: 'Объём 350 мл, подходит для посудомойки.', - price: 89000, - stock: 40, - image: 'https://images.unsplash.com/photo-1514228742587-6b1558fcca13?w=400&h=400&fit=crop', - }, - { - cat: 'home', - slug: 'desk-lamp', - name: 'Настольная лампа', - description: 'LED, регулировка яркости и цветовой температуры.', - price: 329000, - stock: 20, - image: 'https://images.unsplash.com/photo-1507473885765-e6ed057f782c?w=400&h=400&fit=crop', - }, - { - cat: 'home', - slug: 'throw-blanket', - name: 'Плед', - description: 'Мягкий флис, 150×200 см.', - price: 249000, - stock: 30, - image: 'https://images.unsplash.com/photo-1555041469-a586c12e1940?w=400&h=400&fit=crop', - }, + const insertCategory = db.prepare( + 'INSERT INTO categories (slug, name) VALUES (?, ?)' + ); + const insertProduct = db.prepare(` + INSERT INTO products (category_id, slug, name, description, price_cents, stock, image_url) + VALUES (?, ?, ?, ?, ?, ?, ?) + `); + + const categories = [ + { slug: 'electronics', name: 'Электроника' }, + { slug: 'clothing', name: 'Одежда' }, + { slug: 'home', name: 'Дом и быт' }, ]; - for (const p of products) { - insertProduct.run( - categoryIds[p.cat], - p.slug, - p.name, - p.description, - p.price, - p.stock, - p.image - ); - } -}); + const categoryIds = {}; + const seed = db.transaction(() => { + for (const c of categories) { + const r = insertCategory.run(c.slug, c.name); + categoryIds[c.slug] = r.lastInsertRowid; + } -seed(); -console.log('Добавлено категорий:', categories.length, ', товаров: 8'); + const products = [ + { + cat: 'electronics', + slug: 'wireless-headphones', + name: 'Беспроводные наушники', + description: 'Шумоподавление, 30 ч автономности, Bluetooth 5.3.', + price: 499000, + stock: 24, + image: + 'https://images.unsplash.com/photo-1505740420928-5e560c06d30e?w=400&h=400&fit=crop', + }, + { + cat: 'electronics', + slug: 'smart-watch', + name: 'Умные часы', + description: 'Пульс, GPS, водозащита IP68.', + price: 1299000, + stock: 15, + image: + 'https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=400&h=400&fit=crop', + }, + { + cat: 'electronics', + slug: 'mechanical-keyboard', + name: 'Механическая клавиатура', + description: 'Hot-swap, RGB подсветка, переключатели Brown.', + price: 749000, + stock: 18, + image: + 'https://images.unsplash.com/photo-1587829741301-dc798b83add3?w=400&h=400&fit=crop', + }, + { + cat: 'clothing', + slug: 'cotton-tshirt', + name: 'Хлопковая футболка', + description: '100% хлопок, унисекс, размеры S–XL.', + price: 199000, + stock: 50, + image: + 'https://images.unsplash.com/photo-1521572163474-6864f9cf17ab?w=400&h=400&fit=crop', + }, + { + cat: 'clothing', + slug: 'denim-jacket', + name: 'Джинсовая куртка', + description: 'Классический крой, прочный деним.', + price: 459000, + stock: 12, + image: + 'https://images.unsplash.com/photo-1551028711-00167b16eac5?w=400&h=400&fit=crop', + }, + { + cat: 'home', + slug: 'ceramic-mug', + name: 'Керамическая кружка', + description: 'Объём 350 мл, подходит для посудомойки.', + price: 89000, + stock: 40, + image: + 'https://images.unsplash.com/photo-1514228742587-6b1558fcca13?w=400&h=400&fit=crop', + }, + { + cat: 'home', + slug: 'desk-lamp', + name: 'Настольная лампа', + description: 'LED, регулировка яркости и цветовой температуры.', + price: 329000, + stock: 20, + image: + 'https://images.unsplash.com/photo-1507473885765-e6ed057f782c?w=400&h=400&fit=crop', + }, + { + cat: 'home', + slug: 'throw-blanket', + name: 'Плед', + description: 'Мягкий флис, 150×200 см.', + price: 249000, + stock: 30, + image: + 'https://images.unsplash.com/photo-1555041469-a586c12e1940?w=400&h=400&fit=crop', + }, + ]; + + for (const p of products) { + insertProduct.run( + categoryIds[p.cat], + p.slug, + p.name, + p.description, + p.price, + p.stock, + p.image + ); + } + }); + + seed(); + console.log('Добавлено категорий:', categories.length, ', товаров: 8'); +} + +module.exports = { runSeed }; + +if (require.main === module) { + runSeed(); +} diff --git a/src/server.js b/src/server.js index 3cd1b7f..8277668 100644 --- a/src/server.js +++ b/src/server.js @@ -4,7 +4,7 @@ const session = require('express-session'); const SQLiteStore = require('connect-sqlite3')(session); require('./db'); -require('./seed'); +require('./seed').runSeed(); const { loadUser } = require('./middleware/auth'); const healthRoutes = require('./routes/health');