From 9e2d76f3cee6ff3a19f43a3224b19815833c8cdf Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Sat, 4 Oct 2025 00:27:14 +0800 Subject: [PATCH] refactor(login): enhance project ID normalization and onboarding logic - Introduced `trimmedRequest` for consistent project ID trimming. - Improved handling of project ID retrieval from Gemini onboarding responses. - Added safeguards to maintain the requested project ID when discrepancies occur. --- internal/cmd/login.go | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/internal/cmd/login.go b/internal/cmd/login.go index 9656cdd2..b6d6e2a7 100644 --- a/internal/cmd/login.go +++ b/internal/cmd/login.go @@ -154,11 +154,14 @@ func performGeminiCLISetup(ctx context.Context, httpClient *http.Client, storage "pluginType": "GEMINI", } + trimmedRequest := strings.TrimSpace(requestedProject) + explicitProject := trimmedRequest != "" + loadReqBody := map[string]any{ "metadata": metadata, } - if requestedProject != "" { - loadReqBody["cloudaicompanionProject"] = requestedProject + if explicitProject { + loadReqBody["cloudaicompanionProject"] = trimmedRequest } var loadResp map[string]any @@ -182,11 +185,18 @@ func performGeminiCLISetup(ctx context.Context, httpClient *http.Client, storage } } - projectID := strings.TrimSpace(requestedProject) + projectID := trimmedRequest if projectID == "" { if id, okProject := loadResp["cloudaicompanionProject"].(string); okProject { projectID = strings.TrimSpace(id) } + if projectID == "" { + if projectMap, okProject := loadResp["cloudaicompanionProject"].(map[string]any); okProject { + if id, okID := projectMap["id"].(string); okID { + projectID = strings.TrimSpace(id) + } + } + } } if projectID == "" { return &projectSelectionRequiredError{} @@ -208,16 +218,30 @@ func performGeminiCLISetup(ctx context.Context, httpClient *http.Client, storage } if done, okDone := onboardResp["done"].(bool); okDone && done { + responseProjectID := "" if resp, okResp := onboardResp["response"].(map[string]any); okResp { - if project, okProject := resp["cloudaicompanionProject"].(map[string]any); okProject { - if id, okID := project["id"].(string); okID && strings.TrimSpace(id) != "" { - storage.ProjectID = strings.TrimSpace(id) + switch projectValue := resp["cloudaicompanionProject"].(type) { + case map[string]any: + if id, okID := projectValue["id"].(string); okID { + responseProjectID = strings.TrimSpace(id) } + case string: + responseProjectID = strings.TrimSpace(projectValue) } } - storage.ProjectID = strings.TrimSpace(storage.ProjectID) + + finalProjectID := projectID + if responseProjectID != "" { + if explicitProject && !strings.EqualFold(responseProjectID, projectID) { + log.Warnf("Gemini onboarding returned project %s instead of requested %s; keeping requested project ID.", responseProjectID, projectID) + } else { + finalProjectID = responseProjectID + } + } + + storage.ProjectID = strings.TrimSpace(finalProjectID) if storage.ProjectID == "" { - storage.ProjectID = projectID + storage.ProjectID = strings.TrimSpace(projectID) } if storage.ProjectID == "" { return fmt.Errorf("onboard user completed without project id")