offline-twitter/internal/webserver/handler_user_feed.go

73 lines
1.7 KiB
Go

package webserver
import (
"errors"
"net/http"
"strings"
"gitlab.com/offline-twitter/twitter_offline_engine/pkg/persistence"
"gitlab.com/offline-twitter/twitter_offline_engine/pkg/scraper"
)
type UserProfileData struct {
persistence.Feed
scraper.UserID
}
func (t UserProfileData) Tweet(id scraper.TweetID) scraper.Tweet {
return t.Tweets[id]
}
func (t UserProfileData) User(id scraper.UserID) scraper.User {
return t.Users[id]
}
func (t UserProfileData) Retweet(id scraper.TweetID) scraper.Retweet {
return t.Retweets[id]
}
func (t UserProfileData) Space(id scraper.SpaceID) scraper.Space {
return t.Spaces[id]
}
func (t UserProfileData) FocusedTweetID() scraper.TweetID {
return scraper.TweetID(0)
}
func (app *Application) UserFeed(w http.ResponseWriter, r *http.Request) {
app.traceLog.Printf("'UserFeed' handler (path: %q)", r.URL.Path)
parts := strings.Split(strings.Trim(r.URL.Path, "/"), "/")
if len(parts) != 1 {
app.error_404(w)
}
user, err := app.Profile.GetUserByHandle(scraper.UserHandle(parts[0]))
if err != nil {
app.error_404(w)
return
}
c := persistence.NewUserFeedCursor(user.Handle)
err = parse_cursor_value(&c, r)
if err != nil {
app.error_400_with_message(w, "invalid cursor (must be a number)")
return
}
feed, err := app.Profile.NextPage(c)
if err != nil {
if errors.Is(err, persistence.ErrEndOfFeed) {
// TODO
} else {
panic(err)
}
}
feed.Users[user.ID] = user
data := UserProfileData{Feed: feed, UserID: user.ID}
if r.Header.Get("HX-Request") == "true" && c.CursorPosition == persistence.CURSOR_MIDDLE {
// It's a Show More request
app.buffered_render_tweet_htmx(w, "timeline", data)
} else {
app.buffered_render_tweet_page(w, "tpl/user_feed.tpl", data)
}
}