██╗ ██╗██████╗ ██████╗ █████╗ ██████╗ ██╗ ██╗ █████╗ ██████╗ ██╗ ██║ ██║██╔══██╗██╔══██╗██╔══██╗██╔══██╗╚██╗ ██╔╝ ██╔══██╗██╔══██╗██║ ██║ ██║██████╔╝██████╔╝███████║██████╔╝ ╚████╔╝ ███████║██████╔╝██║ ██║ ██║██╔══██╗██╔══██╗██╔══██║██╔══██╗ ╚██╔╝ ██╔══██║██╔═══╝ ██║ ███████╗██║██████╔╝██║ ██║██║ ██║██║ ██║ ██║ ██║ ██║██║ ██║ ╚══════╝╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝
API REST completa, desenvolvida com Node.js e Express, para a criação e gerenciamento de uma biblioteca de livros pessoal. A aplicação utiliza MySQL para persistência de dados e possui um sistema de autenticação seguro baseado em tokens JWT para proteger as rotas.
- Registro: Criação de novos usuários com nome, e-mail e senha. O e-mail é único e a senha é armazenada de forma segura com hash (bcryptjs).
- Autenticação: Login de usuários com e-mail e senha, retornando um token JWT com expiração de 1 hora.
- Gerenciamento de Perfil: Usuários autenticados podem visualizar, atualizar e excluir suas próprias contas.
- Segurança: Acesso a rotas de perfil e livros protegido por middleware de autenticação JWT.
- CRUD Completo: Usuários autenticados podem cadastrar, listar, editar e excluir seus livros.
- Validações e Regras de Negócio:
- Campos obrigatórios:
título
,autor
,ano
egênero
. - O título do livro deve ter no mínimo 2 caracteres e o ano de publicação não pode ser no futuro.
- Um usuário não pode cadastrar o mesmo livro (título e autor) duas vezes.
- Limite total: Máximo de 5 livros por usuário.
- Limite por gênero: Máximo de 2 livros de "Biography" e 3 de "Science Fiction".
- Campos obrigatórios:
- Listagem Avançada: A rota de listagem de livros suporta:
- Filtros: por
autor
,gênero
,ano
estatus
. - Ordenação: por qualquer campo principal, em ordem ascendente (
asc
) ou descendente (desc
).
- Filtros: por
O projeto utiliza um banco de dados MySQL para armazenar os dados dos usuários e livros. A estrutura do banco de dados pode ser visualizada aqui.
Este projeto atende a todas as funcionalidades descritas no arquivo de desafio.
- Backend: Node.js
- Framework: Express.js
- Banco de Dados: MySQL
- Autenticação: JSON Web Tokens (JWT)
- Criptografia de Senhas: BcryptJS
- Driver MySQL: mysql2
- Documentação da API: Swagger (via
swagger-ui-express
) - Variáveis de Ambiente: Dotenv
-
Clone o repositório:
git clone https://github.com/ianfelps/library_api.git cd library_api
-
Instale as dependências:
npm install
-
Configure o Banco de Dados:
- Acesse seu servidor MySQL.
- Execute o script SQL para criar o schema e as tabelas:
database/Library_DB.sql
. - O script já inclui a relação
ON DELETE CASCADE
, que remove os livros de um usuário quando a conta é excluída.
-
Configure as Variáveis de Ambiente:
- Crie um arquivo
.env
na raiz do projeto a partir do exemplo.env.example
.
# Configurações do Servidor PORT=3000 # Configurações do Banco de Dados DB_HOST=localhost DB_USER=seu_usuario_mysql DB_PASSWORD=sua_senha_mysql DB_NAME=Library_DB # Segredo para o JWT JWT_SECRET=seu_segredo_super_secreto_aqui # Configurações de URL URL=http://localhost:3000
- Crie um arquivo
-
Adicione o script de "start" (Recomendado):
- No seu arquivo
package.json
, adicione a linha"start": "node app.js"
dentro do objeto"scripts"
:
"scripts": { "start": "node app.js", "test": "echo \"Error: no test specified\" && exit 1" },
- No seu arquivo
-
Inicie o servidor:
npm start
-
Acesse a API:
- Servidor:
http://localhost:3000/api
- Documentação Interativa (Swagger):
http://localhost:3000/api-docs
- Servidor:
A documentação completa e interativa, com todos os detalhes sobre os endpoints, schemas e exemplos, está disponível através do Swagger UI.
Método | Endpoint | Descrição | Requer Autenticação |
---|---|---|---|
POST |
/users/register |
Registra um novo usuário. | Não |
POST |
/users/login |
Realiza o login e obtém um token JWT. | Não |
GET |
/users/me |
Obtém os dados do usuário logado. | Sim |
PUT |
/users/edit |
Atualiza os dados do usuário logado. | Sim |
DELETE |
/users/delete |
Deleta o usuário e todos os seus dados. | Sim |
POST |
/books/register |
Cadastra um novo livro. | Sim |
GET |
/books/list |
Lista e filtra os livros do usuário. | Sim |
PUT |
/books/edit/{id_book} |
Edita um livro específico. | Sim |
DELETE |
/books/delete/{id_book} |
Deleta um livro específico. | Sim |
O deploy desta aplicação foi realizado utilizando os seguintes serviços:
- Backend (Node.js/Express): Hospedado na plataforma Render, que gerencia o deploy contínuo a partir do repositório no GitHub.
- Banco de Dados (MySQL): Hospedado na Clever Cloud, garantindo um banco de dados relacional estável e seguro.
As variáveis de ambiente (DB_HOST
, JWT_SECRET
, etc.) foram configuradas diretamente nos painéis de serviço da Render para garantir a segurança das credenciais.
A API está disponível publicamente e pode ser acessada através dos seguintes links:
- URL Base da API:
https://library-api-t563.onrender.com/api
- Documentação Interativa (Swagger):
https://library-api-t563.onrender.com/api-docs