twitterchiver/viewer: add stats to index page
This commit is contained in:
parent
0da26f3e42
commit
23c7f8e520
2 changed files with 51 additions and 5 deletions
|
@ -7,3 +7,14 @@
|
||||||
<li><strong><a href="/view/{{.Username}}">{{.Username}}</a></strong> ({{.TweetCount}} tweets, latest tweet at {{.LatestTweet}})
|
<li><strong><a href="/view/{{.Username}}">{{.Username}}</a></strong> ({{.TweetCount}} tweets, latest tweet at {{.LatestTweet}})
|
||||||
{{end}}
|
{{end}}
|
||||||
</ul>
|
</ul>
|
||||||
|
<h2>Stats</h2>
|
||||||
|
<dl>
|
||||||
|
<dt>Tweets</dt>
|
||||||
|
<dd>{{.TotalTweets}} tweets ({{.TimelineTweets}} on timeline)</dd>
|
||||||
|
|
||||||
|
<dt>Unfetched Media</dt>
|
||||||
|
<dd>{{.UnfetchedMedia}}</dd>
|
||||||
|
|
||||||
|
<dt>Unfetched Related</dt>
|
||||||
|
<dd>{{.UnfetchedRelated}}</dd>
|
||||||
|
</dl>
|
||||||
|
|
|
@ -110,7 +110,34 @@ func main() {
|
||||||
user := userFromContext(ctx)
|
user := userFromContext(ctx)
|
||||||
twitterAccounts := userMapping[user]
|
twitterAccounts := userMapping[user]
|
||||||
|
|
||||||
rows, err := pool.Query(ctx, "SELECT ua.username, COUNT(uat.tweetid) tweet_count, (SELECT CAST(object->>'created_at' AS timestamp with time zone) FROM tweets WHERE id=MAX(uat.tweetid)) latest_tweet FROM user_accounts ua LEFT JOIN user_accounts_tweets uat ON uat.userid=ua.userid WHERE ua.username = ANY($1::text[]) GROUP BY 1 ORDER BY 1", twitterAccounts)
|
var allTweets, timelineTweets, unfetchedMedia, unfetchedRelated int
|
||||||
|
|
||||||
|
if err := pool.QueryRow(ctx, `
|
||||||
|
SELECT
|
||||||
|
(SELECT COUNT(id) FROM tweets) all_tweets,
|
||||||
|
(SELECT COUNT(DISTINCT tweetid) FROM user_accounts_tweets WHERE on_timeline) timeline_tweets,
|
||||||
|
(SELECT COUNT(id) FROM tweets WHERE NOT fetched_media) not_fetched_media,
|
||||||
|
(SELECT COUNT(id) FROM tweets WHERE NOT fetched_related_tweets) not_fetched_related
|
||||||
|
`).Scan(&allTweets, &timelineTweets, &unfetchedMedia, &unfetchedRelated); err != nil {
|
||||||
|
writeError(rw, http.StatusInternalServerError, "querying stats", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
rows, err := pool.Query(ctx, `
|
||||||
|
SELECT
|
||||||
|
ua.username,
|
||||||
|
COUNT(uat.tweetid) tweet_count,
|
||||||
|
(SELECT CAST(object->>'created_at' AS timestamp with time zone) FROM tweets WHERE id=MAX(uat.tweetid)) latest_tweet
|
||||||
|
FROM
|
||||||
|
user_accounts ua
|
||||||
|
LEFT JOIN
|
||||||
|
user_accounts_tweets uat ON uat.userid=ua.userid
|
||||||
|
WHERE 1=1
|
||||||
|
AND ua.username = ANY($1::text[])
|
||||||
|
AND uat.on_timeline
|
||||||
|
GROUP BY 1
|
||||||
|
ORDER BY 1
|
||||||
|
`, twitterAccounts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
writeError(rw, http.StatusInternalServerError, "querying database", err)
|
writeError(rw, http.StatusInternalServerError, "querying database", err)
|
||||||
return
|
return
|
||||||
|
@ -135,11 +162,19 @@ func main() {
|
||||||
rows.Close()
|
rows.Close()
|
||||||
|
|
||||||
indexTmpl.Execute(rw, struct {
|
indexTmpl.Execute(rw, struct {
|
||||||
Username string
|
Username string
|
||||||
TwitterAccounts []twitterData
|
TwitterAccounts []twitterData
|
||||||
|
TotalTweets int
|
||||||
|
TimelineTweets int
|
||||||
|
UnfetchedMedia int
|
||||||
|
UnfetchedRelated int
|
||||||
}{
|
}{
|
||||||
Username: user,
|
Username: user,
|
||||||
TwitterAccounts: tds,
|
TwitterAccounts: tds,
|
||||||
|
TotalTweets: allTweets,
|
||||||
|
TimelineTweets: timelineTweets,
|
||||||
|
UnfetchedMedia: unfetchedMedia,
|
||||||
|
UnfetchedRelated: unfetchedRelated,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
isAllowedToSee := func(ctx context.Context, twitterUser string) bool {
|
isAllowedToSee := func(ctx context.Context, twitterUser string) bool {
|
||||||
|
|
Loading…
Reference in a new issue