forked from peterskeide/bones
/
server.go
89 lines (65 loc) · 2 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
package main
import (
"bones/config"
"bones/repositories"
"bones/web/filters"
"bones/web/handlers"
"bones/web/services"
"bones/web/templating"
"github.com/gorilla/pat"
"log"
"net/http"
"os"
)
// Router
var r *pat.Router
// Services
var templateRenderer templating.TemplateRenderer
var shortcuts services.Shortcuts
// Repositories
var userRepository repositories.UserRepository
// Filters
var f *filters.Filters
// Handlers
var homeHandler *handlers.HomeHandler
var loginHandler *handlers.LoginHandler
var signupHandler *handlers.SignupHandler
func main() {
repositories.Connect(config.DatabaseConnectionString())
defer repositories.Cleanup()
repositories.EnableSessions()
setupDependencies()
setupRouting()
http.Handle("/", r)
http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("./assets"))))
port := portFromEnvOrDefault()
log.Println("Starting server on port", port)
log.Fatal(http.ListenAndServe(":"+port, nil))
}
func setupDependencies() {
r = pat.New()
handlers.SetRouter(r)
templateRenderer = templating.NewTemplateRenderer()
shortcuts = &services.TemplatingShortcuts{templateRenderer}
userRepository := repositories.NewUserRepository()
f = &filters.Filters{shortcuts, userRepository}
homeHandler = &handlers.HomeHandler{shortcuts, userRepository}
loginHandler = &handlers.LoginHandler{shortcuts, userRepository}
signupHandler = &handlers.SignupHandler{shortcuts, userRepository}
}
func setupRouting() {
r.Get("/users/{id:[0-9]+}/profile", filters.ApplyTo(loginHandler.LoadUserProfilePage, f.Authenticate, filters.Params)).Name("userProfile")
r.Get("/signup", signupHandler.LoadSignupPage)
r.Post("/signup", signupHandler.CreateNewUser)
r.Get("/login", loginHandler.LoadLoginPage)
r.Post("/login", filters.ApplyTo(loginHandler.CreateNewSession, filters.Csrf))
r.Get("/logout", loginHandler.Logout)
r.Get("/", homeHandler.LoadHomePage)
}
func portFromEnvOrDefault() string {
port := os.Getenv("PORT")
if port != "" {
return port
}
return "8080"
}