-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
189 lines (164 loc) · 5.23 KB
/
server.js
File metadata and controls
189 lines (164 loc) · 5.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
const express = require('express');
const { Pool } = require('pg');
const cors = require('cors');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 3000;
app.use(cors());
app.use(express.json());
console.log('🔧 DATABASE_URL configurada:', !!process.env.DATABASE_URL);
console.log('🔧 NODE_ENV:', process.env.NODE_ENV);
if (!process.env.DATABASE_URL) {
console.error('❌ DATABASE_URL não encontrada!');
console.error('Variáveis disponíveis:', Object.keys(process.env).filter(key => key.includes('DATA')));
process.exit(1);
}
// Pool de conexões
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
ssl: {
rejectUnauthorized: false
}
});
// Testar conexão
async function testConnection() {
try {
const client = await pool.connect();
console.log('✅ Conectado ao PostgreSQL via Pool');
await client.query(`
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
lastname VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
)
`);
console.log('📋 Tabela users verificada');
client.release();
} catch (err) {
console.error('❌ Erro de conexão:', err.message);
throw err;
}
}
// Inicializar conexão apenas uma vez
testConnection().catch(console.error);
// Rota raiz
app.get('/', (req, res) => {
res.json({
message: 'API REST Users funcionando!',
status: 'online',
endpoints: {
'GET /users': 'Listar usuários',
'GET /users/:id': 'Buscar usuário por ID',
'POST /users': 'Criar usuário',
'PUT /users/:id': 'Atualizar usuário',
'DELETE /users/:id': 'Deletar usuário'
}
});
});
// GET /users - Listar todos
app.get('/users', async (req, res) => {
try {
const result = await pool.query('SELECT * FROM users ORDER BY id');
res.json(result.rows);
} catch (err) {
console.error('Erro ao listar usuários:', err);
res.status(500).json({ error: 'Erro interno do servidor' });
}
});
// GET /users/:id - Buscar por ID
app.get('/users/:id', async (req, res) => {
try {
const result = await pool.query('SELECT * FROM users WHERE id = $1', [req.params.id]);
if (result.rows.length === 0) {
return res.status(404).json({ error: 'Usuário não encontrado' });
}
res.json(result.rows[0]);
} catch (err) {
console.error('Erro ao buscar usuário:', err);
res.status(500).json({ error: 'Erro interno do servidor' });
}
});
// POST /users - Criar usuário
app.post('/users', async (req, res) => {
const { name, lastname, email } = req.body;
if (!name || !lastname || !email) {
return res.status(400).json({
error: 'Campos obrigatórios: name, lastname, email'
});
}
try {
const result = await pool.query(
'INSERT INTO users (name, lastname, email) VALUES ($1, $2, $3) RETURNING *',
[name, lastname, email]
);
res.status(201).json(result.rows[0]);
} catch (err) {
console.error('Erro ao criar usuário:', err);
if (err.code === '23505') {
res.status(400).json({ error: 'Email já existe' });
} else {
res.status(500).json({ error: 'Erro interno do servidor' });
}
}
});
// PUT /users/:id - Atualizar usuário
app.put('/users/:id', async (req, res) => {
const { name, lastname, email } = req.body;
if (!name || !lastname || !email) {
return res.status(400).json({
error: 'Campos obrigatórios: name, lastname, email'
});
}
try {
const result = await pool.query(
'UPDATE users SET name = $1, lastname = $2, email = $3, updated_at = NOW() WHERE id = $4 RETURNING *',
[name, lastname, email, req.params.id]
);
if (result.rows.length === 0) {
return res.status(404).json({ error: 'Usuário não encontrado' });
}
res.json(result.rows[0]);
} catch (err) {
console.error('Erro ao atualizar usuário:', err);
if (err.code === '23505') {
res.status(400).json({ error: 'Email já existe' });
} else {
res.status(500).json({ error: 'Erro interno do servidor' });
}
}
});
// DELETE /users/:id - Remover usuário
app.delete('/users/:id', async (req, res) => {
try {
const result = await pool.query('DELETE FROM users WHERE id = $1 RETURNING *', [req.params.id]);
if (result.rows.length === 0) {
return res.status(404).json({ error: 'Usuário não encontrado' });
}
res.json({ message: 'Usuário removido com sucesso', user: result.rows[0] });
} catch (err) {
console.error('Erro ao deletar usuário:', err);
res.status(500).json({ error: 'Erro interno do servidor' });
}
});
// Error handler global
app.use((err, req, res, next) => {
console.error('Erro não tratado:', err);
res.status(500).json({ error: 'Erro interno do servidor' });
});
// 404 handler
app.use((req, res) => {
res.status(404).json({ error: 'Endpoint não encontrado' });
});
app.listen(port, () => {
console.log(`🚀 API rodando na porta ${port}`);
console.log(`📖 Documentação: http://localhost:${port}/`);
});
// Graceful shutdown
process.on('SIGINT', async () => {
console.log('🛑 Encerrando servidor...');
await pool.end();
process.exit(0);
});