/
main.go
123 lines (113 loc) · 3.24 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
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
package main
import (
"io/ioutil"
"net/http"
"os"
"strconv"
elogrus "github.com/dictor/echologrus"
"github.com/go-playground/validator/v10"
"github.com/labstack/echo/v4"
"gopkg.in/yaml.v2"
)
var (
// Tasks is storage of Task
Tasks map[int]*Task = map[int]*Task{}
// TaskID is auto-increasing counter for assign unique id to added task
TaskID int = 0
// Logger is global logger reference to Echo object's logger
Logger elogrus.EchoLogger
// CurrentConfig is global config reference
CurrentConfig *Config
gitHash string = "N/A"
gitTag string = "N/A"
buildDate string = "N/A"
)
// CustomValidator is struct validator for request input
type CustomValidator struct {
validator *validator.Validate
}
// Validate is just renamed function of struct validate method
func (cv *CustomValidator) Validate(i interface{}) error {
return cv.validator.Struct(i)
}
func main() {
e := echo.New()
Logger = elogrus.Attach(e)
e.Validator = &CustomValidator{validator: validator.New()}
Logger.Infof("web-annie %s (%s) : %s\n", gitTag, gitHash, buildDate)
successConfig := false
if _, err := os.Stat("config.yaml"); os.IsNotExist(err) {
Logger.Warnln("Cannot found config file 'config.yaml'")
} else {
rawYaml, err := ioutil.ReadFile("config.yaml")
if err != nil {
Logger.Errorf("Error is caused while reading config : %s\n", err)
}
rawConfig := Config{}
if err := yaml.Unmarshal(rawYaml, &rawConfig); err != nil {
Logger.Errorf("Error is caused while decode config : %s\n", err)
}
CurrentConfig = &rawConfig
successConfig = true
}
if !successConfig {
Logger.Warnln("Using default config")
CurrentConfig = &DefaultConfig
}
if _, err := os.Stat(CurrentConfig.DownloadDirectory); os.IsNotExist(err) {
os.MkdirAll(CurrentConfig.DownloadDirectory, 0775)
}
e.File("/", "static/index.html")
e.File("/style", "static/style.css")
e.File("/script", "static/script.js")
e.File("/i18n", "static/i18n.js")
e.GET("/tasks", func(c echo.Context) error {
return c.JSON(http.StatusOK, Tasks)
})
e.POST("/tasks", func(c echo.Context) error {
task := TaskAddRequest{}
if err := c.Bind(&task); err != nil {
e.Logger.Info(err)
return c.NoContent(http.StatusBadRequest)
}
if err := c.Validate(task); err != nil {
e.Logger.Info(err)
return c.NoContent(http.StatusBadRequest)
}
Tasks[TaskID] = NewTask(task.Address)
Tasks[TaskID].Start()
TaskID++
return c.NoContent(http.StatusOK)
})
e.DELETE("/tasks/:id", func(c echo.Context) error {
reqID := c.Param("id")
if reqID != "complete" {
id, err := strconv.Atoi(reqID)
if err != nil {
e.Logger.Info(err)
return c.NoContent(http.StatusBadRequest)
}
if target, exist := Tasks[id]; !exist {
return c.NoContent(http.StatusNotFound)
} else {
target.Stop()
delete(Tasks, id)
return c.NoContent(http.StatusOK)
}
} else {
deleteCnt := 0
for i, task := range Tasks {
if task.Status == TaskStatusComplete {
task.Stop()
delete(Tasks, i)
deleteCnt++
}
}
return c.JSON(http.StatusOK, map[string]int{"count": deleteCnt})
}
})
e.GET("/version", func(c echo.Context) error {
return c.JSON(http.StatusOK, map[string]string{"tag": gitTag, "date": buildDate})
})
e.Logger.Fatal(e.Start(CurrentConfig.ListenAddress))
}