const express = require('express'); const { getPool } = require('../utils/db'); const dotenv = require('dotenv'); const path = require('path'); dotenv.config({ path: path.join(__dirname, "../../.env") }); const router = express.Router(); // Get all templates router.get('/', async (req, res) => { try { const pool = getPool(); if (!pool) { throw new Error('Database pool not initialized'); } const result = await pool.query(` SELECT * FROM templates ORDER BY company ASC, product_type ASC `); res.json(result.rows); } catch (error) { console.error('Error fetching templates:', error); res.status(500).json({ error: 'Failed to fetch templates', details: error instanceof Error ? error.message : 'Unknown error' }); } }); // Get template by company and product type router.get('/:company/:productType', async (req, res) => { try { const { company, productType } = req.params; const pool = getPool(); if (!pool) { throw new Error('Database pool not initialized'); } const result = await pool.query(` SELECT * FROM templates WHERE company = $1 AND product_type = $2 `, [company, productType]); if (result.rows.length === 0) { return res.status(404).json({ error: 'Template not found' }); } res.json(result.rows[0]); } catch (error) { console.error('Error fetching template:', error); res.status(500).json({ error: 'Failed to fetch template', details: error instanceof Error ? error.message : 'Unknown error' }); } }); // Create new template router.post('/', async (req, res) => { try { const { company, product_type, supplier, msrp, cost_each, qty_per_unit, case_qty, hts_code, description, weight, length, width, height, tax_cat, size_cat, categories, ship_restrictions } = req.body; // Validate required fields if (!company || !product_type) { return res.status(400).json({ error: 'Company and Product Type are required' }); } const pool = getPool(); if (!pool) { throw new Error('Database pool not initialized'); } const result = await pool.query(` INSERT INTO templates ( company, product_type, supplier, msrp, cost_each, qty_per_unit, case_qty, hts_code, description, weight, length, width, height, tax_cat, size_cat, categories, ship_restrictions ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) RETURNING * `, [ company, product_type, supplier, msrp, cost_each, qty_per_unit, case_qty, hts_code, description, weight, length, width, height, tax_cat, size_cat, categories, ship_restrictions ]); res.status(201).json(result.rows[0]); } catch (error) { console.error('Error creating template:', error); // Check for unique constraint violation if (error instanceof Error && error.message.includes('unique constraint')) { return res.status(409).json({ error: 'Template already exists for this company and product type', details: error.message }); } res.status(500).json({ error: 'Failed to create template', details: error instanceof Error ? error.message : 'Unknown error' }); } }); // Update template router.put('/:id', async (req, res) => { try { const { id } = req.params; const { company, product_type, supplier, msrp, cost_each, qty_per_unit, case_qty, hts_code, description, weight, length, width, height, tax_cat, size_cat, categories, ship_restrictions } = req.body; // Validate required fields if (!company || !product_type) { return res.status(400).json({ error: 'Company and Product Type are required' }); } const pool = getPool(); if (!pool) { throw new Error('Database pool not initialized'); } const result = await pool.query(` UPDATE templates SET company = $1, product_type = $2, supplier = $3, msrp = $4, cost_each = $5, qty_per_unit = $6, case_qty = $7, hts_code = $8, description = $9, weight = $10, length = $11, width = $12, height = $13, tax_cat = $14, size_cat = $15, categories = $16, ship_restrictions = $17 WHERE id = $18 RETURNING * `, [ company, product_type, supplier, msrp, cost_each, qty_per_unit, case_qty, hts_code, description, weight, length, width, height, tax_cat, size_cat, categories, ship_restrictions, id ]); if (result.rows.length === 0) { return res.status(404).json({ error: 'Template not found' }); } res.json(result.rows[0]); } catch (error) { console.error('Error updating template:', error); // Check for unique constraint violation if (error instanceof Error && error.message.includes('unique constraint')) { return res.status(409).json({ error: 'Template already exists for this company and product type', details: error.message }); } res.status(500).json({ error: 'Failed to update template', details: error instanceof Error ? error.message : 'Unknown error' }); } }); // Delete template router.delete('/:id', async (req, res) => { try { const { id } = req.params; const pool = getPool(); if (!pool) { throw new Error('Database pool not initialized'); } const result = await pool.query('DELETE FROM templates WHERE id = $1 RETURNING *', [id]); if (result.rows.length === 0) { return res.status(404).json({ error: 'Template not found' }); } res.json({ message: 'Template deleted successfully' }); } catch (error) { console.error('Error deleting template:', error); res.status(500).json({ error: 'Failed to delete template', details: error instanceof Error ? error.message : 'Unknown error' }); } }); // Error handling middleware router.use((err, req, res, next) => { console.error('Template route error:', err); res.status(500).json({ error: 'Internal server error', details: err.message }); }); module.exports = router;