48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package controller
|
|
|
|
import (
|
|
"arimelody-web/model"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
)
|
|
|
|
const BSKY_API_BASE = "https://public.api.bsky.app"
|
|
|
|
func FetchThreadViewPost(actorID string, postID string) (*model.ThreadViewPost, error) {
|
|
uri := fmt.Sprintf("at://%s/app.bsky.feed.post/%s", actorID, postID)
|
|
|
|
req, err := http.NewRequest(
|
|
http.MethodGet,
|
|
strings.Join([]string{BSKY_API_BASE, "xrpc", "app.bsky.feed.getPostThread"}, "/"),
|
|
nil,
|
|
)
|
|
if err != nil { panic(err) }
|
|
|
|
req.URL.RawQuery = url.Values{
|
|
"uri": { uri },
|
|
}.Encode()
|
|
req.Header.Set("User-Agent", "ari melody [https://arimelody.me]")
|
|
req.Header.Set("Accept", "application/json")
|
|
|
|
client := &http.Client{}
|
|
|
|
res, err := client.Do(req)
|
|
if err != nil {
|
|
return nil, errors.New(fmt.Sprintf("Failed to call Bluesky API: %v", err))
|
|
}
|
|
|
|
type Data struct {
|
|
Thread model.ThreadViewPost `json:"thread"`
|
|
}
|
|
data := Data{}
|
|
err = json.NewDecoder(res.Body).Decode(&data)
|
|
if err != nil {
|
|
return nil, errors.New(fmt.Sprintf("Invalid response from server: %v", err))
|
|
}
|
|
|
|
return &data.Thread, nil
|
|
}
|