nordicstorium/scripts/migrate_and_seed.js

185 lines
6.2 KiB
JavaScript
Raw Permalink Normal View History

2026-02-02 15:09:01 +00:00
const mysql = require('mysql2/promise');
const fs = require('fs');
const path = require('path');
// Load env vars manually since we don't have dotenv
const envPath = path.resolve(__dirname, '../.env');
const envContent = fs.readFileSync(envPath, 'utf8');
const envVars = {};
envContent.split('\n').forEach(line => {
const [key, value] = line.split('=');
if (key && value) {
envVars[key.trim()] = value.trim().replace(/"/g, ''); // Remove quotes
}
});
const dbConfig = {
host: envVars.DB_HOST || 'localhost',
user: envVars.DB_USER || 'nordic_app_user',
password: envVars.DB_PASSWORD,
database: envVars.DB_NAME || 'nordic_storium',
port: parseInt(envVars.DB_PORT || '3306')
};
const categories = [
{ name: 'Kontorsstolar', image: '/assets/Images/categories/office-chair.jpg', description: 'Ergonomiska stolar för arbete' },
{ name: 'Skrivbord', image: '/assets/Images/categories/desk.jpg', description: 'Höj- och sänkbara skrivbord' },
{ name: 'Konferensmöbler', image: '/assets/Images/categories/conference.jpg', description: 'För effektiva möten' },
{ name: 'Förvaring', image: '/assets/Images/categories/storage.jpg', description: 'Skåp och hyllor' },
{ name: 'Lounge & Soffor', image: '/assets/Images/categories/lounge.jpg', description: 'Bekväm inredning för pausutrymmen' }
];
const products = [
{
name: 'Ergonomisk Kontorsstol Herman Miller',
price: 4500,
originalPrice: 12000,
image: '/assets/Images/products/herman-miller.jpg',
category: 'Kontorsstolar',
isPopular: true,
isNew: false,
created_at: '2025-11-15 10:00:00'
},
{
name: 'Höj- och sänkbart Skrivbord 160x80',
price: 2900,
originalPrice: 6500,
image: '/assets/Images/products/desk-white.jpg',
category: 'Skrivbord',
isPopular: true,
isNew: false,
created_at: '2025-12-01 10:00:00'
},
{
name: 'Konferensstol Läder Svart',
price: 1200,
originalPrice: 3500,
image: '/assets/Images/products/conf-chair.jpg',
category: 'Konferensmöbler',
isPopular: false,
isNew: true,
created_at: '2026-01-20 10:00:00'
},
{
name: 'Designsoffa 3-sits Grå',
price: 5500,
originalPrice: 15000,
image: '/assets/Images/products/sofa-grey.jpg',
category: 'Lounge & Soffor',
isPopular: true,
isNew: true,
created_at: '2026-01-25 10:00:00'
},
{
name: 'Arkivskåp Plåt Vit',
price: 1500,
originalPrice: 3000,
image: '/assets/Images/products/cabinet.jpg',
category: 'Förvaring',
isPopular: false,
isNew: true,
created_at: '2026-01-28 10:00:00'
},
{
name: 'Kinnarps 6000 Plus',
price: 1900,
originalPrice: 6000,
image: '/assets/Images/products/kinnarps.jpg',
category: 'Kontorsstolar',
isPopular: true,
isNew: false,
created_at: '2025-10-10 10:00:00'
}
];
async function main() {
let connection;
try {
console.log('Connecting to database...');
connection = await mysql.createConnection(dbConfig);
console.log('Connected!');
// 1. Alter Categories Table
console.log('Updating categories table schema...');
try {
await connection.query('ALTER TABLE categories ADD COLUMN image_url VARCHAR(255)');
console.log('Added image_url column to categories');
} catch (e) {
if (e.code !== 'ER_DUP_FIELDNAME') throw e;
console.log('image_url column already exists in categories');
}
// 2. Alter Products Table
console.log('Updating products table schema...');
const productColumns = [
'ALTER TABLE products ADD COLUMN is_popular BOOLEAN DEFAULT FALSE',
'ALTER TABLE products ADD COLUMN is_new BOOLEAN DEFAULT FALSE',
'ALTER TABLE products ADD COLUMN is_trendy BOOLEAN DEFAULT FALSE',
'ALTER TABLE products ADD COLUMN original_price DECIMAL(10, 2)'
];
for (const sql of productColumns) {
try {
await connection.query(sql);
console.log(`Executed: ${sql}`);
} catch (e) {
if (e.code !== 'ER_DUP_FIELDNAME') throw e;
console.log(`Column already exists: ${sql}`);
}
}
// 3. Clear Data
console.log('Clearing existing data...');
await connection.query('SET FOREIGN_KEY_CHECKS = 0');
await connection.query('TRUNCATE TABLE products');
await connection.query('TRUNCATE TABLE categories');
await connection.query('SET FOREIGN_KEY_CHECKS = 1');
// 4. Insert Categories
console.log('Inserting categories...');
for (const cat of categories) {
await connection.execute(
'INSERT INTO categories (name, image_url, description) VALUES (?, ?, ?)',
[cat.name, cat.image, cat.description]
);
}
// 5. Insert Products
console.log('Inserting products...');
const [catRows] = await connection.query('SELECT id, name FROM categories');
for (const prod of products) {
const cat = catRows.find(c => c.name === prod.category);
if (!cat) {
console.warn(`Category not found for product: ${prod.name}`);
continue;
}
await connection.execute(
`INSERT INTO products
(category_id, name, price, original_price, image_url, is_popular, is_new, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
[
cat.id,
prod.name,
prod.price,
prod.originalPrice,
prod.image,
prod.isPopular,
prod.isNew,
prod.created_at
]
);
}
console.log('✅ Migration and Seeding Completed Successfully!');
} catch (error) {
console.error('❌ Error:', error);
} finally {
if (connection) await connection.end();
}
}
main();