-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.go
92 lines (76 loc) · 2.21 KB
/
server.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
package main
import (
"flag"
"fmt"
"os"
"github.com/yonniluu/paird/handlers"
"github.com/yonniluu/paird/store"
"github.com/yonniluu/paird/vault"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
"golang.org/x/crypto/acme/autocert"
)
var (
prod bool
)
func main() {
// command line args
flag.BoolVar(&prod, "prod", false, "Set to true in production to use let's encrypt")
flag.Parse()
// setup vault token
if vault.VaultToken = os.Getenv("VAULT_TOKEN"); vault.VaultToken == "" {
panic("VAULT_TOKEN env var is not set!")
}
// setup persistence layer
if err := store.Initialize("bolt.db"); err != nil {
panic(err)
}
defer store.CloseDB()
// initialize echo webserver
e := echo.New()
e.HideBanner = true
// middleware
e.Use(middleware.BodyDump(
func(c echo.Context, reqBody, resBody []byte) {
fmt.Printf("Request body:\n%s\n\n", reqBody)
fmt.Printf("Response body:\n%s\n\n", resBody)
}),
)
// if production, add extra security measures
if prod {
// redirect http requests to https
e.Pre(middleware.HTTPSRedirect())
go func(c *echo.Echo) {
e.Logger.Fatal(e.Start(":80"))
}(e)
// thanks mozilla!
e.AutoTLSManager.Cache = autocert.DirCache("/var/www/.cache")
e.AutoTLSManager.HostPolicy = autocert.HostWhitelist("tonycai.me")
e.Use(middleware.HTTPSRedirectWithConfig(middleware.RedirectConfig{
Code: 301,
}))
}
// serve static folder
e.Static("/", "paird/docs")
// api routing
e.GET("/v1/ping", handlers.Ping())
e.POST("/v1/signup", handlers.Signup())
e.POST("/v1/interactive", handlers.Interactive())
e.POST("/v1/setwebhook", handlers.SetWebhook())
// slash command api routing
e.POST("/v1/listtags", handlers.ListTags())
e.POST("/v1/addmytags", handlers.AddMyTags())
e.POST("/v1/addsearchtags", handlers.AddSearchTags())
e.POST("/v1/clearalltags", handlers.ClearAllTags())
e.POST("/v1/mydiet", handlers.SetDiet())
e.POST("/v1/myavailability", handlers.SetAvailability())
e.POST("/v1/mylocation", handlers.SetLocation())
e.POST("/v1/help", handlers.DisplayHelpMessage())
// launch webserver listener
fmt.Println("Starting webserver at port 8000")
if prod {
e.Logger.Fatal(e.StartAutoTLS(":443"))
} else {
e.Logger.Fatal(e.Start(":8000"))
}
}