diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..48e67b0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +bin/ +*.hurl +.git/ +.jj/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..eea96ab --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +FROM golang:1.24 AS base + +WORKDIR /build + +COPY go.mod go.sum ./ + +RUN go mod download + +COPY . . + +RUN go build -o bin/gateway cmd/app/main.go + +ENV PORT=8000 +EXPOSE 8000 + +# Start the application +CMD ["/build/bin/gateway"] diff --git a/Dockerfile-stubby b/Dockerfile-stubby new file mode 100644 index 0000000..4f52627 --- /dev/null +++ b/Dockerfile-stubby @@ -0,0 +1,7 @@ +FROM node:24 + +RUN npm install -g stubby + +WORKDIR /app + +CMD ["stubby", "-d", "mock.yml"] diff --git a/cmd/app/main.go b/cmd/app/main.go index d89fcd7..8729d9c 100644 --- a/cmd/app/main.go +++ b/cmd/app/main.go @@ -18,12 +18,13 @@ func getEnv(key, defaultValue string) string { func main() { providers := providers.NewUseProviders([]providers.Provider{ - providers.NewBraintreeProvider(getEnv("BRAINTREE_URL", "localhost:8000")), - providers.NewStripeProvider(getEnv("STRIPE_URL", "localhost:8001")), + providers.NewBraintreeProvider(getEnv("BRAINTREE_URL", "localhost:8001")), + providers.NewStripeProvider(getEnv("STRIPE_URL", "localhost:8002")), }) paymentsService := service.NewPaymentService(providers) - server := web.NewServer(paymentsService, "8000") + port := getEnv("PORT", "8000") + server := web.NewServer(paymentsService, port) server.ConfigureRouter() if err := server.Start(); err != nil { diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e2fdd4b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,29 @@ +services: + api-gateway: + build: + dockerfile: $PWD/Dockerfile + ports: + - "8000:8000" + environment: + PORT: 8000 + BRAINTREE_URL: stripe + STRIPE_URL: braintree + depends_on: + - stripe + - braintree + + stripe: + build: + dockerfile: $PWD/Dockerfile-stubby + environment: + PORT: 8882 + volumes: + - $PWD/mocks/stripe.yml:/app/mock.yml + + braintree: + build: + dockerfile: $PWD/Dockerfile-stubby + environment: + PORT: 8882 + volumes: + - $PWD/mocks/braintree.yml:/app/mock.yml diff --git a/mocks/braintree.yml b/mocks/braintree.yml new file mode 100644 index 0000000..bb29a20 --- /dev/null +++ b/mocks/braintree.yml @@ -0,0 +1,27 @@ +- request: + url: ^/charge$ + method: POST + headers: + content-type: application/json + response: + - status: 200 + latency: 5000 + headers: + content-type: application/json + server: stubbedServer/4.2 + body: > + { + "amount": 1000, + "currency": "BRL", + "description": "", + "paymentMethod": { + "type": "card", + "card": { + "number": "", + "holderName": "", + "cvv": "", + "expirationDate": "22/2025", + "installments": 1 + } + } + } diff --git a/mocks/stripe.yml b/mocks/stripe.yml new file mode 100644 index 0000000..864facb --- /dev/null +++ b/mocks/stripe.yml @@ -0,0 +1,25 @@ +- request: + url: ^/transactions$ + method: POST + headers: + content-type: application/json + response: + - status: 200 + latency: 5000 + headers: + content-type: application/json + server: stubbedServer/4.2 + body: > + { + "amount": 1000, + "currency": "BRL", + "statementDescriptor": "", + "paymentType": "card", + "card": { + "number": "", + "holder": "", + "cvv": "", + "expiration": "22/2025", + "installmentNumber": 1 + } + }