Skip to content

Commit 990a42a

Browse files
feat(cosmosgen): fetch fallback buf token (backport #4805) (#4813)
* feat(cosmosgen): fetch fallback buf token (#4805) * feat(cosmosgen): fetch fallback buf token * package refactor * fix `CaptureException called with nil error` * cl * updates * updates * feedback (cherry picked from commit 3919d6b) # Conflicts: # ignite/cmd/bubblemodel/chain_serve.go # ignite/cmd/cmd.go # ignite/internal/analytics/analytics.go # ignite/internal/announcements/announcement_test.go # ignite/pkg/cosmosgen/generate_typescript.go # ignite/pkg/gocmd/gocmd_test.go # ignite/templates/app/files/{{protoDir}}/buf.gen.gogo.yaml # ignite/templates/app/files/{{protoDir}}/buf.gen.swagger.yaml * conflicts * updates * delete * updates --------- Co-authored-by: julienrbrt <[email protected]>
1 parent 18c30cf commit 990a42a

File tree

11 files changed

+162
-24
lines changed

11 files changed

+162
-24
lines changed

changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
## [`v28.11.1`](https://github.com/ignite/cli/releases/tag/v28.11.1)
6+
7+
- [#4813](https://github.com/ignite/cli/pull/4813) Fetch fallback buf token.
8+
59
## [`v28.11.0`](https://github.com/ignite/cli/releases/tag/v28.11.0)
610

711
### Changes

ignite/cmd/bubblemodel/chain_serve.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77

88
tea "github.com/charmbracelet/bubbletea"
99

10-
"github.com/ignite/cli/v28/ignite/pkg/announcements"
10+
"github.com/ignite/cli/v28/ignite/internal/announcements"
1111
"github.com/ignite/cli/v28/ignite/pkg/cliui/colors"
1212
"github.com/ignite/cli/v28/ignite/pkg/cliui/icons"
1313
cliuimodel "github.com/ignite/cli/v28/ignite/pkg/cliui/model"

ignite/cmd/cmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
flag "github.com/spf13/pflag"
1414

1515
"github.com/ignite/cli/v28/ignite/config"
16-
"github.com/ignite/cli/v28/ignite/pkg/announcements"
16+
"github.com/ignite/cli/v28/ignite/internal/announcements"
1717
"github.com/ignite/cli/v28/ignite/pkg/cache"
1818
"github.com/ignite/cli/v28/ignite/pkg/cliui"
1919
uilog "github.com/ignite/cli/v28/ignite/pkg/cliui/log"

ignite/internal/analytics/analytics.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ import (
1313
"github.com/spf13/cobra"
1414

1515
"github.com/ignite/cli/v28/ignite/config"
16+
"github.com/ignite/cli/v28/ignite/internal/sentry"
1617
"github.com/ignite/cli/v28/ignite/pkg/gitpod"
1718
"github.com/ignite/cli/v28/ignite/pkg/matomo"
1819
"github.com/ignite/cli/v28/ignite/pkg/randstr"
19-
"github.com/ignite/cli/v28/ignite/pkg/sentry"
2020
"github.com/ignite/cli/v28/ignite/version"
2121
)
2222

ignite/pkg/announcements/announcement.go renamed to ignite/internal/announcements/announcement.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,10 @@ import (
1111
)
1212

1313
var (
14-
SurveyLink = "https://bit.ly/3WZS2uS"
15-
APIURL = "http://announcements.ignite.com/v1/announcements"
14+
SurveyLink = "https://bit.ly/3WZS2uS"
15+
AnnouncementURL = "https://api.ignite.com/v1/announcements"
1616
)
1717

18-
type api struct {
19-
Announcements []announcement `json:"announcements"`
20-
}
21-
2218
type announcement struct {
2319
ID string `json:"id"`
2420
Text string `json:"text"`
@@ -28,13 +24,16 @@ type announcement struct {
2824

2925
// Fetch fetches the latest announcements from the API.
3026
func Fetch() string {
31-
resp, err := http.Get(APIURL) //nolint:gosec
27+
resp, err := http.Get(AnnouncementURL) //nolint:gosec
3228
if err != nil || resp.StatusCode != 200 {
3329
return fallbackData()
3430
}
3531
defer resp.Body.Close()
3632

37-
var data api
33+
type response struct {
34+
Announcements []announcement `json:"announcements"`
35+
}
36+
var data response
3837
if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
3938
return fallbackData()
4039
}

ignite/pkg/announcements/announcement_test.go renamed to ignite/internal/announcements/announcement_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"net/http/httptest"
77
"testing"
88

9-
"github.com/ignite/cli/v28/ignite/pkg/announcements"
9+
"github.com/ignite/cli/v28/ignite/internal/announcements"
1010
)
1111

1212
func TestFetchAnnouncements(t *testing.T) {
@@ -52,9 +52,9 @@ func TestFetchAnnouncements(t *testing.T) {
5252
}))
5353
defer server.Close()
5454

55-
originalAPI := announcements.APIURL
56-
announcements.APIURL = server.URL
57-
defer func() { announcements.APIURL = originalAPI }()
55+
originalAPI := announcements.AnnouncementURL
56+
announcements.AnnouncementURL = server.URL
57+
defer func() { announcements.AnnouncementURL = originalAPI }()
5858

5959
result := announcements.Fetch()
6060
if result != tt.expected {

ignite/internal/buf/buf.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package buf
2+
3+
import (
4+
"encoding/json"
5+
"net/http"
6+
"time"
7+
8+
"github.com/ignite/cli/v28/ignite/pkg/errors"
9+
)
10+
11+
var BufTokenURL = "https://buf.ignite.com" //nolint:gosec // URL is hardcoded and not user-provided
12+
13+
// FetchToken fetches the buf token from the Ignite API.
14+
func FetchToken() (string, error) {
15+
client := &http.Client{
16+
Timeout: 5 * time.Second,
17+
}
18+
19+
resp, err := client.Get(BufTokenURL)
20+
if err != nil {
21+
return "", err
22+
}
23+
defer resp.Body.Close()
24+
25+
if resp.StatusCode != http.StatusOK {
26+
return "", errors.Errorf("HTTP request failed with status code: %d", resp.StatusCode)
27+
}
28+
29+
type tokenResponse struct {
30+
Token string `json:"token"`
31+
}
32+
var tokenResp tokenResponse
33+
34+
if err := json.NewDecoder(resp.Body).Decode(&tokenResp); err != nil {
35+
return "", err
36+
}
37+
38+
return tokenResp.Token, nil
39+
}

ignite/internal/buf/buf_test.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package buf_test
2+
3+
import (
4+
"net/http"
5+
"net/http/httptest"
6+
"testing"
7+
8+
"github.com/ignite/cli/v28/ignite/internal/buf"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestFetchToken(t *testing.T) {
13+
tests := []struct {
14+
name string
15+
serverResponse string
16+
statusCode int
17+
expectedToken string
18+
expectError bool
19+
}{
20+
{
21+
name: "successful token fetch",
22+
serverResponse: `{"token":"test_token_123"}`,
23+
statusCode: http.StatusOK,
24+
expectedToken: "test_token_123",
25+
expectError: false,
26+
},
27+
{
28+
name: "server error",
29+
serverResponse: `{"error":"internal server error"}`,
30+
statusCode: http.StatusInternalServerError,
31+
expectedToken: "",
32+
expectError: true,
33+
},
34+
{
35+
name: "invalid json response",
36+
serverResponse: `invalid json`,
37+
statusCode: http.StatusOK,
38+
expectedToken: "",
39+
expectError: true,
40+
},
41+
}
42+
43+
for _, tt := range tests {
44+
t.Run(tt.name, func(t *testing.T) {
45+
// Create mock server
46+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
47+
w.WriteHeader(tt.statusCode)
48+
w.Write([]byte(tt.serverResponse))
49+
}))
50+
defer server.Close()
51+
52+
// Temporarily override the endpoint
53+
originalEndpoint := buf.BufTokenURL
54+
buf.BufTokenURL = server.URL
55+
defer func() {
56+
buf.BufTokenURL = originalEndpoint
57+
}()
58+
59+
token, err := buf.FetchToken()
60+
if tt.expectError {
61+
require.Error(t, err)
62+
require.Empty(t, token)
63+
} else {
64+
require.NoError(t, err)
65+
require.Equal(t, tt.expectedToken, token)
66+
}
67+
})
68+
}
69+
}

ignite/pkg/cosmosgen/generate_typescript.go

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,25 @@ import (
77
"sort"
88
"strings"
99

10-
"golang.org/x/sync/errgroup"
11-
10+
"github.com/ignite/cli/v28/ignite/internal/buf"
1211
"github.com/ignite/cli/v28/ignite/pkg/cache"
1312
"github.com/ignite/cli/v28/ignite/pkg/cosmosanalysis/module"
1413
"github.com/ignite/cli/v28/ignite/pkg/cosmosbuf"
1514
"github.com/ignite/cli/v28/ignite/pkg/dirchange"
1615
"github.com/ignite/cli/v28/ignite/pkg/gomodulepath"
16+
"golang.org/x/sync/errgroup"
1717
)
1818

19-
var dirchangeCacheNamespace = "generate.typescript.dirchange"
19+
var (
20+
bufTokenEnvName = "BUF_TOKEN"
21+
22+
dirchangeCacheNamespace = "generate.typescript.dirchange"
23+
)
2024

2125
type tsGenerator struct {
2226
g *generator
27+
// hasLocalBufToken indicates whether the user had already a local Buf token.
28+
hasLocalBufToken bool
2329
}
2430

2531
type generatePayload struct {
@@ -28,7 +34,18 @@ type generatePayload struct {
2834
}
2935

3036
func newTSGenerator(g *generator) *tsGenerator {
31-
return &tsGenerator{g}
37+
tsg := &tsGenerator{g: g}
38+
39+
if os.Getenv(bufTokenEnvName) == "" {
40+
token, err := buf.FetchToken()
41+
if err == nil {
42+
os.Setenv(bufTokenEnvName, token)
43+
}
44+
} else {
45+
tsg.hasLocalBufToken = true
46+
}
47+
48+
return tsg
3249
}
3350

3451
func (g *generator) tsTemplate() string {
@@ -55,6 +72,12 @@ func (g *generator) generateTS(ctx context.Context) error {
5572
})
5673

5774
tsg := newTSGenerator(g)
75+
defer func() {
76+
// unset ignite buf token from env
77+
if !tsg.hasLocalBufToken {
78+
os.Unsetenv(bufTokenEnvName)
79+
}
80+
}()
5881
if err := tsg.generateModuleTemplates(ctx); err != nil {
5982
return err
6083
}

0 commit comments

Comments
 (0)