-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.go
130 lines (115 loc) · 2.76 KB
/
app.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package app
import (
"context"
"fmt"
"github.com/echovisionlab/aws-weather-updater/pkg/browser"
"github.com/echovisionlab/aws-weather-updater/pkg/database"
"github.com/echovisionlab/aws-weather-updater/pkg/env"
"github.com/echovisionlab/aws-weather-updater/pkg/task"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/launcher"
"github.com/madflojo/tasks"
"log/slog"
"os"
"strconv"
"time"
)
func Run(exit <-chan os.Signal) {
var (
db database.Database
b *rod.Browser
l *launcher.Launcher
err error
)
ctx, cancel := context.WithCancel(context.Background())
defer func() {
cancel()
if r := recover(); r != nil {
slog.Warn(fmt.Sprintf("recovered from panic: %s", r))
}
if db != nil {
if err = db.Close(); err != nil {
slog.Warn(fmt.Sprintf("error during db conn close: %s", err))
}
}
if b != nil {
if err = b.Close(); err != nil {
slog.Warn(fmt.Sprintf("error during browser close: %s", err))
}
}
if l != nil {
if l != nil {
l.Cleanup()
}
}
slog.Info("bye")
}()
// init DB
db, err = database.NewDatabase()
if err != nil {
slog.Error(err.Error())
return
}
slog.Info("established database connection")
// init browser
b, l, err = browser.New()
if err != nil {
slog.Error(err.Error())
return
}
slog.Info("initialized browser")
interval, err := getInterval()
if err != nil {
slog.Error(err.Error())
return
}
slog.Info(fmt.Sprintf("setting interval: %s", interval))
retry, err := getRetryCount()
if err != nil {
slog.Error(err.Error())
return
}
slog.Info(fmt.Sprintf("setting retry count: %d", retry))
keepUntilDays, err := getKeepUntilDays()
if err != nil {
slog.Error(err.Error())
return
}
slog.Info(fmt.Sprintf("setting keep until days: %d", keepUntilDays))
slog.Info("starting update...")
scheduler := tasks.New()
if err = scheduler.AddWithID("update", task.Update(ctx, db, b, interval, retry, keepUntilDays)); err != nil {
slog.Error(fmt.Sprintf("failed to add task: %s", err.Error()))
return
}
<-exit
}
func getInterval() (time.Duration, error) {
s := os.Getenv(env.Interval)
if len(s) == 0 {
slog.Info("missing INTERVAL_SECONDS environment. setting to default: 1 min")
return time.Minute, nil
}
v, err := strconv.Atoi(s)
if err != nil {
return *new(time.Duration), fmt.Errorf("invalid interval_seconds format: %s", s)
}
return time.Second * time.Duration(v), nil
}
func getRetryCount() (int, error) {
return getEnvIntVal(env.RetryCount, 5)
}
func getKeepUntilDays() (int, error) {
return getEnvIntVal(env.KeepUntilDays, 3)
}
func getEnvIntVal(key string, fallback int) (int, error) {
s := os.Getenv(key)
if len(s) == 0 {
return fallback, nil
}
v, err := strconv.Atoi(s)
if err != nil {
return 0, fmt.Errorf("invalid %s: %s", key, s)
}
return v, nil
}