71 lines
1.7 KiB
JavaScript
71 lines
1.7 KiB
JavaScript
const express = require('express');
|
|
const { Client } = require('pg');
|
|
const bodyParser = require('body-parser');
|
|
const path = require('path');
|
|
require('dotenv').config();
|
|
|
|
const app = express();
|
|
const port = 3000;
|
|
|
|
// Middleware
|
|
app.use(bodyParser.json());
|
|
app.use(express.static('public'));
|
|
|
|
// PostgreSQL config
|
|
const client = new Client({
|
|
host: process.env.DB_HOST,
|
|
port: process.env.DB_PORT,
|
|
user: process.env.DB_USER,
|
|
password: process.env.DB_PASSWORD,
|
|
database: process.env.DB_NAME
|
|
});
|
|
|
|
client.connect()
|
|
.then(() => {
|
|
console.log('Connected to PostgreSQL');
|
|
return client.query(`
|
|
CREATE TABLE IF NOT EXISTS todos (
|
|
id SERIAL PRIMARY KEY,
|
|
text VARCHAR(255) NOT NULL,
|
|
completed BOOLEAN DEFAULT false
|
|
);
|
|
`);
|
|
})
|
|
.then(() => console.log('Table ready'))
|
|
.catch(err => console.error('DB error:', err));
|
|
|
|
app.get('/api/todos', async (req, res) => {
|
|
try {
|
|
const result = await client.query('SELECT * FROM todos ORDER BY id DESC');
|
|
res.json(result.rows);
|
|
} catch (err) {
|
|
res.status(500).send('Error fetching todos');
|
|
}
|
|
});
|
|
|
|
app.post('/api/todos', async (req, res) => {
|
|
const { text } = req.body;
|
|
if (!text) return res.status(400).send('Missing todo text');
|
|
try {
|
|
await client.query('INSERT INTO todos (text) VALUES ($1)', [text]);
|
|
res.status(201).send('Todo added');
|
|
} catch (err) {
|
|
res.status(500).send('Error adding todo');
|
|
}
|
|
});
|
|
|
|
app.delete('/api/todos/:id', async (req, res) => {
|
|
const { id } = req.params;
|
|
try {
|
|
await client.query('DELETE FROM todos WHERE id = $1', [id]);
|
|
res.send('Todo deleted');
|
|
} catch (err) {
|
|
res.status(500).send('Error deleting todo');
|
|
}
|
|
});
|
|
|
|
app.listen(port, () => {
|
|
console.log(`Todo app listening at http://localhost:${port}`);
|
|
});
|
|
|