platform.go

42 lines
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
package digitalocean

import (
	"context"
	"fmt"
	"net/http"

	"congo.gg/pkg/platform"
	"github.com/digitalocean/godo"
)

type backend struct {
	client *godo.Client
	ctx    context.Context
}

// bearerTransport adds an Authorization header to every request.
type bearerTransport struct {
	token string
}

func (t *bearerTransport) RoundTrip(req *http.Request) (*http.Response, error) {
	r := req.Clone(req.Context())
	r.Header.Set("Authorization", "Bearer "+t.token)
	return http.DefaultTransport.RoundTrip(r)
}

// New creates a DigitalOcean platform.
func New(token string) (*platform.Platform, error) {
	if token == "" {
		return nil, fmt.Errorf("token required")
	}

	httpClient := &http.Client{Transport: &bearerTransport{token: token}}

	return &platform.Platform{
		Backend: &backend{
			client: godo.NewClient(httpClient),
			ctx:    context.Background(),
		},
	}, nil
}