misso/misskey/base.go

72 lines
1.7 KiB
Go

package misskey
import (
"bytes"
"encoding/json"
"fmt"
"misso/config"
"misso/global"
"net/http"
)
type Error_Response struct {
Error struct {
Message string `json:"message"`
Code string `json:"code"`
ID string `json:"id"`
Kind string `json:"kind"`
} `json:"error"`
}
func PostAPIRequest[T I_Response | AuthSessionGenerate_Response | AuthSessionUserkey_Response](
apiEndpointPath string, reqBody any,
) (*T, error) {
// Prepare request
apiEndpoint := fmt.Sprintf("https://%s/api/%s", config.Config.Misskey.Instance, apiEndpointPath)
reqBodyBytes, err := json.Marshal(reqBody)
if err != nil {
global.Logger.Errorf("Failed to marshall request body with error: %v", err)
return nil, err
}
req, err := http.NewRequest("POST", apiEndpoint, bytes.NewReader(reqBodyBytes))
if err != nil {
global.Logger.Errorf("Failed to prepare request with error: %v", err)
return nil, err
}
req.Header.Set("Content-Type", "application/json")
// Do request
res, err := (&http.Client{}).Do(req)
if err != nil {
global.Logger.Errorf("Failed to finish request with error: %v", err)
return nil, err
}
// Parse response
if res.StatusCode == http.StatusOK {
var resBody T
err = json.NewDecoder(res.Body).Decode(&resBody)
if err != nil {
global.Logger.Errorf("Failed to decode response body with error: %v", err)
return nil, err
}
return &resBody, nil
} else {
global.Logger.Errorf("Request failed with code: %d.", res.StatusCode)
var errBody Error_Response
err = json.NewDecoder(res.Body).Decode(&errBody)
if err != nil {
global.Logger.Errorf("Failed to decode error body with error: %v", err)
return nil, err
}
global.Logger.Errorf("Failed details: %v", errBody)
return nil, fmt.Errorf(errBody.Error.Message)
}
}