-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
89 lines (76 loc) · 1.97 KB
/
main.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
// Package export экспортирует все данные из Zen Money в БД ClickHouse
package main
import (
"fmt"
"github.com/nemirlev/zenapi"
"github.com/nemirlev/zenexport/internal/config"
"github.com/nemirlev/zenexport/internal/db"
"github.com/nemirlev/zenexport/internal/logger"
"os"
"time"
)
func createClient(token string) (*zenapi.Client, error) {
return zenapi.NewClient(token)
}
func runSyncAndSave(log logger.Log, client *zenapi.Client, db db.DataStore) error {
fmt.Println("Get data from ZenMoney...")
resBody, err := client.FullSync()
fmt.Println("Finished getting data from ZenMoney.")
if err != nil {
log.WithError(err, "error getting ZenMoney data")
return err
}
fmt.Println("Save data to Database...")
err = db.Save(&resBody)
if err != nil {
log.WithError(err, "error save ZenMoney data to DB")
return err
}
fmt.Println("Import completed.")
return nil
}
func main() {
log := logger.New()
cfg, err := config.FromEnv()
if err != nil {
log.WithError(err, "get cfg")
os.Exit(1)
}
client, err := createClient(cfg.ZenMoneyToken)
if err != nil {
log.WithError(err, "failed to create client")
os.Exit(1)
}
dbase, err := db.NewDataStore(cfg, log)
if err != nil {
log.WithError(err, "failed to setup database")
os.Exit(1)
}
if cfg.IsDaemon {
interval := time.Duration(cfg.Interval) * time.Minute
ticker := time.NewTicker(interval)
for range ticker.C {
start := time.Now()
err := runSyncAndSave(log, client, dbase)
if err != nil {
log.WithError(err, "error sync ZenMoney data")
}
nextTick := start.Add(interval)
timer := time.NewTicker(1 * time.Second)
go func() {
for range timer.C {
timeLeft := time.Until(nextTick).Round(time.Second)
fmt.Printf("\rNext run in %v", timeLeft)
}
}()
<-time.After(time.Until(nextTick))
timer.Stop()
fmt.Println()
}
} else {
err := runSyncAndSave(log, client, dbase)
if err != nil {
log.WithError(err, "error sync ZenMoney data")
}
}
}