-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
118 lines (97 loc) · 3.09 KB
/
server.js
File metadata and controls
118 lines (97 loc) · 3.09 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
const express = require('express');
const http = require('http');
const { Pool } = require('pg');
const socketIo = require('socket.io');
const cors = require('cors');
require('dotenv').config();
const app = express();
const server = http.createServer(app);
app.use(cors({ origin: true }));
app.use(express.json());
const io = socketIo(server, {
cors: {
origin: true,
methods: ["GET", "POST"]
}
});
const PORT = process.env.PORT || 3000;
// DB
const pool = process.env.DATABASE_URL
? new Pool({ connectionString: process.env.DATABASE_URL })
: new Pool({
user: process.env.DB_USER,
host: process.env.DB_HOST,
database: process.env.DB_NAME,
password: String(process.env.DB_PASSWORD ?? ''), // garante string
port: Number(process.env.DB_PORT),
});
// Testa DB no boot (opcional)
pool.query('SELECT 1')
.then(() => console.log('DB OK'))
.catch((err) => console.error('DB FAIL:', err.message));
// Rotas
app.get('/', (req, res) => res.send('Servidor está funcionando'));
app.get('/health', async (req, res) => {
try {
await pool.query('SELECT 1');
res.status(200).json({ ok: true });
} catch (err) {
res.status(500).json({ ok: false, error: 'db_error', detail: err.message });
}
});
app.post('/user/register', (req, res) => {
// mock por enquanto
res.status(201).json({ ok: true, received: req.body });
});
app.post('/messages', async (req, res) => {
const { conteudo } = req.body;
if (!conteudo || typeof conteudo !== 'string' || conteudo.trim().length < 1) {
return res.status(400).json({ error: 'invalid_conteudo' });
}
try {
const result = await pool.query(
'INSERT INTO mensagens (conteudo, criado_em) VALUES ($1, NOW()) RETURNING id, conteudo, criado_em',
[conteudo.trim()]
);
res.status(201).json(result.rows[0]);
} catch (err) {
console.error('DB insert error:', err);
res.status(500).json({ error: 'db_error', detail: err.message });
}
});
app.get('/messages', async (req, res) => {
const limitRaw = req.query.limit ?? '50';
const limit = Math.max(1, Math.min(200, Number(limitRaw) || 50));
try {
const result = await pool.query(
'SELECT id, conteudo, criado_em FROM mensagens ORDER BY criado_em DESC LIMIT $1',
[limit]
);
res.json(result.rows);
} catch (err) {
console.error('DB select error:', err);
res.status(500).json({ error: 'db_error', detail: err.message });
}
});
// Socket.IO
io.on('connection', (socket) => {
console.log('Novo cliente conectado:', socket.id);
socket.on('chatMessage', async (msg) => {
if (!msg || typeof msg !== 'string') return;
const conteudo = msg.trim();
if (!conteudo) return;
try {
await pool.query(
'INSERT INTO mensagens (conteudo, criado_em) VALUES ($1, NOW())',
[conteudo]
);
} catch (err) {
console.error('Erro ao salvar mensagem:', err.message);
}
io.emit('chatMessage', conteudo);
});
socket.on('disconnect', () => {
console.log('Cliente desconectado:', socket.id);
});
});
server.listen(PORT, () => console.log(`Servidor rodando na porta ${PORT}`));