68 lines
1.7 KiB
Go
68 lines
1.7 KiB
Go
package placement
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
libthreads "haixun-backend/internal/library/threadsapi"
|
|
)
|
|
|
|
func keywordSearchViaThreadsAPI(ctx context.Context, req DiscoverRequest) ([]DiscoverPost, error) {
|
|
token := strings.TrimSpace(req.Member.ThreadsAPIAccessToken)
|
|
if token == "" {
|
|
return nil, fmt.Errorf("threads api access token not configured for active account")
|
|
}
|
|
|
|
client := libthreads.NewClient(token)
|
|
searchType := "TOP"
|
|
if req.Recency {
|
|
searchType = "RECENT"
|
|
}
|
|
limit := req.Limit
|
|
if limit <= 0 {
|
|
limit = 12
|
|
}
|
|
|
|
// Strip site: prefix for API keyword search.
|
|
query := strings.TrimSpace(req.Query)
|
|
query = strings.TrimPrefix(query, "site:threads.net ")
|
|
query = strings.Trim(query, `"`)
|
|
if idx := strings.Index(query, " after:"); idx > 0 {
|
|
query = strings.TrimSpace(query[:idx])
|
|
}
|
|
query = strings.Trim(query, `"`)
|
|
|
|
items, err := client.KeywordSearch(ctx, libthreads.KeywordSearchOptions{
|
|
Query: query,
|
|
Limit: limit,
|
|
SearchType: searchType,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
out := make([]DiscoverPost, 0, len(items))
|
|
for _, item := range items {
|
|
text := strings.TrimSpace(item.Text)
|
|
if text == "" {
|
|
continue
|
|
}
|
|
permalink := strings.TrimSpace(item.Permalink)
|
|
if permalink == "" && item.Username != "" && item.ID != "" {
|
|
permalink = "https://www.threads.net/@" + item.Username + "/post/" + item.ID
|
|
}
|
|
out = append(out, DiscoverPost{
|
|
Text: text,
|
|
Permalink: permalink,
|
|
ExternalID: strings.TrimSpace(item.ID),
|
|
Author: strings.TrimSpace(item.Username),
|
|
PostedAt: strings.TrimSpace(item.Timestamp),
|
|
LikeCount: item.LikeCount,
|
|
ReplyCount: item.ReplyCount,
|
|
Source: DiscoverThreadsAPI,
|
|
})
|
|
}
|
|
return out, nil
|
|
}
|