- Added menu generator page with existing menu loading and selection. - Enhanced menus management page with editing capabilities and improved table layout. - Updated booking page to allow for menu and package data fetching. - Integrated Tailwind CSS line-clamp plugin for better text handling. - Created a migration script for initializing ingredients database. - Developed ingredients management page with search, filter, and CRUD operations. - Implemented API routes for ingredients with proper error handling and logging.
85 lines
3.4 KiB
JavaScript
85 lines
3.4 KiB
JavaScript
import mysql from 'mysql2/promise';
|
|
import dotenv from 'dotenv';
|
|
|
|
dotenv.config();
|
|
|
|
const pool = mysql.createPool({
|
|
host: process.env.DB_HOST,
|
|
user: process.env.DB_USER,
|
|
password: process.env.DB_PASSWORD,
|
|
database: process.env.DB_NAME,
|
|
waitForConnections: true,
|
|
connectionLimit: 10,
|
|
});
|
|
|
|
async function migrateIngredients() {
|
|
console.log('=== Creating ingredients table ===');
|
|
|
|
try {
|
|
// Create ingredients table
|
|
await pool.query(`
|
|
CREATE TABLE IF NOT EXISTS ingredients (
|
|
id VARCHAR(100) PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
category VARCHAR(100),
|
|
unit VARCHAR(50) NOT NULL,
|
|
price_per_unit DECIMAL(10, 2) NOT NULL,
|
|
supplier VARCHAR(255),
|
|
notes TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
)
|
|
`);
|
|
|
|
console.log('✓ Ingredients table created');
|
|
|
|
// Add some default ingredients
|
|
const defaultIngredients = [
|
|
{ id: 'kartofler', name: 'Kartofler', category: 'Grøntsager', unit: 'kg', price: 15.00, supplier: 'Lokal' },
|
|
{ id: 'tomat', name: 'Tomater', category: 'Grøntsager', unit: 'kg', price: 25.00, supplier: 'Lokal' },
|
|
{ id: 'loeg', name: 'Løg', category: 'Grøntsager', unit: 'kg', price: 12.00, supplier: 'Lokal' },
|
|
{ id: 'hvidloeg', name: 'Hvidløg', category: 'Grøntsager', unit: 'stk', price: 3.00, supplier: 'Lokal' },
|
|
{ id: 'oksekoed', name: 'Oksekød', category: 'Kød', unit: 'kg', price: 120.00, supplier: 'Slagter' },
|
|
{ id: 'kylling', name: 'Kylling', category: 'Kød', unit: 'kg', price: 60.00, supplier: 'Slagter' },
|
|
{ id: 'laks', name: 'Laks', category: 'Fisk', unit: 'kg', price: 180.00, supplier: 'Fiskehandler' },
|
|
{ id: 'smor', name: 'Smør', category: 'Mejeriprodukter', unit: 'kg', price: 50.00, supplier: 'Supermarked' },
|
|
{ id: 'fløde', name: 'Fløde', category: 'Mejeriprodukter', unit: 'liter', price: 25.00, supplier: 'Supermarked' },
|
|
{ id: 'parmesan', name: 'Parmesan', category: 'Mejeriprodukter', unit: 'kg', price: 150.00, supplier: 'Supermarked' },
|
|
{ id: 'olivenolie', name: 'Olivenolie', category: 'Olier & Eddiker', unit: 'liter', price: 60.00, supplier: 'Supermarked' },
|
|
{ id: 'salt', name: 'Salt', category: 'Krydderier', unit: 'kg', price: 15.00, supplier: 'Supermarked' },
|
|
{ id: 'peber', name: 'Peber', category: 'Krydderier', unit: 'kg', price: 120.00, supplier: 'Supermarked' },
|
|
];
|
|
|
|
for (const ing of defaultIngredients) {
|
|
await pool.query(`
|
|
INSERT INTO ingredients (id, name, category, unit, price_per_unit, supplier)
|
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
ON DUPLICATE KEY UPDATE
|
|
name = VALUES(name),
|
|
category = VALUES(category),
|
|
unit = VALUES(unit),
|
|
price_per_unit = VALUES(price_per_unit),
|
|
supplier = VALUES(supplier)
|
|
`, [ing.id, ing.name, ing.category, ing.unit, ing.price, ing.supplier]);
|
|
}
|
|
|
|
console.log(`✓ ${defaultIngredients.length} default ingredients inserted`);
|
|
|
|
} catch (error) {
|
|
console.error('❌ Migration error:', error);
|
|
throw error;
|
|
} finally {
|
|
await pool.end();
|
|
}
|
|
}
|
|
|
|
migrateIngredients()
|
|
.then(() => {
|
|
console.log('✅ Migration complete');
|
|
process.exit(0);
|
|
})
|
|
.catch((error) => {
|
|
console.error('❌ Migration failed:', error);
|
|
process.exit(1);
|
|
});
|