omada-api/utils.go
2025-02-12 13:25:01 +01:00

73 lines
1.9 KiB
Go

package omadaapi
import (
"fmt"
"git.tordarus.net/tordarus/omada-api/model"
)
const ErrCodeAccessTokenExpired = -44112
const ErrCodeRefreshTokenExpired = -44114
func handleResponseErrors[T any](api *Api, response *model.Response[T], retry func() (*model.Response[T], error)) (*model.Response[T], error) {
switch response.ErrorCode {
case 0:
return response, nil
case ErrCodeAccessTokenExpired:
if err := api.Refresh(); err != nil {
return nil, fmt.Errorf("could not refresh access token: %w", err)
}
newResp, err := retry()
if err != nil {
return nil, err
}
return handleResponseErrors(api, newResp, retry)
case ErrCodeRefreshTokenExpired:
if err := api.InitSession(); err != nil {
return nil, fmt.Errorf("could not initialize new session: %w", err)
}
newResp, err := retry()
if err != nil {
return nil, err
}
return handleResponseErrors(api, newResp, retry)
default:
return nil, fmt.Errorf("invalid error code %d with message: %s", response.ErrorCode, response.Message)
}
}
func handlePagedResponseErrors[T any](api *Api, response *model.PagedResponse[T], retry func() (*model.PagedResponse[T], error)) (*model.PagedResponse[T], error) {
switch response.ErrorCode {
case 0:
return response, nil
case ErrCodeAccessTokenExpired:
if err := api.Refresh(); err != nil {
return nil, fmt.Errorf("could not refresh access token: %w", err)
}
newResp, err := retry()
if err != nil {
return nil, err
}
return handlePagedResponseErrors(api, newResp, retry)
case ErrCodeRefreshTokenExpired:
if err := api.InitSession(); err != nil {
return nil, fmt.Errorf("could not initialize new session: %w", err)
}
newResp, err := retry()
if err != nil {
return nil, err
}
return handlePagedResponseErrors(api, newResp, retry)
default:
return nil, fmt.Errorf("invalid error code %d with message: %s", response.ErrorCode, response.Message)
}
}