package main import "time" type Service struct { Db Database } type DateInfo struct { Date Date Tomorrow Date Yesterday Date IsToday bool } type EntryPage struct { Entry *Entry Detached bool Tracking *Entry DateInfo DateInfo } type RootPage struct { DateInfo DateInfo Entry *EntryPage Entries []*Entry Task *TaskPage Tasks []*Task } type TasksPage struct { Tasks []*Task } type TaskPage struct { Task *Task } func NewService(db Database) *Service { return &Service{ Db: db, } } func NewDateInfo(t time.Time) DateInfo { return DateInfo{ Date: DateFromStd(t), Tomorrow: DateFromStd(t.Add(24 * time.Hour)), Yesterday: DateFromStd(t.Add(-24 * time.Hour)), IsToday: DateFromStd(time.Now()) == DateFromStd(t), } } func (srv *Service) GetTaskPage(id *int, task *Task) (*TaskPage, error) { if task == nil { tasks, err := srv.Db.QueryTask(id, nil, nil) if err != nil { return nil, err } if len(tasks) < 1 { return nil, ErrNotFound } task = tasks[0] } return &TaskPage{ Task: task, }, nil } func (srv *Service) GetTasksPage() (*TasksPage, error) { tasks, err := srv.Db.GetTasks() if err != nil { return nil, err } return &TasksPage{ Tasks: tasks, }, nil } func (srv *Service) GetEntryPage(detached *Entry, dt DateInfo) (*EntryPage, error) { tracking, err := srv.Db.GetTracking() if err != nil { return nil, err } page := &EntryPage{ Entry: tracking, Detached: false, Tracking: tracking, DateInfo: dt, } if detached != nil { page.Entry = detached page.Detached = true } return page, nil } func (srv *Service) GetRootPage(date Date) (*RootPage, error) { var entry *Entry = nil if string(date) != time.Now().Format("2006-01-02") { // If not today detach entry = NewEntry(date) } entryPage, err := srv.GetEntryPage(entry, NewDateInfo(date.ToStd())) if err != nil { return nil, err } entries, err := srv.Db.QueryEntry(nil, &date) if err != nil { return nil, err } tasks, err := srv.Db.GetTasks() if err != nil { return nil, err } task, err := srv.GetTaskPage(nil, NewTask()) if err != nil { return nil, err } return &RootPage{ DateInfo: entryPage.DateInfo, Entry: entryPage, Entries: entries, Task: task, Tasks: tasks, }, nil }