forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

appview/db: allow filtering timeline to following-only

Signed-off-by: Will Andrews <did:plc:dadhhalkfcq3gucaq25hjqon>

authored by willdot.net and committed by Tangled 26250669 e217fc41

Changed files
+46 -12
appview
+38 -10
appview/db/timeline.go
··· 9 10 // TODO: this gathers heterogenous events from different sources and aggregates 11 // them in code; if we did this entirely in sql, we could order and limit and paginate easily 12 - func MakeTimeline(e Execer, limit int, loggedInUserDid string) ([]models.TimelineEvent, error) { 13 var events []models.TimelineEvent 14 15 - repos, err := getTimelineRepos(e, limit, loggedInUserDid) 16 if err != nil { 17 return nil, err 18 } 19 20 - stars, err := getTimelineStars(e, limit, loggedInUserDid) 21 if err != nil { 22 return nil, err 23 } 24 25 - follows, err := getTimelineFollows(e, limit, loggedInUserDid) 26 if err != nil { 27 return nil, err 28 } ··· 70 return isStarred, starCount 71 } 72 73 - func getTimelineRepos(e Execer, limit int, loggedInUserDid string) ([]models.TimelineEvent, error) { 74 - repos, err := GetRepos(e, limit) 75 if err != nil { 76 return nil, err 77 } ··· 125 return events, nil 126 } 127 128 - func getTimelineStars(e Execer, limit int, loggedInUserDid string) ([]models.TimelineEvent, error) { 129 - stars, err := GetStars(e, limit) 130 if err != nil { 131 return nil, err 132 } ··· 166 return events, nil 167 } 168 169 - func getTimelineFollows(e Execer, limit int, loggedInUserDid string) ([]models.TimelineEvent, error) { 170 - follows, err := GetFollows(e, limit) 171 if err != nil { 172 return nil, err 173 }
··· 9 10 // TODO: this gathers heterogenous events from different sources and aggregates 11 // them in code; if we did this entirely in sql, we could order and limit and paginate easily 12 + func MakeTimeline(e Execer, limit int, loggedInUserDid string, limitToUsersIsFollowing bool) ([]models.TimelineEvent, error) { 13 var events []models.TimelineEvent 14 15 + var userIsFollowing []string 16 + if limitToUsersIsFollowing { 17 + following, err := GetFollowing(e, loggedInUserDid) 18 + if err != nil { 19 + return nil, err 20 + } 21 + 22 + userIsFollowing = make([]string, 0, len(following)) 23 + for _, follow := range following { 24 + userIsFollowing = append(userIsFollowing, follow.SubjectDid) 25 + } 26 + } 27 + 28 + repos, err := getTimelineRepos(e, limit, loggedInUserDid, userIsFollowing) 29 if err != nil { 30 return nil, err 31 } 32 33 + stars, err := getTimelineStars(e, limit, loggedInUserDid, userIsFollowing) 34 if err != nil { 35 return nil, err 36 } 37 38 + follows, err := getTimelineFollows(e, limit, loggedInUserDid, userIsFollowing) 39 if err != nil { 40 return nil, err 41 } ··· 83 return isStarred, starCount 84 } 85 86 + func getTimelineRepos(e Execer, limit int, loggedInUserDid string, userIsFollowing []string) ([]models.TimelineEvent, error) { 87 + filters := make([]filter, 0) 88 + if userIsFollowing != nil { 89 + filters = append(filters, FilterIn("did", userIsFollowing)) 90 + } 91 + 92 + repos, err := GetRepos(e, limit, filters...) 93 if err != nil { 94 return nil, err 95 } ··· 143 return events, nil 144 } 145 146 + func getTimelineStars(e Execer, limit int, loggedInUserDid string, userIsFollowing []string) ([]models.TimelineEvent, error) { 147 + filters := make([]filter, 0) 148 + if userIsFollowing != nil { 149 + filters = append(filters, FilterIn("starred_by_did", userIsFollowing)) 150 + } 151 + 152 + stars, err := GetStars(e, limit, filters...) 153 if err != nil { 154 return nil, err 155 } ··· 189 return events, nil 190 } 191 192 + func getTimelineFollows(e Execer, limit int, loggedInUserDid string, userIsFollowing []string) ([]models.TimelineEvent, error) { 193 + filters := make([]filter, 0) 194 + if userIsFollowing != nil { 195 + filters = append(filters, FilterIn("user_did", userIsFollowing)) 196 + } 197 + 198 + follows, err := GetFollows(e, limit, filters...) 199 if err != nil { 200 return nil, err 201 }
+8 -2
appview/state/state.go
··· 258 func (s *State) Timeline(w http.ResponseWriter, r *http.Request) { 259 user := s.oauth.GetUser(r) 260 261 var userDid string 262 if user != nil { 263 userDid = user.Did 264 } 265 - timeline, err := db.MakeTimeline(s.db, 50, userDid) 266 if err != nil { 267 log.Println(err) 268 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.") ··· 326 } 327 328 func (s *State) Home(w http.ResponseWriter, r *http.Request) { 329 - timeline, err := db.MakeTimeline(s.db, 5, "") 330 if err != nil { 331 log.Println(err) 332 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.")
··· 258 func (s *State) Timeline(w http.ResponseWriter, r *http.Request) { 259 user := s.oauth.GetUser(r) 260 261 + // TODO: set this flag based on the UI 262 + filtered := false 263 + 264 var userDid string 265 if user != nil { 266 userDid = user.Did 267 } 268 + timeline, err := db.MakeTimeline(s.db, 50, userDid, filtered) 269 if err != nil { 270 log.Println(err) 271 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.") ··· 329 } 330 331 func (s *State) Home(w http.ResponseWriter, r *http.Request) { 332 + // TODO: set this flag based on the UI 333 + filtered := false 334 + 335 + timeline, err := db.MakeTimeline(s.db, 5, "", filtered) 336 if err != nil { 337 log.Println(err) 338 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.")