72 lines
1.7 KiB
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)
|
|
}
|
|
|
|
}
|