hotschpotsh/Pottery-website/server/index.js

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}`);
});