Passed
Push — master ( 7456e0...8eb6db )
by Stanislav
01:27
created

main.main   B

Complexity

Conditions 7

Size

Total Lines 46
Code Lines 29

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
dl 0
loc 46
rs 7.784
c 0
b 0
f 0
eloc 29
nop 0
1
package main
2
3
import (
4
	"fmt"
5
	"io"
6
	"log"
7
	"os"
8
9
	"flag"
10
	"github.com/popstas/go-toggl"
11
	"github.com/viasite/planfix-toggl-server/app/client"
12
	"github.com/viasite/planfix-toggl-server/app/config"
13
	"github.com/viasite/planfix-toggl-server/app/rest"
14
	"github.com/viasite/planfix-toggl-server/app/util"
15
	"runtime"
16
)
17
18
var version string
19
20
func getLogger(cfg config.Config) *log.Logger {
21
	// logging
22
	logger := log.New(os.Stderr, "[planfix-toggl] ", log.LstdFlags)
23
	if cfg.Debug {
24
		logger.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile)
25
	} else {
26
		toggl.DisableLog()
27
	}
28
	if cfg.LogFile != "" {
29
		f, err := os.OpenFile(cfg.LogFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
30
		if err != nil {
31
			logger.Fatalf("[ERROR] Failed to open log file: %s", cfg.LogFile)
32
		}
33
		defer f.Close()
34
		mw := io.MultiWriter(os.Stdout, f)
35
		logger.SetOutput(mw)
36
	}
37
	return logger
38
}
39
40
func parseFlags(cfg *config.Config) {
41
	dryRun := flag.Bool("dry-run", false, "Don't actually change data")
42
	if runtime.GOOS == "windows" {
43
		// Allow user to hide the console window
44
		flag.BoolVar(&cfg.NoConsole, "no-console", false, "Hide console window")
45
	}
46
	flag.Parse()
47
48
	if *dryRun {
49
		cfg.DryRun = true
50
	}
51
}
52
53
func connectServices(cfg *config.Config, logger *log.Logger, togglClient client.TogglClient) (err error) {
54
	// toggl
55
	logger.Println("[INFO] подключение к Toggl...")
56
	account, err := togglClient.GetTogglUser()
57
	cfg.TogglUserID = account.Data.ID
58
	if err != nil {
59
		return err
60
	}
61
62
	ok, err := togglClient.IsWorkspaceExists(cfg.TogglWorkspaceID)
63
	if err != nil {
64
		return err
65
	}
66
	if !ok {
67
		return fmt.Errorf("Toggl workspace ID %d не найден", cfg.TogglWorkspaceID)
68
	}
69
70
	// planfix
71
	if cfg.PlanfixUserName != "" && cfg.PlanfixUserPassword != "" {
72
		logger.Println("[INFO] подключение к Планфиксу...")
73
		user, err := togglClient.GetPlanfixUser()
74
		cfg.PlanfixUserID = user.ID
75
		if err != nil {
76
			return err
77
		}
78
79
		logger.Println("[INFO] получение данных аналитики Планфикса...")
80
		_, err = togglClient.GetAnaliticDataCached(
81
			cfg.PlanfixAnaliticName,
82
			cfg.PlanfixAnaliticTypeName,
83
			cfg.PlanfixAnaliticTypeValue,
84
			cfg.PlanfixAnaliticCountName,
85
			cfg.PlanfixAnaliticCommentName,
86
			cfg.PlanfixAnaliticDateName,
87
			cfg.PlanfixAnaliticUsersName,
88
		)
89
		if err != nil {
90
			return fmt.Errorf("Поля аналитики указаны неправильно: %s", err.Error())
91
		}
92
	}
93
	return nil
94
}
95
96
func main() {
97
	fmt.Printf("planfix-toggl %s\n", version)
98
	cfg := config.GetConfig()
99
100
	parseFlags(&cfg)
101
102
	logger := getLogger(cfg)
103
104
	errors, isValid := cfg.Validate()
105
	if !isValid {
106
		for _, e := range errors {
107
			log.Println(e)
108
		}
109
	}
110
111
	if cfg.NoConsole {
112
		util.HideConsole()
113
	}
114
115
	togglClient := client.TogglClient{
116
		Config: &cfg,
117
		Logger: logger,
118
	}
119
	togglClient.ReloadConfig()
120
121
	// get planfix and toggl user IDs, for early API check
122
	err := connectServices(&cfg, logger, togglClient)
123
	if err != nil {
124
		isValid = false
125
		logger.Printf("[ERROR] %s", err.Error())
126
	}
127
128
	if isValid {
129
		togglClient.Run()
130
	} else {
131
		util.OpenBrowser("https://localhost:8097")
132
	}
133
134
	// start API server
135
	server := rest.Server{
136
		Version:     version,
137
		TogglClient: &togglClient,
138
		Config:      &cfg,
139
		Logger:      logger,
140
	}
141
	server.Run()
142
}
143