@@ -10,6 +10,7 @@ import (
1010 "net/http"
1111 "slices"
1212 "sort"
13+ "time"
1314
1415 "github.com/google/uuid"
1516
@@ -121,21 +122,24 @@ func (s *Event) fetchAvatar(ctx context.Context, url string) (*http.Response, er
121122
122123func (s * Event ) calculateDailyFollowerChanges (events []model.AggregatedEvent ) []dto.DailyFollowerChange {
123124 dailyChangesMap := s .calculateDailyFollowerChangesMap (events )
125+ startDate := events [0 ].Date
126+ endDate := time .Now ()
127+ fullChangesMap := s .fillDailyFollowerChangesGaps (startDate , endDate , dailyChangesMap )
124128
125- result := slices .Collect (maps .Values (dailyChangesMap ))
129+ result := slices .Collect (maps .Values (fullChangesMap ))
126130 sort .Slice (result , func (i , j int ) bool {
127131 return result [i ].Date .Before (result [j ].Date )
128132 })
129133
130134 return result
131135}
132136
133- func (s * Event ) calculateDailyFollowerChangesMap (events []model.AggregatedEvent ) map [int64 ]dto.DailyFollowerChange {
137+ func (s * Event ) calculateDailyFollowerChangesMap (events []model.AggregatedEvent ) map [string ]dto.DailyFollowerChange {
134138 totalFollowers := 0
135- dailyChanges := make (map [int64 ]dto.DailyFollowerChange , len (events ))
139+ dailyChanges := make (map [string ]dto.DailyFollowerChange , len (events ))
136140
137141 for _ , event := range events {
138- index := event .Date .Unix ( )
142+ index := event .Date .Format ( "2006-01-02" )
139143
140144 change , ok := dailyChanges [index ]
141145 if ! ok {
@@ -159,3 +163,30 @@ func (s *Event) calculateDailyFollowerChangesMap(events []model.AggregatedEvent)
159163
160164 return dailyChanges
161165}
166+
167+ func (s * Event ) fillDailyFollowerChangesGaps (
168+ startDate time.Time ,
169+ endDate time.Time ,
170+ dailyChanges map [string ]dto.DailyFollowerChange ,
171+ ) map [string ]dto.DailyFollowerChange {
172+ timeline := make (map [string ]dto.DailyFollowerChange )
173+ lastTotalFollowers := 0
174+
175+ for currentDate := startDate ; ! currentDate .After (endDate ); currentDate = currentDate .AddDate (0 , 0 , 1 ) {
176+ dateKey := currentDate .Format ("2006-01-02" )
177+
178+ if change , exists := dailyChanges [dateKey ]; exists {
179+ timeline [dateKey ] = change
180+ lastTotalFollowers = change .Total
181+
182+ continue
183+ }
184+
185+ timeline [dateKey ] = dto.DailyFollowerChange {
186+ Date : currentDate ,
187+ Total : lastTotalFollowers ,
188+ }
189+ }
190+
191+ return timeline
192+ }
0 commit comments