1package db
2
3import (
4 "sort"
5 "time"
6)
7
8type TimelineEvent struct {
9 *Repo
10 *Follow
11 *Star
12 EventAt time.Time
13}
14
15// TODO: this gathers heterogenous events from different sources and aggregates
16// them in code; if we did this entirely in sql, we could order and limit and paginate easily
17func MakeTimeline(e Execer) ([]TimelineEvent, error) {
18 var events []TimelineEvent
19 limit := 50
20
21 repos, err := GetAllRepos(e, limit)
22 if err != nil {
23 return nil, err
24 }
25
26 follows, err := GetAllFollows(e, limit)
27 if err != nil {
28 return nil, err
29 }
30
31 stars, err := GetAllStars(e, limit)
32 if err != nil {
33 return nil, err
34 }
35
36 for _, repo := range repos {
37 events = append(events, TimelineEvent{
38 Repo: &repo,
39 EventAt: repo.Created,
40 })
41 }
42
43 for _, follow := range follows {
44 events = append(events, TimelineEvent{
45 Follow: &follow,
46 EventAt: follow.FollowedAt,
47 })
48 }
49
50 for _, star := range stars {
51 events = append(events, TimelineEvent{
52 Star: &star,
53 EventAt: star.Created,
54 })
55 }
56
57 sort.Slice(events, func(i, j int) bool {
58 return events[i].EventAt.After(events[j].EventAt)
59 })
60
61 // Limit the slice to 100 events
62 if len(events) > limit {
63 events = events[:limit]
64 }
65
66 return events, nil
67}