thread-master/backend/internal/library/placement/external_id.go

50 lines
1.2 KiB
Go

package placement
import (
"context"
"strings"
libthreads "haixun-backend/internal/library/threadsapi"
)
// PreferReplyExternalID keeps a numeric Threads media id when merging scan rows.
func PreferReplyExternalID(existing, incoming string) string {
a := strings.TrimSpace(existing)
b := strings.TrimSpace(incoming)
if libthreads.IsNumericMediaID(a) {
return a
}
if libthreads.IsNumericMediaID(b) {
return b
}
if b != "" {
return b
}
return a
}
// EnrichDiscoverPostsMediaIDs resolves shortcode-only crawler rows via Threads API when possible.
func EnrichDiscoverPostsMediaIDs(ctx context.Context, accessToken string, posts []DiscoverPost) []DiscoverPost {
token := strings.TrimSpace(accessToken)
if token == "" || len(posts) == 0 {
return posts
}
client := libthreads.NewClient(token)
out := make([]DiscoverPost, len(posts))
copy(out, posts)
for i := range out {
if libthreads.IsNumericMediaID(out[i].ExternalID) {
continue
}
id, err := client.ResolveReplyMedia(ctx, libthreads.ResolveReplyMediaInput{
ExternalID: out[i].ExternalID,
Permalink: out[i].Permalink,
HintText: out[i].Text,
})
if err != nil || !libthreads.IsNumericMediaID(id) {
continue
}
out[i].ExternalID = id
}
return out
}