Skip to content

Commit 475388d

Browse files
committed
fix(login): comprehensive error handling
1 parent 731017d commit 475388d

File tree

1 file changed

+43
-9
lines changed

1 file changed

+43
-9
lines changed

src/cmd/login.go

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,39 +25,61 @@ func loginCmd() *cmdBuilder.Cmd {
2525
HelpFlag(i18n.T(i18n.CmdHelpLogin)).
2626
Arg("token").
2727
GuestRunFunc(func(ctx context.Context, cmdData *cmdBuilder.GuestCmdData) error {
28+
// Check if token is provided
29+
if len(cmdData.Args["token"]) == 0 {
30+
return errors.New("token is required")
31+
}
32+
token := cmdData.Args["token"][0]
33+
if token == "" {
34+
return errors.New("token cannot be empty")
35+
}
36+
2837
uxBlocks := cmdData.UxBlocks
2938

3039
regionRetriever := region.New(httpClient.New(ctx, httpClient.Config{HttpTimeout: time.Minute * 5}))
3140

32-
regions, err := regionRetriever.RetrieveAllFromURL(ctx, cmdData.Params.GetString("regionUrl"))
41+
regionUrl := cmdData.Params.GetString("regionUrl")
42+
if regionUrl == "" {
43+
return errors.New("regionUrl is empty")
44+
}
45+
46+
regions, err := regionRetriever.RetrieveAllFromURL(ctx, regionUrl)
3347
if err != nil {
34-
return err
48+
return errors.Wrap(err, "failed to retrieve regions")
49+
}
50+
51+
if len(regions) == 0 {
52+
return errors.New("no regions available")
3553
}
3654

3755
reg, err := getLoginRegion(ctx, uxBlocks, regions, cmdData.Params.GetString("region"))
3856
if err != nil {
39-
return err
57+
return errors.Wrap(err, "failed to get login region")
4058
}
4159

42-
restApiClient := zeropsRestApiClient.NewAuthorizedClient(cmdData.Args["token"][0], "https://"+reg.Address)
60+
restApiClient := zeropsRestApiClient.NewAuthorizedClient(token, "https://"+reg.Address)
4361

4462
response, err := restApiClient.GetUserInfo(ctx)
4563
if err != nil {
46-
return err
64+
return errors.Wrap(err, "failed to get user info")
4765
}
4866

4967
output, err := response.Output()
5068
if err != nil {
51-
return err
69+
return errors.Wrap(err, "failed to process user info output")
70+
}
71+
72+
if output.FullName == "" || output.Email == "" {
73+
return errors.New("incomplete user info: missing full name or email")
5274
}
5375

5476
_, err = cmdData.CliStorage.Update(func(data cliStorage.Data) cliStorage.Data {
55-
data.Token = cmdData.Args["token"][0]
77+
data.Token = token
5678
data.RegionData = reg
5779
return data
5880
})
5981
if err != nil {
60-
return err
82+
return errors.Wrap(err, "failed to update CLI storage")
6183
}
6284

6385
uxBlocks.PrintInfo(styles.SuccessLine(i18n.T(i18n.LoginSuccess, output.FullName, output.Email)))
@@ -72,6 +94,10 @@ func getLoginRegion(
7294
regions []region.RegionItem,
7395
selectedRegion string,
7496
) (region.RegionItem, error) {
97+
if len(regions) == 0 {
98+
return region.RegionItem{}, errors.New("no regions available")
99+
}
100+
75101
if selectedRegion != "" {
76102
for _, reg := range regions {
77103
if reg.Name == selectedRegion {
@@ -103,7 +129,15 @@ func getLoginRegion(
103129
uxBlock.SelectTableHeader(header),
104130
)
105131
if err != nil {
106-
return region.RegionItem{}, err
132+
return region.RegionItem{}, errors.Wrap(err, "failed to select region")
133+
}
134+
135+
if len(regionIndex) == 0 {
136+
return region.RegionItem{}, errors.New("no region selected")
137+
}
138+
139+
if regionIndex[0] < 0 || regionIndex[0] >= len(regions) {
140+
return region.RegionItem{}, errors.New("invalid region index selected")
107141
}
108142

109143
return regions[regionIndex[0]], nil

0 commit comments

Comments
 (0)