···910// 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
1415- repos, err := getTimelineRepos(e, limit, loggedInUserDid)
000000000000016 if err != nil {
17 return nil, err
18 }
1920- stars, err := getTimelineStars(e, limit, loggedInUserDid)
21 if err != nil {
22 return nil, err
23 }
2425- follows, err := getTimelineFollows(e, limit, loggedInUserDid)
26 if err != nil {
27 return nil, err
28 }
···70 return isStarred, starCount
71}
7273-func getTimelineRepos(e Execer, limit int, loggedInUserDid string) ([]models.TimelineEvent, error) {
74- repos, err := GetRepos(e, limit)
0000075 if err != nil {
76 return nil, err
77 }
···125 return events, nil
126}
127128-func getTimelineStars(e Execer, limit int, loggedInUserDid string) ([]models.TimelineEvent, error) {
129- stars, err := GetStars(e, limit)
00000130 if err != nil {
131 return nil, err
132 }
···166 return events, nil
167}
168169-func getTimelineFollows(e Execer, limit int, loggedInUserDid string) ([]models.TimelineEvent, error) {
170- follows, err := GetFollows(e, limit)
00000171 if err != nil {
172 return nil, err
173 }
···910// 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
1415+ 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 }
3233+ stars, err := getTimelineStars(e, limit, loggedInUserDid, userIsFollowing)
34 if err != nil {
35 return nil, err
36 }
3738+ follows, err := getTimelineFollows(e, limit, loggedInUserDid, userIsFollowing)
39 if err != nil {
40 return nil, err
41 }
···83 return isStarred, starCount
84}
8586+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}
145146+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}
191192+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
···258func (s *State) Timeline(w http.ResponseWriter, r *http.Request) {
259 user := s.oauth.GetUser(r)
260000261 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}
327328func (s *State) Home(w http.ResponseWriter, r *http.Request) {
329- timeline, err := db.MakeTimeline(s.db, 5, "")
000330 if err != nil {
331 log.Println(err)
332 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.")
···258func (s *State) Timeline(w http.ResponseWriter, r *http.Request) {
259 user := s.oauth.GetUser(r)
260261+ // 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}
330331func (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.")