LibraryAPI é uma REST API que simula o gerenciamento de uma biblioteca. É possível criar, editar, visualizar e deletar livros, autores e categorias. Porém, é necessário estar cadastrado na aplicação.
Essa API foi desenvolvida utilizando a linguagem Go, em conjunto com o Object-Relational Mapper (ORM) GORM e o banco de dados relacional MySQL.
A autenticação nas rotas é feita com JSON Web Token (JWT), concedido no login.
As senhas dos usuários são criptografadas antes de serem armazenadas no banco de dados.
Para executar essa aplicação, será necessário que o Docker e o Docker Compose estejam instalados em sua máquina.
Abra o terminal e siga os seguintes passos:
- Clone o repositório da aplicação:
git clone git@github.com:raelnogpires/libraryapp.git- Entre no repositório:
cd libraryapp- Entre no diretório
src/e copie o arquivo.env.examplepara.env:
cd src && cp .env.example .envCom o terminal aberto na raiz da aplicação, execute:
docker compose upAguarde o seguinte log aparecer:
library_api | db running
library_api | server running at port: 5000Para encerrar a aplicação utilize Ctrl + C .
Cadastra uma nova pessoa usuária.
Detalhes
POST http://localhost:5000/api/v1/register| Parâmetro | Tipo | Descrição |
|---|---|---|
| username | string | Nome/apelido de usuário. Obrigatório. |
| string | Email no formato "user@library.com". Obrigatório. | |
| password | string | Senha do usuário. Obrigatório. |
| Código | Descrição |
|---|---|
| 201 | user registered with success |
| 400 | invalid request body |
| 400 | email already registered |
Requisição:
{
"username": "reader",
"email": "ilovebooks@lispector.com",
"password": "1d5as15d"
}Resposta:
{
"message": "user registered with success",
}Realiza o login com email e senha de uma pessoa usuária já cadastrada.
Corpo da resposta contém um objeto JSON com o token de autenticação gerado e o id do usuário.
Detalhes
POST http://localhost:5000/api/v1/login| Parâmetro | Tipo | Descrição |
|---|---|---|
| string | Email da pessoa usuária. Obrigatório. | |
| password | string | Senha da pessoa usuária. Obrigatório. |
| Código | Descrição |
|---|---|
| 200 | token generated with success |
| 400 | invalid credentials |
| 404 | user not found |
Requisição:
{
"email": "ilovebooks@lispector.com",
"password": "1d5as15d"
}Resposta:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjIsImV4cCI6MTY1MzY5MDQ2MCwiaWF0IjoxNjUzNjY4ODYwLCJpc3MiOiJsaWJyYXJ5In0.kp7TQZmRHz-5ENJMa9KZ0mRVg35Xd8sm08WKmX_MFXg",
"user_id": 1
}Deleta o usuário que está logado.
Detalhes
DELETE http://localhost:5000/api/v1/user/meRequer token de autenticação no campo Token do Bearer Token .
Nenhum.
| Código | Descrição |
|---|---|
| 204 | user deleted with success |
| 401 | invalid token |
| 404 | token not found |
| 404 | user not found |
Busca todos os livros cadastrados.
Corpo da resposta contém um array JSON com os livros e suas informações.
Detalhes
GET http://localhost:5000/api/v1/booksRequer token de autenticação no campo Token do Bearer Token .
Nenhum.
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | int | ID do livro. |
| name | string | Nome do livro. |
| description | string | Sinopse do livro. |
| category_id | int | ID da categoria que o livro pertence. |
| category_name | string | Nome da categoria que o livro pertence. |
| author_id | int | ID da pessoa autora. |
| author_name | string | Nome da pessoa autora. |
| img_url | string | URL da imagem do livro. |
| Código | Descrição |
|---|---|
| 200 | books returned with success |
| 401 | invalid token |
| 404 | token not found |
Resposta:
[
{
"id": 1,
"name": "Sentimento do mundo",
"description": "O Drummond de Sentimento do mundo oscila entre diversos polos: cidade x interior, atualidade x memórias, eu x mundo. Perfeita depuração dos livros anteriores, este é um verdadeiro marco.",
"category_id": 6,
"category_name": "Poesia",
"author_id": 2,
"author_name": "Carlos Drummond de Andrade",
"img_url": "https://images-na.ssl-images-amazon.com/images/I/41Q6T14Y0EL._SX324_BO1,204,203,200_.jpg"
},
{
"id": 2,
"name": "Crime e Castigo",
"description": "Crime e Castigo é a obra mais célebre de Fyodor Dostoevsky. Neste livro, Raskólnikov, um jovem estudante, pobre e desesperado, perambula pelas ruas de São Petersburgo até cometer um crime que tentará justificar por uma teoria: grandes homens, como César ou Napoleão, foram assassinos absolvidos pela História.",
"category_id": 5,
"category_name": "Literatura Russa",
"author_id": 4,
"author_name": "Fyodor Dostoevsky",
"img_url": "https://images-na.ssl-images-amazon.com/images/I/517DdyXpc5L._SX348_BO1,204,203,200_.jpg"
},
]Busca um livro especificado pelo seu ID.
Corpo da resposta contém um objeto JSON as com informações do livro.
Detalhes
GET http://localhost:5000/api/v1/books/{id}Requer token de autenticação no campo Token do Bearer Token .
| Campo | Tipo | Descrição |
|---|---|---|
| id | int | ID do livro a ser buscado. |
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | int | ID do livro. |
| name | string | Nome do livro. |
| description | string | Sinopse do livro. |
| category_id | int | ID da categoria que o livro pertence. |
| category_name | string | Nome da categoria que o livro pertence. |
| author_id | int | ID da pessoa autora. |
| author_name | string | Nome da pessoa autora. |
| img_url | string | URL da imagem do livro. |
| Código | Descrição |
|---|---|
| 200 | book returned with success |
| 401 | invalid token |
| 404 | token not found |
| 404 | book not found |
Resposta:
{
"id": 2,
"name": "Crime e Castigo",
"description": "Crime e Castigo é a obra mais célebre de Fyodor Dostoevsky. Neste livro, Raskólnikov, um jovem estudante, pobre e desesperado, perambula pelas ruas de São Petersburgo até cometer um crime que tentará justificar por uma teoria: grandes homens, como César ou Napoleão, foram assassinos absolvidos pela História.",
"category_id": 5,
"category_name": "Literatura Russa",
"author_id": 4,
"author_name": "Fyodor Dostoevsky",
"img_url": "https://images-na.ssl-images-amazon.com/images/I/517DdyXpc5L._SX348_BO1,204,203,200_.jpg"
}Cria um novo livro.
Corpo da resposta contém um objeto JSON com as informações do livro criado.
Detalhes
POST http://localhost:5000/api/v1/booksRequer token de autenticação no campo Token do Bearer Token .
| Parâmetro | Tipo | Descrição |
|---|---|---|
| name | string | Nome do livro. Obrigatório |
| description | string | Sinopse do livro. Obrigatório |
| category_id | int | ID da categoria que o livro pertence. Obrigatório |
| author_id | int | ID da pessoa autora. Obrigatório |
| img_url | string | URL da imagem do livro. Obrigatório |
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | int | ID do livro. |
| name | string | Nome do livro. |
| description | string | Sinopse do livro. |
| category_id | int | ID da categoria que o livro pertence. |
| author_id | int | ID da pessoa autora. |
| img_url | string | URL da imagem do livro. |
| Código | Descrição |
|---|---|
| 201 | book created with success |
| 400 | invalid request body |
| 401 | invalid token |
| 404 | token not found |
Requisição:
{
"name": "O idiota",
"description": "Publicado originalmente em 1868, este é um desses livros em que o leitor reconhece de imediato a marca do gênio. Nele, o autor russo constrói um dos personagens mais impressionantes de toda a literatura mundial ― o humanista e epilético príncipe Míchkin, mescla de Cristo e Dom Quixote, cuja compaixão sem limites vai se chocar com o desregramento mundano de Rogójin e a beleza enlouquecedora de Nastácia Filíppovna.",
"category_id": 5,
"author_id": 4,
"img_url": "https://images-na.ssl-images-amazon.com/images/I/51EuSosoqJL._SX346_BO1,204,203,200_.jpg"
}Resposta:
{
"id": 3,
"name": "O idiota",
"description": "Publicado originalmente em 1868, este é um desses livros em que o leitor reconhece de imediato a marca do gênio. Nele, o autor russo constrói um dos personagens mais impressionantes de toda a literatura mundial ― o humanista e epilético príncipe Míchkin, mescla de Cristo e Dom Quixote, cuja compaixão sem limites vai se chocar com o desregramento mundano de Rogójin e a beleza enlouquecedora de Nastácia Filíppovna.",
"category_id": 5,
"author_id": 4,
"img_url": "https://images-na.ssl-images-amazon.com/images/I/51EuSosoqJL._SX346_BO1,204,203,200_.jpg"
}Edita um livro especificado pelo seu ID.
Corpo da resposta contém um objeto JSON com as informações do livro editado.
Detalhes
PUT http://localhost:5000/api/v1/books/{id}Requer token de autenticação no campo Token do Bearer Token .
| Campo | Tipo | Descrição |
|---|---|---|
| id | int | ID do livro a ser editado. |
| Parâmetro | Tipo | Descrição |
|---|---|---|
| name | string | Nome do livro. Obrigatório |
| description | string | Sinopse do livro. Obrigatório |
| category_id | int | ID da categoria que o livro pertence. Obrigatório |
| author_id | int | ID da pessoa autora. Obrigatório |
| img_url | string | URL da imagem do livro. Obrigatório |
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | int | ID do livro. |
| name | string | Nome do livro. |
| description | string | Sinopse do livro. |
| category_id | int | ID da categoria que o livro pertence. |
| author_id | int | ID da pessoa autora. |
| img_url | string | URL da imagem do livro. |
| Código | Descrição |
|---|---|
| 200 | book edited with success |
| 400 | invalid request body |
| 401 | invalid token |
| 404 | token not found |
Requisição:
http://localhost:5000/api/v1/books/3
{
"name": "The idiot",
"description": "A book written by Fyodor Dostoevsky.",
"category_id": 5,
"author_id": 4,
"img_url": "https://images-na.ssl-images-amazon.com/images/I/51EuSosoqJL._SX346_BO1,204,203,200_.jpg"
}Reposta:
{
"id": 3,
"name": "The idiot",
"description": "A book written by Fyodor Dostoevsky.",
"category_id": 5,
"author_id": 4,
"img_url": "https://images-na.ssl-images-amazon.com/images/I/51EuSosoqJL._SX346_BO1,204,203,200_.jpg"
}Deleta um livro especificado pelo seu ID.
Detalhes
DELETE http://localhost:5000/api/v1/books/{id}Requer token de autenticação no campo Token do Bearer Token .
| Campo | Tipo | Descrição |
|---|---|---|
| id | int | ID do livro a ser deletado. |
Nenhum.
| Código | Descrição |
|---|---|
| 204 | book deleted with success |
| 401 | invalid token |
| 404 | token not found |
| 404 | book not found |
Busca todos os autores cadastrados.
Corpo da resposta contém um array JSON com os autores.
Detalhes
GET http://localhost:5000/api/v1/authorsRequer token de autenticação no campo Token do Bearer Token .
Nenhum.
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | int | ID do autor. |
| name | string | Nome do autor. |
| Código | Descrição |
|---|---|
| 200 | authors returned with success |
| 401 | invalid token |
| 404 | token not found |
Resposta:
[
{
"id": 1,
"name": "Clarice Lispector",
},
{
"id": 2,
"name": "Carlos Drummond de Andrade",
}
]Busca um autor especificado pelo seu ID.
Corpo da resposta contém um objeto JSON com as informações do autor.
Detalhes
GET http://localhost:5000/api/v1/authors/{id}Requer token de autenticação no campo Token do Bearer Token .
| Campo | Tipo | Descrição |
|---|---|---|
| id | int | ID do autor a ser buscado. |
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | int | ID do autor. |
| name | string | Nome do autor. |
| Código | Descrição |
|---|---|
| 200 | author returned with success |
| 401 | invalid token |
| 404 | token not found |
| 404 | author not found |
Resposta:
{
"id": 2,
"name": "Carlos Drummond de Andrade"
}Cria um novo autor.
Corpo da resposta contém um objeto JSON com as informações do autor criado.
Detalhes
POST http://localhost:5000/api/v1/authorsRequer token de autenticação no campo Token do Bearer Token .
| Parâmetro | Tipo | Descrição |
|---|---|---|
| name | string | Nome do autor. Obrigatório |
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | int | ID do autor. |
| name | string | Nome do autor. |
| Código | Descrição |
|---|---|
| 201 | author created with success |
| 400 | invalid request body |
| 401 | invalid token |
| 404 | token not found |
Requisição:
{
"name": "J. R. R. Tolkien"
}Resposta:
{
"id": 3,
"name": "J. R. R. Tolkien"
}Edita um autor especificado pelo seu ID.
Corpo da resposta contém um objeto JSON com as informações do autor editado.
Detalhes
PUT http://localhost:5000/api/v1/authors/{id}Requer token de autenticação no campo Token do Bearer Token .
| Campo | Tipo | Descrição |
|---|---|---|
| id | int | ID do autor a ser editado. |
| Parâmetro | Tipo | Descrição |
|---|---|---|
| name | string | Nome do autor. Obrigatório |
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | int | ID do autor. |
| name | string | Nome do autor. |
| Código | Descrição |
|---|---|
| 200 | author edited with success |
| 400 | invalid request body |
| 401 | invalid token |
| 404 | token not found |
| 404 | author not found |
Requisição:
http://localhost:5000/api/v1/authors/3
{
"name": "George R. R. Martin"
}Resposta:
{
"id": 3,
"name": "George R. R. Martin"
}Deleta um autor especificado pelo seu ID.
Detalhes
DELETE http://localhost:5000/api/v1/authors/{id}Requer token de autenticação no campo Token do Bearer Token .
| Campo | Tipo | Descrição |
|---|---|---|
| id | int | ID do autor a ser deletado. |
Nenhum.
| Código | Descrição |
|---|---|
| 204 | author deleted with success |
| 401 | invalid token |
| 404 | token not found |
| 404 | author not found |
Busca todas as categorias cadastradas.
Corpo da resposta contém um array JSON com as categorias.
Detalhes
GET http://localhost:5000/api/v1/categoriesRequer token de autenticação no campo Token do Bearer Token .
Nenhum.
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | int | ID da categoria. |
| name | string | Nome da categoria. |
| Código | Descrição |
|---|---|
| 200 | categories returned with success |
| 401 | invalid token |
| 404 | token not found |
Resposta:
[
{
"id": 1,
"name": "Poesia"
},
{
"id": 2,
"name": "Ficção Literária"
}
]Busca um autor especificado pelo seu ID.
Corpo da resposta contém um objeto JSON com as informações da categoria.
Detalhes
GET http://localhost:5000/api/v1/categories/{id}Requer token de autenticação no campo Token do Bearer Token .
| Campo | Tipo | Descrição |
|---|---|---|
| id | int | ID da categoria a ser buscada. |
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | int | ID da categoria. |
| name | string | Nome da categoria. |
| Código | Descrição |
|---|---|
| 200 | category returned with success |
| 401 | invalid token |
| 404 | token not found |
| 404 | category not found |
Resposta:
{
"id": 2,
"name": "Ficção Literária"
}Cria uma nova categoria.
Corpo da resposta contém um objeto JSON com as informações da categoria criada.
Detalhes
POST http://localhost:5000/api/v1/categoriesRequer token de autenticação no campo Token do Bearer Token .
| Campo | Tipo | Descrição |
|---|---|---|
| name | string | Nome da categoria. Obrigatório |
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | int | ID da categoria. |
| name | string | Nome da categoria. |
| Código | Descrição |
|---|---|
| 201 | category created with success |
| 400 | invalid request body |
| 401 | invalid token |
| 404 | token not found |
Requisição:
{
"name": "Literatura Russa"
}Resposta:
{
"id": 3,
"name": "Literatura Russa"
}Edita uma categoria especificada pelo seu ID.
Corpo da resposta contém um objeto JSON com as informações da categoria editada.
Detalhes
PUT http://localhost:5000/api/v1/categories/{id}Requer token de autenticação no campo Token do Bearer Token .
| Campo | Tipo | Descrição |
|---|---|---|
| id | int | ID da categoria a ser editada. |
| Parâmetro | Tipo | Descrição |
|---|---|---|
| name | string | Nome do categoria. Obrigatório |
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | int | ID da categoria. |
| name | string | Nome da categoria. |
| Código | Descrição |
|---|---|
| 200 | category edited with success |
| 400 | invalid request body |
| 401 | invalid token |
| 404 | token not found |
| 404 | category not found |
Requisição:
http://localhost:5000/api/v1/categories/2
{
"name": "Romance"
}Resposta:
{
"id": 2,
"name": "Romance"
}Deleta uma categoria especificada pelo seu ID.
Detalhes
DELETE http://localhost:5000/api/v1/categories/{id}Requer token de autenticação no campo Token do Bearer Token .
| Campo | Tipo | Descrição |
|---|---|---|
| id | int | ID da categoria a ser deletada. |
Nenhum.
| Código | Descrição |
|---|---|
| 204 | category deleted with success |
| 401 | invalid token |
| 404 | token not found |
| 404 | category not found |






