diff --git a/seeder-api/.env.example b/seeder-api/.env.example new file mode 100644 index 0000000..12951a1 --- /dev/null +++ b/seeder-api/.env.example @@ -0,0 +1,2 @@ +PORT=8080 +DATABASE_URL=postgres://user:password@localhost:5432/saveinmed?sslmode=disable diff --git a/seeder-api/Dockerfile b/seeder-api/Dockerfile new file mode 100644 index 0000000..a06c5e5 --- /dev/null +++ b/seeder-api/Dockerfile @@ -0,0 +1,24 @@ +# syntax=docker/dockerfile:1.7 +FROM golang:1.22-alpine AS builder + +WORKDIR /app + +RUN apk add --no-cache ca-certificates + +COPY go.mod go.sum ./ +RUN go mod download + +COPY . . + +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ + go build -trimpath -ldflags="-s -w" -o seeder-api ./main.go + +FROM gcr.io/distroless/static-debian12:nonroot + +WORKDIR /app +COPY --from=builder /app/seeder-api /app/seeder-api + +USER nonroot:nonroot +EXPOSE 8080 + +ENTRYPOINT ["/app/seeder-api"] diff --git a/seeder-api/README.md b/seeder-api/README.md index 1790e58..fe54738 100644 --- a/seeder-api/README.md +++ b/seeder-api/README.md @@ -47,7 +47,7 @@ Use este modo para desenvolvimento diário. Ele cria as seguintes credenciais de - Go 1.22+ ### 1. Configurar -Certifique-se que o `.env` ou variáveis de ambiente estão corretas: +Use o arquivo `.env.example` como base e configure as variáveis: ```bash export DATABASE_URL=postgres://user:password@localhost:5432/saveinmed?sslmode=disable @@ -73,6 +73,26 @@ _Saída esperada:_ curl -X POST "http://localhost:8216/seed" ``` +## 📜 Swagger/OpenAPI +O documento OpenAPI está disponível em: + +```bash +curl http://localhost:8216/swagger.json +``` + +## 🐳 Docker (imagem otimizada) +Build: + +```bash +docker build -t saveinmed-seeder-api . +``` + +Run: + +```bash +docker run --rm -p 8216:8080 --env-file .env saveinmed-seeder-api +``` + ## ⚡ Fluxo Recomendado de Trabalho 1. Pare o backend principal (`backend-go`) para liberar conexões com o banco. 2. Rode o seeder: `go run main.go` em um terminal. diff --git a/seeder-api/docs/openapi.json b/seeder-api/docs/openapi.json new file mode 100644 index 0000000..a159402 --- /dev/null +++ b/seeder-api/docs/openapi.json @@ -0,0 +1,78 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "SaveInMed Seeder API", + "version": "1.0.0", + "description": "API utilitária para popular o banco de dados com dados de teste." + }, + "servers": [ + { + "url": "http://localhost:8080", + "description": "Ambiente local" + } + ], + "paths": { + "/seed": { + "post": { + "summary": "Executa o seed do banco", + "description": "Limpa e recria as tabelas, gerando dados de teste.", + "parameters": [ + { + "name": "mode", + "in": "query", + "required": false, + "description": "Modo de seed: `lean` para dados de dev ou `full` para carga.", + "schema": { + "type": "string", + "enum": ["lean", "full"], + "default": "full" + } + } + ], + "responses": { + "200": { + "description": "Seed executado com sucesso", + "content": { + "application/json": { + "schema": { + "type": "string" + }, + "examples": { + "lean": { + "value": "Lean seed completed. 4 Pharmacies. Users: 13. Pass: 123456 (admin: admin123)" + } + } + } + } + }, + "405": { + "description": "Método não permitido" + }, + "500": { + "description": "Erro ao executar o seed" + } + } + } + }, + "/swagger.json": { + "get": { + "summary": "Retorna o Swagger/OpenAPI da Seeder API", + "responses": { + "200": { + "description": "Documento OpenAPI", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "405": { + "description": "Método não permitido" + } + } + } + } + } +} diff --git a/seeder-api/main.go b/seeder-api/main.go index 666c394..84e7420 100644 --- a/seeder-api/main.go +++ b/seeder-api/main.go @@ -1,6 +1,7 @@ package main import ( + _ "embed" "log" "net/http" "os" @@ -9,6 +10,9 @@ import ( "github.com/saveinmed/seeder-api/pkg/seeder" ) +//go:embed docs/openapi.json +var swaggerJSON string + func main() { godotenv.Load() port := os.Getenv("PORT") @@ -40,6 +44,16 @@ func main() { w.Write([]byte(result)) }) + http.HandleFunc("/swagger.json", func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + w.Header().Set("Content-Type", "application/json") + w.Write([]byte(swaggerJSON)) + }) + log.Printf("Seeder API listening on port %s", port) if err := http.ListenAndServe(":"+port, nil); err != nil { log.Fatalf("Server error: %v", err)