Merge branch 'trendingwords' into 'master'

Trendingwords

See merge request khanzf/fedilogue!17
This commit is contained in:
Fikrān Mutasā'il 2021-12-18 04:37:11 +00:00
commit 560c90ed8e
2 changed files with 60 additions and 44 deletions

View File

@ -28,7 +28,7 @@ type PublicKeyType struct {
type ActorJson struct {
id int
uri string `json:"id"`
Uri string `json:"id"`
Type string `json:"type"`
Inbox string `json:"inbox"`
Outbox string `json:"outbox"`
@ -53,7 +53,7 @@ type TagType struct {
type PostJson struct {
id int
uri string `json:"id"`
Uri string `json:"id"`
InReplyTo string `json:"inReplyTo"`
normalized string

View File

@ -12,61 +12,72 @@ import (
"github.com/jackc/pgx/v4"
)
var trendingexport string
var trendsText string
func enableCors(w *http.ResponseWriter) {
(*w).Header().Set("Access-Control-Allow-Origin", "*")
}
func gettrends() {
var err error
var rows pgx.Rows
for {
rows, err = pool.Query(context.Background(), "SELECT word, ndoc FROM ts_stat($$ SELECT normalized_tsvector FROM activities WHERE activities.identifiedat > current_timestamp - interval '60 minutes' $$) ORDER BY ndoc DESC LIMIT 10")
if err != nil {
panic(err)
}
defer rows.Close()
trenditems := make([]interface{}, 0)
//fmt.Println(trenditems)
for rows.Next() {
var word string
var ndoc int
err = rows.Scan(&word, &ndoc)
if err != nil {
panic(err)
}
trenditem := make(map[string]interface{})
trenditem["ndoc"] = ndoc
trenditem["word"] = word
trenditems = append(trenditems, trenditem)
}
func runMetrics() {
hashtagtotal := runTrendingMetrics()
totalJson := make(map[string]interface{})
totalJson["trends"] = trenditems
totalJson["hashtags"] = hashtagtotal
data, err := json.Marshal(totalJson)
if err != nil {
log.Fatalf("error marshaling combined activity: %v\n", err)
}
trendingexport = string(data)
trendsText = string(data)
}
time.Sleep(time.Second * 60)
func runTrendingMetrics() map[string]interface{} {
sql := `SELECT UNNEST(activities.hashtags) as hashtags, count(actors.id)
from activities
LEFT JOIN actors ON activities.document->>'attributedTo'=actors.document->>'id'
WHERE actors.bot=false
AND activities.identifiedat > LOCALTIMESTAMP - INTERVAL '30 MINUTES'
GROUP BY hashtags ORDER BY count DESC LIMIT 20;`
rows, err := pool.Query(context.Background(), sql)
if err != nil {
panic(err)
}
hashtagitems := make([]interface{}, 0);
hashcount := 0
for rows.Next() {
var hashtag string
var count int
err = rows.Scan(&hashtag, &count)
if err != nil {
panic(err)
}
hashtagitem := make(map[string]interface{})
hashtagitem["hashtag"] = hashtag
hashtagitem["count"] = count
hashtagitems = append(hashtagitems, hashtagitem)
hashcount = hashcount + 1
}
rows.Close()
hashtagtotal := make(map[string]interface{});
hashtagtotal["count"] = hashcount
hashtagtotal["datetime"] = time.Now().UTC()
hashtagtotal["items"] = hashtagitems
return hashtagtotal
}
func trending(w http.ResponseWriter, r *http.Request) {
// GET handlers
func getTrending(w http.ResponseWriter, r *http.Request) {
enableCors(&w)
fmt.Fprintf(w, "%s", trendingexport)
fmt.Fprintf(w, "%s", trendsText)
}
func search(w http.ResponseWriter, r *http.Request) {
func getSearch(w http.ResponseWriter, r *http.Request) {
enableCors(&w)
searchkeys, exists_search := r.URL.Query()["s"]
offsetkeys, exists_offset := r.URL.Query()["o"]
@ -148,10 +159,15 @@ func search(w http.ResponseWriter, r *http.Request) {
func main() {
pool = getDbPool()
go gettrends()
go func() {
for {
runMetrics()
time.Sleep(30 * time.Second)
}
}()
http.HandleFunc("/api/v1/search", search)
http.HandleFunc("/api/v1/trending", trending)
http.HandleFunc("/api/v1/search", getSearch)
http.HandleFunc("/api/v1/trending", getTrending)
log.Print("Starting HTTP inbox on port http://0.0.0.0:6431")
log.Fatal(http.ListenAndServe("0.0.0.0:6431", nil))
}