package etsy import ( "context" "fmt" "net/http" "ruben/inventory2/domains/platforms/etsy/generated_client" ) func newFixedAccessTokenClient(apiKey, accessToken string) (*generated_client.ClientWithResponses, error) { return newAuthenticatingClient(apiKey, func(ctx context.Context) (string, error) { return accessToken, nil }) } func newAccessTokenRefreshingClient(apiKey string) (*generated_client.ClientWithResponses, error) { return newAuthenticatingClient(apiKey, func(ctx context.Context) (string, error) { // TODO: look up the token in the db. return "", nil }) } func newAuthenticatingClient(apiKey string, getAccessToken func(context.Context) (string, error)) (*generated_client.ClientWithResponses, error) { var setAuthHeaders generated_client.ClientOption = func(c *generated_client.Client) error { c.RequestEditors = append(c.RequestEditors, generated_client.RequestEditorFn(func(ctx context.Context, req *http.Request) error { accessToken, err := getAccessToken(req.Context()) if err != nil { return err } h := req.Header h.Set("x-api-key", apiKey) h.Set("Authorization", fmt.Sprintf("Bearer %s", accessToken)) return nil })) return nil } c, err := generated_client.NewClientWithResponses("https://api.etsy.com", setAuthHeaders) if err != nil { return nil, fmt.Errorf("failed to initialize open api client: %w", err) } return c, nil }