62 lines
1.5 KiB
Go
62 lines
1.5 KiB
Go
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 {
|
|
// Check if the response is JSON
|
|
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)),
|
|
}
|
|
}
|
|
|
|
// return error if token/auth refresh is needed
|
|
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
|
|
}
|