73 lines
1.9 KiB
Go
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)
|
|
}
|
|
}
|