/
main.go
107 lines (98 loc) · 2.6 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
package main
import (
"detra-go-api/controller/api"
"detra-go-api/controller/boards"
"detra-go-api/controller/tasks"
"detra-go-api/controller/users"
"detra-go-api/controller/websocket"
"detra-go-api/model"
"detra-go-api/orm"
"detra-go-api/service"
"fmt"
"os"
"strconv"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"gopkg.in/olahol/melody.v1"
)
func main() {
// Init database
fmt.Println("Initializing database...")
databasePath := "./detra.sqlite3"
err := orm.Init(databasePath)
if err != nil {
fmt.Printf("Failed to initialize database. error:%+v\n", err)
return
}
// Create or Update tables
err = orm.Migrate(
&model.User{},
&model.Task{},
&model.Board{},
)
if err != nil {
fmt.Printf("Failed to update tables. error:%+v\n", err)
return
}
// Create system boards(Icebox, Todo, Doing, Done)
tx := orm.GetDB().Begin()
srvc := service.NewBoardService(tx)
if err = srvc.CreateSystemBoards(); err != nil {
fmt.Printf("Failed to create system boards. error:%+v\n", err)
api.Rollback(tx)
return
}
if err = api.Commit(tx); err != nil {
return
}
// Init router of REST apis
router := gin.Default()
//config := cors.DefaultConfig()
//config.AllowAllOrigins = true
//config.AllowHeaders = []string{"Content-Type"}
//router.Use(cors.New(config))
router.Use(cors.Default())
// Include static/avatars
router.Static("/detra/static", "./static")
// Register api path
routeGroup := router.Group("/detra")
users.EndPoint.RegisterRoute(routeGroup)
boards.EndPoint.RegisterRoute(routeGroup)
tasks.EndPoint.RegisterRoute(routeGroup)
mrouter := melody.New()
ws := websocket.NewWsManager(mrouter)
users.SetWsManager(ws)
boards.SetWsManager(ws)
tasks.SetWsManager(ws)
router.GET("/detra/ws", func(c *gin.Context) {
mrouter.HandleRequest(c.Writer, c.Request)
})
// Set listening host:port
url := getListeningURL()
// Start server
fmt.Printf("Taskboard api server is starting... listening %s\n", url)
err = router.Run(url)
if err != nil {
fmt.Printf("Failed to start api server. error:%+v\n", err)
return
}
}
func getListeningURL() string {
host := os.Getenv("DETRA_API_SERVER_HOST")
if host == "" {
fmt.Println("Environment variable [DETRA_API_SERVER_HOST] is not set or invalid. localhost is used as default")
}
portEnv := os.Getenv("DETRA_API_SERVER_PORT")
port := 0
if portEnv != "" {
port, err := strconv.Atoi(portEnv)
if err != nil || port < 0 {
port = 0
}
}
if port == 0 {
fmt.Println("Environment variable [DETRA_API_SERVER_PORT] is not set or invalid, 7000 port is used as default.")
port = 7000
}
return fmt.Sprintf("%s:%d", host, port)
}