181 lines
6.6 KiB
JavaScript
181 lines
6.6 KiB
JavaScript
const express = require('express');
|
|
const { Pool } = require('pg');
|
|
const cors = require('cors');
|
|
require('dotenv').config();
|
|
|
|
const app = express();
|
|
const port = process.env.PORT || 5000;
|
|
|
|
// Middleware
|
|
app.use(cors());
|
|
app.use(express.json({ limit: '50mb' }));
|
|
app.use(express.urlencoded({ limit: '50mb', extended: true }));
|
|
|
|
// Database Connection
|
|
const pool = new Pool({
|
|
user: process.env.DB_USER,
|
|
host: process.env.DB_HOST,
|
|
database: process.env.DB_NAME,
|
|
password: process.env.DB_PASSWORD,
|
|
port: process.env.DB_PORT,
|
|
});
|
|
|
|
pool.on('error', (err) => {
|
|
console.error('Unexpected error on idle client', err);
|
|
process.exit(-1);
|
|
});
|
|
|
|
// Routes
|
|
|
|
// --- PRODUCTS ---
|
|
app.get('/api/products', async (req, res) => {
|
|
try {
|
|
const result = await pool.query('SELECT id, title, price, image, description, gallery as images, slug, number, aspect_ratio as "aspectRatio", details FROM products ORDER BY id ASC');
|
|
res.json(result.rows);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
});
|
|
|
|
app.post('/api/products', async (req, res) => {
|
|
const { title, price, image, description, images, slug, number, aspectRatio, details } = req.body;
|
|
try {
|
|
const result = await pool.query(
|
|
'INSERT INTO products (title, price, image, description, gallery, slug, number, aspect_ratio, details) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING id, title, price, image, description, gallery as images, slug, number, aspect_ratio as "aspectRatio", details',
|
|
[title, price, image, description, JSON.stringify(images), slug, number, aspectRatio, JSON.stringify(details || [])]
|
|
);
|
|
res.status(201).json(result.rows[0]);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
});
|
|
|
|
app.put('/api/products/:id', async (req, res) => {
|
|
const { id } = req.params;
|
|
const { title, price, image, description, images, slug, number, aspectRatio, details } = req.body;
|
|
try {
|
|
const result = await pool.query(
|
|
'UPDATE products SET title = $1, price = $2, image = $3, description = $4, gallery = $5, slug = $6, number = $7, aspect_ratio = $8, details = $9 WHERE id = $10 RETURNING id, title, price, image, description, gallery as images, slug, number, aspect_ratio as "aspectRatio", details',
|
|
[title, price, image, description, JSON.stringify(images), slug, number, aspectRatio, JSON.stringify(details || []), id]
|
|
);
|
|
res.json(result.rows[0]);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
});
|
|
|
|
app.delete('/api/products/:id', async (req, res) => {
|
|
const { id } = req.params;
|
|
try {
|
|
await pool.query('DELETE FROM products WHERE id = $1', [id]);
|
|
res.json({ message: 'Product deleted' });
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
});
|
|
|
|
// --- ARTICLES ---
|
|
app.get('/api/articles', async (req, res) => {
|
|
try {
|
|
const result = await pool.query('SELECT id, title, date, image, sections, slug, category, description, is_featured as "isFeatured" FROM articles ORDER BY id ASC');
|
|
res.json(result.rows);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
});
|
|
|
|
app.post('/api/articles', async (req, res) => {
|
|
const { title, date, image, sections, slug, category, description, isFeatured } = req.body;
|
|
try {
|
|
if (isFeatured) {
|
|
await pool.query('UPDATE articles SET is_featured = FALSE');
|
|
}
|
|
const result = await pool.query(
|
|
'INSERT INTO articles (title, date, image, sections, slug, category, description, is_featured) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id, title, date, image, sections, slug, category, description, is_featured as "isFeatured"',
|
|
[title, date, image, JSON.stringify(sections), slug, category, description, !!isFeatured]
|
|
);
|
|
res.status(201).json(result.rows[0]);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
});
|
|
|
|
app.put('/api/articles/:id', async (req, res) => {
|
|
const { id } = req.params;
|
|
const { title, date, image, sections, slug, category, description, isFeatured } = req.body;
|
|
try {
|
|
if (isFeatured) {
|
|
await pool.query('UPDATE articles SET is_featured = FALSE');
|
|
}
|
|
const result = await pool.query(
|
|
'UPDATE articles SET title = $1, date = $2, image = $3, sections = $4, slug = $5, category = $6, description = $7, is_featured = $8 WHERE id = $9 RETURNING id, title, date, image, sections, slug, category, description, is_featured as "isFeatured"',
|
|
[title, date, image, JSON.stringify(sections), slug, category, description, !!isFeatured, id]
|
|
);
|
|
res.json(result.rows[0]);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
});
|
|
|
|
app.delete('/api/articles/:id', async (req, res) => {
|
|
const { id } = req.params;
|
|
try {
|
|
await pool.query('DELETE FROM articles WHERE id = $1', [id]);
|
|
res.json({ message: 'Article deleted' });
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
});
|
|
|
|
// Orders API
|
|
app.get('/api/orders', async (req, res) => {
|
|
try {
|
|
const result = await pool.query('SELECT * FROM orders ORDER BY created_at DESC');
|
|
res.json(result.rows);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
});
|
|
|
|
app.post('/api/orders', async (req, res) => {
|
|
const { customer_email, customer_name, shipping_address, items, total_amount } = req.body;
|
|
try {
|
|
const result = await pool.query(
|
|
'INSERT INTO orders (customer_email, customer_name, shipping_address, items, total_amount, payment_status) VALUES ($1, $2, $3, $4, $5, $6) RETURNING *',
|
|
[customer_email, customer_name, JSON.stringify(shipping_address), JSON.stringify(items), total_amount, 'paid']
|
|
);
|
|
res.status(201).json(result.rows[0]);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
});
|
|
|
|
app.put('/api/orders/:id/status', async (req, res) => {
|
|
const { id } = req.params;
|
|
const { shipping_status } = req.body;
|
|
try {
|
|
const result = await pool.query(
|
|
'UPDATE orders SET shipping_status = $1 WHERE id = $2 RETURNING *',
|
|
[shipping_status, id]
|
|
);
|
|
res.json(result.rows[0]);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
});
|
|
|
|
app.listen(port, () => {
|
|
console.log(`Server running on port ${port}`);
|
|
});
|