/
go_imb.go
68 lines (54 loc) · 2.05 KB
/
go_imb.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
package main
import (
"os"
"io/ioutil"
"fmt"
"net/http"
"gopkg.in/yaml.v2"
"github.com/gorilla/mux"
"github.com/codegangsta/negroni"
)
type GoImbConfiguration struct {
Port int
Webapp string
MongodbUrl string
MongodbDatabaseName string
}
func readConfiguration() GoImbConfiguration {
confFilePath := os.Getenv("GOIMBCONF")
if len(confFilePath) == 0 {
confFilePath = "src/github.com/martianov/go-imb/go-imb.conf.default"
}
configFileData, readErr := ioutil.ReadFile(confFilePath)
if readErr != nil {
panic(fmt.Errorf("Failed to read configuration file %s: %v", confFilePath, readErr))
}
configuration := GoImbConfiguration{}
parseErr := yaml.Unmarshal([]byte(configFileData), &configuration)
if parseErr != nil {
panic(fmt.Errorf("Failed to parse configuration file %s: %v", confFilePath, parseErr))
}
fmt.Printf("Configuration file: %s\n", confFilePath)
return configuration
}
func main() {
configuration := readConfiguration()
dbSession := DBConnect(configuration.MongodbUrl)
DBEnsureIndicesAndDefaults(dbSession, configuration.MongodbDatabaseName)
// handle all requests by serving a file of the same name
fs := http.Dir(configuration.Webapp)
fileHandler := http.FileServer(fs)
// setup routes
router := mux.NewRouter()
router.Handle("/", http.RedirectHandler("/webapp/index.html", 302))
router.PathPrefix("/webapp").Handler(http.StripPrefix("/webapp", fileHandler))
authRouterBase := mux.NewRouter();
router.PathPrefix("/auth").Handler(negroni.New(DBMiddleware(dbSession, configuration.MongodbDatabaseName), negroni.Wrap(authRouterBase)))
authRouter := authRouterBase.PathPrefix("/auth").Subrouter()
authRouter.HandleFunc("/login", Login).Methods("POST")
apiRouterBase := mux.NewRouter();
router.PathPrefix("/api").Handler(negroni.New(DBMiddleware(dbSession, configuration.MongodbDatabaseName), JWTMiddleware(), negroni.Wrap(apiRouterBase)))
apiRouter := apiRouterBase.PathPrefix("/api").Subrouter()
apiRouter.HandleFunc("/me", Me).Methods("GET")
http.ListenAndServe(fmt.Sprintf(":%v", configuration.Port), router);
}