Este projeto é uma API REST para gerenciar livros de usuários. Com esta API, você pode:
- Cadastrar um livro
- Atualizar um livro
- Listar um livro específico
- Listar todos os livros
- Deletar um livro
Os livros possuem os seguintes atributos:
- Título
- Categoria
- Autor
- Sinopse
- Linguagem: GoLang
- Banco de Dados: MongoDB
- Gerenciamento de Ambiente: Variáveis de ambiente com
godotenv - Containerização: Docker e Docker Compose
- Gerenciamento de Dependências: Go Modules
.
├── config
│ └── config.go
├── controllers
│ └── book.go
├── database
│ └── mongodb.go
├── models
│ └── book.go
├── routes
│ └── routes.go
├── main.go
├── docker-compose.yml
├── Dockerfile
├── .env
└── go.mod
- Docker e Docker Compose instalados.
- GoLang instalado (versão 1.17 ou superior).
- Um arquivo
.envconfigurado conforme o exemplo abaixo.
Crie um arquivo .env na raiz do projeto com as seguintes variáveis:
MONGODB_URI=mongodb://db:27017
MONGODB_DB=books
MONGODB_COLLECTION=books- Construa e inicie os containers:
docker-compose up
- Acesse a aplicação em
http://localhost:8080.
- Instale as dependências:
go mod tidy
- Inicie o MongoDB localmente: Certifique-se de que um servidor MongoDB esteja em execução e configurado na URL definida em
MONGODB_URI. - Execute a aplicação:
go run main.go
- Acesse a aplicação em
http://localhost:8080.
http://localhost:8080
- URL:
/books - Método:
POST - Corpo da Requisição:
{ "title": "Livro Exemplo", "category": "Ficção", "author": "Autor Exemplo", "synopsis": "Esta é a sinopse do livro." } - Resposta de Sucesso:
201 Created
- URL:
/books/{id} - Método:
PUT - Corpo da Requisição:
{ "title": "Livro Atualizado", "category": "Drama", "author": "Novo Autor", "synopsis": "Sinopse atualizada." } - Resposta de Sucesso:
200 OK
- URL:
/books/{id} - Método:
GET - Resposta de Sucesso:
{ "id": "1", "title": "Livro Exemplo", "category": "Ficção", "author": "Autor Exemplo", "synopsis": "Esta é a sinopse do livro." }
- URL:
/books - Método:
GET - Resposta de Sucesso:
[ { "id": "1", "title": "Livro Exemplo", "category": "Ficção", "author": "Autor Exemplo", "synopsis": "Esta é a sinopse do livro." }, { "id": "2", "title": "Outro Livro", "category": "Aventura", "author": "Outro Autor", "synopsis": "Sinopse de outro livro." } ]
- URL:
/books/{id} - Método:
DELETE - Resposta de Sucesso:
200 Book deleted successfully
-
Estrutura Flexível: Como o desafio não exige a implementação de relacionamentos complexos, o MongoDB, sendo um banco de dados NoSQL, oferece uma estrutura de dados flexível. Ele permite armazenar documentos JSON, o que é ideal para esse tipo de aplicação onde os dados (livros) podem ter diferentes atributos, como título, categoria, autor e sinopse, sem a necessidade de tabelas rígidas ou chaves estrangeiras.
-
Escalabilidade: O MongoDB é conhecido por sua alta escalabilidade, permitindo que a aplicação cresça facilmente conforme a quantidade de livros ou usuários aumente. Isso é vantajoso em sistemas que podem precisar de performance em grandes volumes de dados.
-
Desempenho: Em casos onde não há a necessidade de realizar consultas com joins complexos, o MongoDB pode oferecer um desempenho melhor, já que ele não precisa fazer operações de junção entre tabelas, como no caso de bancos relacionais, o que pode reduzir a sobrecarga de processamento.
-
Desenvolvimento Ágil: A flexibilidade do MongoDB também facilita o desenvolvimento rápido e a adaptação a mudanças no modelo de dados, o que é vantajoso em projetos que precisam ser entregues rapidamente, como esse desafio.
- Escolha do MongoDB: Optei pelo MongoDB devido à sua flexibilidade, já que o desafio não exigia relacionamentos complexos entre dados, e sua estrutura de documentos JSON permite um modelo de dados mais ágil e escalável.
- Estrutura do Projeto: Defini a estrutura de diretórios de forma a organizar claramente as responsabilidades de cada parte da aplicação (configuração, controladores, modelos e rotas).
- Uso de Docker: Usei dois estágios no dockerfile. Dessa forma o processo de build é separado da execução. No primeiro estágio (builder), compilamos a aplicação com todas as dependências do Go. No segundo estágio (run), usamos uma imagem mais leve (Alpine) e copiamos apenas o binário necessário, o que reduz o tamanho final da imagem e melhora a segurança. No docker-compose utilizei a imagem cosmtrek/air (versão 1.61.5), que é uma ferramenta usada para hot-reload em GoLang. Isso permite o desenvolvimento contínuo sem precisar reiniciar o servidor manualmente.
- Variáveis de Ambiente: Utilizei o godotenv para gerenciar variáveis de ambiente de maneira segura e prática, centralizando a configuração em um arquivo .env.
- Docker Compose: Implementei o Docker Compose para simplificar a orquestração da aplicação e do banco de dados, facilitando o processo de execução do projeto em diferentes ambientes.
- Gin: Optei pelo Gin-Gonic devido à sua simplicidade, desempenho e facilidade de uso para criar rotas e gerenciar requisições.
- Faça um fork do repositório.
- Crie um branch para sua feature (
git checkout -b feature/nome-da-feature). - Faça commit das suas alterações (
git commit -m 'Adiciona nova feature'). - Faça push para o branch (
git push origin feature/nome-da-feature). - Abra um Pull Request.
Projeto desenvolvido como parte do desafio técnico para Backend GoLang Jr na Taghos.