Este repositório contém o código-fonte do backend para um sistema de portfólio e blog pessoal. A API foi construída com foco em segurança, escalabilidade e boas práticas de desenvolvimento, utilizando Node.js, Express e TypeScript.
- Autenticação com JWT: Sistema seguro de registro e login usando JSON Web Tokens.
- Autorização por Nível de Acesso (RBAC): Distinção de permissões entre usuários comuns (
user) e administradores (admin). - CRUD Completo de Posts: Usuários podem criar, ler, atualizar e deletar seus próprios posts.
- CRUD Completo de Usuários: Administradores podem listar e deletar usuários.
- Upload de Imagem de Perfil: Usuários podem fazer upload de uma foto de perfil no registro e na edição, utilizando
multer. - Paginação: Listagens de posts e usuários são paginadas para melhor performance.
- Validação de Dados: Validação robusta de todas as entradas da API com Zod.
- Respostas Enriquecidas: Uso de
JOINpara incluir dados do autor nos posts, otimizando o trabalho do frontend.
A API foi construída utilizando as seguintes tecnologias e bibliotecas:
| Categoria | Tecnologias |
|---|---|
| Backend | |
| Linguagem | |
| Banco de Dados | |
| Validação | |
| Autenticação | |
| Upload de Arquivos | |
| Dev Tools |
A estrutura do projeto foi organizada visando a separação de responsabilidades, facilitando a manutenção e escalabilidade.
/
├── public/ # Arquivos públicos acessíveis pela web.
│ └── uploads/ # Onde as imagens de perfil são salvas.
├── src/ # ❤️ Coração do projeto com o código-fonte TypeScript.
│ ├── config/ # Configurações de bibliotecas (ex: multer).
│ ├── db/ # Configuração da conexão com o banco de dados.
│ ├── middleware/ # Funções que interceptam requisições (autenticação, autorização).
│ ├── routes/ # Definição de todos os endpoints da API.
│ ├── schemas/ # Schemas de validação com Zod.
│ ├── utils/ # Funções "helpers" reutilizáveis (ex: paginação).
│ └── index.ts # Ponto de entrada da aplicação que inicia o servidor.
├── .env # Arquivo com as variáveis de ambiente (segredos).
├── package.json # Define os scripts e dependências do projeto.
└── tsconfig.json # Configurações do compilador TypeScript.
Siga os passos abaixo para rodar o projeto localmente.
- Node.js (v16 ou superior)
- Uma instância do PostgreSQL rodando.
-
Clone o repositório:
git clone [https://seu-repositorio.com/projeto.git](https://seu-repositorio.com/projeto.git) cd projeto -
Instale as dependências:
npm install
-
Configure o Banco de Dados: Execute os scripts SQL que criamos para gerar as tabelas
usersepostsno seu banco de dados PostgreSQL. -
Configure as Variáveis de Ambiente: Crie um arquivo
.envna raiz do projeto e preencha com base no exemplo abaixo:# Configuração do Banco de Dados DATABASE_URL="postgresql://SEU_USUARIO:SUA_SENHA@localhost:5432/SEU_BANCO" # Configuração da Aplicação PORT=3000 APP_URL=http://localhost:3000 # Segredo para o JWT JWT_SECRET="SEU_SEGREDO_SUPER_SECRETO_E_LONGO_AQUI"
-
Rode o servidor em modo de desenvolvimento:
npm run dev
O servidor estará rodando em
http://localhost:3000.
| Endpoint | Método | Descrição | Proteção |
|---|---|---|---|
/api/register |
POST |
Registra um novo usuário com imagem opcional. | Público |
/api/login |
POST |
Autentica um usuário e retorna um token JWT. | Público |
| Endpoint | Método | Descrição | Proteção |
|---|---|---|---|
/api/users |
GET |
Lista todos os usuários (com paginação). | Admin |
/api/users/me |
PATCH |
Atualiza os dados do usuário logado (inclui imagem). | Usuário |
/api/users/:id |
DELETE |
Deleta um usuário específico. | Admin |
| Endpoint | Método | Descrição | Proteção |
|---|---|---|---|
/api/posts |
GET |
Lista todos os posts ou filtra por usuário (paginado). | Público |
/api/posts/:id |
GET |
Busca um post específico pelo seu ID. | Público |
/api/posts |
POST |
Cria um novo post. | Usuário |
/api/posts/:id |
PATCH |
Atualiza um post existente. | Dono do Post |
/api/posts/:id |
DELETE |
Deleta um post. | Dono ou Admin |
Para acessar as rotas protegidas, você deve primeiro obter um token JWT através da rota /api/login.
Após receber o token, inclua-o no cabeçalho Authorization de todas as requisições para rotas protegidas, utilizando o esquema Bearer.
Exemplo:
Authorization: Bearer seu_token_jwt_aqui