Exemplo de API em Go organizanda por feature folders, usando Fiber. Dados de seed (80 jogos) são lidos de app/data/games_seed.json.
- Go 1.21+
- Docker & Docker Compose (se for usar containers)
- make (opcional, mas recomendado)
games-api ├── cmd │ └── main.go ├── data │ └── games_seed.json ├── docker-compose.yml ├── Dockerfile ├── go.mod ├── go.sum ├── internal │ ├── games │ │ ├── handler.go │ │ ├── model.go │ │ ├── repository.go │ │ ├── routes.go │ │ └── service.go │ └── health │ └── health.go ├── Makefile ├── openapi.yml ├── pkg │ └── ulidutil │ └── ulid.go └── README.md - Instale dependências e verifique módulos:
make tidy- Rodar localmente (usa
data/games_seed.json):
make run- Build local do binário:
make build # binário gerado em bin/games-api- Construir a imagem Docker:
make docker-build- Subir containers (monta ./data como /app/data no container):
make up- Logs, parar e remover:
make logs make downObservação: o
docker-compose.ymlmonta a pasta local./dataem/app/datado container (read-only). Garanta quedata/games_seed.jsonesteja presente na raiz do projeto antes de subir o compose.
Lista dos comandos principais (já disponíveis no Makefile):
makeoumake help— mostra os comandos disponíveis.make tidy—go mod tidyego mod verify.make build— compila o binário embin/games-api.make run— executago run main.go(usa o seed JSON em ./data).make test— rodago test ./... -v.make lint— formata o código (go fmt ./...).
Docker related:
make docker-build— builda a imagem Dockerfile.make docker-run— roda a imagem via Dockerfile.make up—docker-compose up --build -d.make down—docker-compose down.make logs— segue logs do serviço.make shell— abre um shell dentro do container (/bin/sh).make docker-clean— remove containers/imagens criadas.
Utilitários:
make health—curlno endpointGET /health(usaPORT3000 por padrão).
- O seed com 80 jogos está em
data/games_seed.jsone é versionado no repositório. - O serviço carrega esse arquivo ao iniciar; a aplicação espera encontrar
data/games_seed.jsonno diretório de trabalho.
Você pode testar a API localmente (porta padrão 3000) com todos os parâmetros mockados:
curl -X GET "http://localhost:3000/games?name=mario&platform=snes&genre=Platform&subGenre=Adventure" \ -H "Accept: application/json" | jqExemplo de resposta:
{ "data": [ { "id": "01H1Z4Q0V1F2G3H4J5K6L7M8N", "name": "Super Mario World", "releaseDate": "1990-11-21", "platform": "snes", "genre": "Platform", "subGenre": "Adventure", "rating": 9.0 } ] }Parâmetros de exemplo usados:
name=mario→ busca por nome contendo "mario" (case-insensitive)platform=snes→ filtra apenas jogos de Super Nintendogenre=Platform→ gênero principalsubGenre=Adventure→ subgênero
Todos os resultados vêm ordenados por rating (desc) por padrão.