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.