-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtasks_db.go
106 lines (85 loc) · 2.44 KB
/
tasks_db.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package tomeit
import (
"fmt"
"time"
)
type taskDBInterface interface {
createTask(userID int, title string, priority int, dueOn time.Time) (*Task, error)
getTaskByID(id int) (*Task, error)
getTasksByUser(user *User, options *getTasksOptions) ([]Task, error)
getActualPomodoroNumByID(id int) (int, error)
updateTask(task *Task) error
deleteTask(task *Task) error
}
func (db *DB) createTask(userID int, title string, expectedPomodoroNum int, dueOn time.Time) (*Task, error) {
now := time.Now()
task := Task{
UserID: userID,
Title: title,
ExpectedPomodoroNum: expectedPomodoroNum,
DueOn: &dueOn,
IsCompleted: false,
CompletedOn: nil,
CreatedAt: now,
UpdatedAt: now,
}
q := db.DB
if dueOn.IsZero() {
q = q.Omit("DueOn")
}
if err := q.Create(&task).Error; err != nil {
return nil, fmt.Errorf("db.Create failed: %w", err)
}
return &task, nil
}
func (db *DB) getTaskByID(id int) (*Task, error) {
var t Task
if err := db.First(&t, id).Error; err != nil {
return nil, fmt.Errorf("db.First failed: %w", err)
}
return &t, nil
}
type getTasksOptions struct {
isCompletedExists bool
isCompleted bool
completedOnExists bool
completedOn time.Time
}
func (db *DB) getTasksByUser(user *User, options *getTasksOptions) ([]Task, error) {
q := db.Where("user_id = ?", user.ID)
if options != nil {
if options.isCompletedExists {
q = q.Where("is_completed = ?", options.isCompleted)
}
if options.completedOnExists {
y, m, d := options.completedOn.Date()
start := time.Date(y, m, d, 0, 0, 0, 0, time.UTC)
end := time.Date(y, m, d, 23, 59, 59, 0, time.UTC)
q = q.Where("completed_on BETWEEN ? AND ?", start, end)
}
}
var tasks []Task
if err := q.Order("created_at").Limit(30).Find(&tasks).Error; err != nil {
return nil, fmt.Errorf("db.Find failed: %w", err)
}
return tasks, nil
}
func (db *DB) getActualPomodoroNumByID(id int) (int, error) {
var c int64
if err := db.Model(&Pomodoro{}).Where("task_id = ?", id).Count(&c).Error; err != nil {
return 0, fmt.Errorf("db.Count failed: %w", err)
}
return int(c), nil
}
func (db *DB) updateTask(task *Task) error {
if err := db.Save(task).Error; err != nil {
return fmt.Errorf("db.Save() failed: %w", err)
}
return nil
}
func (db *DB) deleteTask(task *Task) error {
if err := db.Delete(task).Error; err != nil {
return fmt.Errorf("db.Delete failed: %w", err)
}
return nil
}