forked from peterskeide/bones
/
server.go
96 lines (71 loc) · 2.28 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
93
94
95
96
package main
import (
"bones/config"
"bones/db/sqlrepositories"
"bones/repositories"
"bones/web/authentication"
"bones/web/filters"
"bones/web/handlers"
"bones/web/sessions"
"bones/web/templating"
"github.com/gorilla/pat"
"log"
"net/http"
"os"
)
// Router
var r *pat.Router
// Services
var templateRenderer handlers.TemplateRenderer
var shortcuts handlers.Shortcuts
var authenticator handlers.Authenticator
var sessionStore handlers.SessionStore
// 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() {
sqlrepositories.Connect(config.DatabaseConnectionString())
defer sqlrepositories.Cleanup()
sessions.Enable()
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)
userRepository := sqlrepositories.NewUserRepository()
authenticator = &authentication.EmailAuthenticator{userRepository}
sessionStore = &sessions.CookieSessionStore{}
templateRenderer = templating.NewTemplateRenderer()
shortcuts = handlers.Shortcuts{templateRenderer, sessionStore}
f = &filters.Filters{shortcuts, sessionStore, userRepository}
homeHandler = &handlers.HomeHandler{shortcuts, userRepository}
loginHandler = &handlers.LoginHandler{shortcuts, authenticator, userRepository, sessionStore}
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, f.Csrf))
r.Get("/logout", loginHandler.Logout)
r.Get("/", homeHandler.LoadHomePage)
}
func portFromEnvOrDefault() string {
port := os.Getenv("PORT")
if port != "" {
return port
}
return "8080"
}