|
|
package api |
|
|
|
|
|
import ( |
|
|
"encoding/json" |
|
|
"log" |
|
|
"net/http" |
|
|
"plandex-cli/auth" |
|
|
"plandex-cli/term" |
|
|
"strings" |
|
|
|
|
|
shared "plandex-shared" |
|
|
) |
|
|
|
|
|
func HandleApiError(r *http.Response, errBody []byte) *shared.ApiError { |
|
|
|
|
|
if r.Header.Get("Content-Type") != "application/json" { |
|
|
return &shared.ApiError{ |
|
|
Type: shared.ApiErrorTypeOther, |
|
|
Status: r.StatusCode, |
|
|
Msg: strings.TrimSpace(string(errBody)), |
|
|
} |
|
|
} |
|
|
|
|
|
var apiError shared.ApiError |
|
|
if err := json.Unmarshal(errBody, &apiError); err != nil { |
|
|
log.Printf("Error unmarshalling JSON: %v\n", err) |
|
|
return &shared.ApiError{ |
|
|
Type: shared.ApiErrorTypeOther, |
|
|
Status: r.StatusCode, |
|
|
Msg: strings.TrimSpace(string(errBody)), |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if apiError.Type == shared.ApiErrorTypeInvalidToken || apiError.Type == shared.ApiErrorTypeAuthOutdated { |
|
|
return &apiError |
|
|
} |
|
|
|
|
|
term.HandleApiError(&apiError) |
|
|
|
|
|
return &apiError |
|
|
} |
|
|
|
|
|
func refreshAuthIfNeeded(apiErr *shared.ApiError) (bool, *shared.ApiError) { |
|
|
if apiErr.Type == shared.ApiErrorTypeInvalidToken { |
|
|
err := auth.RefreshInvalidToken() |
|
|
if err != nil { |
|
|
return false, &shared.ApiError{Type: shared.ApiErrorTypeOther, Msg: "error refreshing invalid token"} |
|
|
} |
|
|
return true, nil |
|
|
} else if apiErr.Type == shared.ApiErrorTypeAuthOutdated { |
|
|
err := auth.RefreshAuth() |
|
|
if err != nil { |
|
|
return false, &shared.ApiError{Type: shared.ApiErrorTypeOther, Msg: "error refreshing auth"} |
|
|
} |
|
|
|
|
|
return true, nil |
|
|
} |
|
|
|
|
|
return false, apiErr |
|
|
} |
|
|
|