-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaggregate.go
69 lines (59 loc) · 1.69 KB
/
aggregate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package focus
import (
"fmt"
"time"
)
type AggregateResponse struct {
Data []Data `json:"data"`
}
type Data struct {
FolderID string `json:"id"`
Name string `json:"name"`
RemainingTasks int `json:"remaining_tasks"`
Tasks []*Task `json:"tasks"`
}
type AggregatorService interface {
GetAllData(userID string) (*AggregateResponse, error)
}
type Aggregator struct {
ts TaskService
fs FolderService
us UserService
}
// GetAllData - Fetch AggregateResponse for a user
func (agtr *Aggregator) GetAllData(userID string) (*AggregateResponse, error) {
//Step 1 - Fetch All Folders for the user
folders, err := agtr.fs.GetAllByUserID(userID)
if err != nil {
return nil, err
}
response := &AggregateResponse{}
//Step2 - For every folder fetch task and create a data struct
for i := 0; i < len(folders); i++ {
fmt.Println("Filling Folder with name", folders[i].Name)
tasksForFolder, err := agtr.ts.GetAllByFolderID(folders[i].ID)
if err != nil {
return nil, err
}
if tasksForFolder == nil {
tasksForFolder = make([]*Task, 0)
}
// Find out the remaining tasks in the folder
// Remaining tasks = Tasks whose completed date is after the current date or nil
remainingTasks := 0
for _, task := range tasksForFolder {
if task.CompletedDate == nil || task.CompletedDate.After(time.Now()) {
remainingTasks++
}
}
response.Data = append(response.Data, Data{
FolderID: folders[i].ID,
Name: folders[i].Name,
RemainingTasks: remainingTasks,
Tasks: tasksForFolder})
}
return response, nil
}
func NewAggregatorService(ts TaskService, fs FolderService, us UserService) *Aggregator {
return &Aggregator{ts, fs, us}
}