Nesta aula, vamos modularizar o nosso projeto para separá-lo em rotas, controllers e a configuração do banco de dados, proporcionando uma organização mais clara e facilitando a manutenção.
routes: para definir as rotas da API.controllers: para a lógica de cada rota.config: para a configuração do banco de dados.src/
│
├── config/
│ └── database.ts
│
├── controllers/
│ └── userController.ts
│
├── routes/
│ └── userRoutes.ts
│
├── migrations/
│ └── migrations.ts
│
├── server.ts
config/database.tsVamos mover a configuração do banco de dados para a pasta config:
import { Pool } from 'pg';
// Substitua pela sua string de conexão do Render.com
const connectionString = 'sua_string_de_conexao_do_render_aqui';
const pool = new Pool({
connectionString,
ssl: {
rejectUnauthorized: false, // Permite conexões SSL não autorizadas
}
});
export default pool;
controllers/userController.tsAgora, a lógica das rotas será movida para o controller. Este arquivo lidará com as requisições e interações com o banco de dados:
import { Request, Response } from 'express';
import pool from '../config/database';
// Função para obter todos os usuários
export const getUsers = async (req: Request, res: Response) => {
try {
const { rows } = await pool.query('SELECT * FROM users');
res.status(200).json(rows);
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Erro ao buscar usuários' });
}
};
// Função para adicionar um novo usuário
export const addUser = async (req: Request, res: Response) => {
const { name, email } = req.body;
try {
const queryText = 'INSERT INTO users(name, email) VALUES($1, $2) RETURNING *';
const { rows } = await pool.query(queryText, [name, email]);
res.status(201).json(rows[0]);
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Erro ao adicionar usuário' });
}
};
routes/userRoutes.tsAs rotas serão movidas para a pasta routes. Aqui, simplesmente vincularemos as rotas com seus respectivos controllers:
import { Router } from 'express';
import { getUsers, addUser } from '../controllers/userController';
const router = Router();
router.get('/users', getUsers);
router.post('/users', addUser);
export default router;
src/server.tsAgora vamos atualizar o arquivo do servidor para utilizar as novas rotas:
import express from 'express';
import userRoutes from './routes/userRoutes';
const app = express();
const PORT = process.env.PORT || 3000;
app.use(express.json());
// Utilizando as rotas de usuários
app.use(userRoutes);
app.listen(PORT, () => {
console.log(`Servidor rodando na porta ${PORT}`);
});