@@ -15,6 +15,7 @@ func NewRouter() *mux.Router {
1515 r .HandleFunc ("/" , middleware .AuthRequired (indexPostHandler )).Methods ("POST" )
1616 r .HandleFunc ("/login" , loginGetHandler ).Methods ("GET" )
1717 r .HandleFunc ("/login" , loginPostHandler ).Methods ("POST" )
18+ r .HandleFunc ("/logout" , logoutGetHandler ).Methods ("GET" )
1819 r .HandleFunc ("/register" , registerGetHandler ).Methods ("GET" )
1920 r .HandleFunc ("/register" , registerPostHandler ).Methods ("POST" )
2021 fs := http .FileServer (http .Dir ("./static/" ))
@@ -27,16 +28,17 @@ func NewRouter() *mux.Router {
2728func indexGetHandler (w http.ResponseWriter , r * http.Request ) {
2829 updates , err := models .GetAllUpdates ()
2930 if err != nil {
30- w .WriteHeader (http .StatusInternalServerError )
31- w .Write ([]byte ("Internal server error" ))
31+ utils .InternalServerError (w )
3232 return
3333 }
3434 utils .ExecuteTemplate (w , "index.html" , struct {
3535 Title string
3636 Updates []* models.Update
37+ DisplayForm bool
3738 } {
3839 Title : "All updates" ,
3940 Updates : updates ,
41+ DisplayForm : true ,
4042 })
4143}
4244
@@ -45,48 +47,52 @@ func indexPostHandler(w http.ResponseWriter, r *http.Request) {
4547 untypedUserId := session .Values ["user_id" ]
4648 userId , ok := untypedUserId .(int64 )
4749 if ! ok {
48- w .WriteHeader (http .StatusInternalServerError )
49- w .Write ([]byte ("Internal server error" ))
50+ utils .InternalServerError (w )
5051 return
5152 }
5253 r .ParseForm ()
5354 body := r .PostForm .Get ("update" )
5455 err := models .PostUpdate (userId , body )
5556 if err != nil {
56- w .WriteHeader (http .StatusInternalServerError )
57- w .Write ([]byte ("Internal server error" ))
57+ utils .InternalServerError (w )
5858 return
5959 }
6060 http .Redirect (w , r , "/" , 302 )
6161}
6262
6363func userGetHandler (w http.ResponseWriter , r * http.Request ) {
64+ session , _ := sessions .Store .Get (r , "session" )
65+ untypedUserId := session .Values ["user_id" ]
66+ currentUserId , ok := untypedUserId .(int64 )
67+ if ! ok {
68+ utils .InternalServerError (w )
69+ return
70+ }
6471 vars := mux .Vars (r )
6572 username := vars ["username" ]
6673 user , err := models .GetUserByUsername (username )
6774 if err != nil {
68- w .WriteHeader (http .StatusInternalServerError )
69- w .Write ([]byte ("Internal server error" ))
75+ utils .InternalServerError (w )
7076 return
7177 }
7278 userId , err := user .GetId ()
7379 if err != nil {
74- w .WriteHeader (http .StatusInternalServerError )
75- w .Write ([]byte ("Internal server error" ))
80+ utils .InternalServerError (w )
7681 return
7782 }
7883 updates , err := models .GetUpdates (userId )
7984 if err != nil {
80- w .WriteHeader (http .StatusInternalServerError )
81- w .Write ([]byte ("Internal server error" ))
85+ utils .InternalServerError (w )
8286 return
8387 }
8488 utils .ExecuteTemplate (w , "index.html" , struct {
8589 Title string
8690 Updates []* models.Update
87- } {
91+ DisplayForm bool
92+ } {
8893 Title : username ,
8994 Updates : updates ,
95+ DisplayForm : currentUserId == userId ,
9096 })
9197}
9298
@@ -106,15 +112,13 @@ func loginPostHandler(w http.ResponseWriter, r *http.Request) {
106112 case models .ErrInvalidLogin :
107113 utils .ExecuteTemplate (w , "login.html" , "invalid login" )
108114 default :
109- w .WriteHeader (http .StatusInternalServerError )
110- w .Write ([]byte ("Internal server error" ))
115+ utils .InternalServerError (w )
111116 }
112117 return
113118 }
114119 userId , err := user .GetId ()
115120 if err != nil {
116- w .WriteHeader (http .StatusInternalServerError )
117- w .Write ([]byte ("Internal server error" ))
121+ utils .InternalServerError (w )
118122 return
119123 }
120124 session , _ := sessions .Store .Get (r , "session" )
@@ -123,6 +127,13 @@ func loginPostHandler(w http.ResponseWriter, r *http.Request) {
123127 http .Redirect (w , r , "/" , 302 )
124128}
125129
130+ func logoutGetHandler (w http.ResponseWriter , r * http.Request ) {
131+ session , _ := sessions .Store .Get (r , "session" )
132+ delete (session .Values , "user_id" )
133+ session .Save (r , w )
134+ http .Redirect (w , r , "/login" , 302 )
135+ }
136+
126137func registerGetHandler (w http.ResponseWriter , r * http.Request ) {
127138 utils .ExecuteTemplate (w , "register.html" , nil )
128139}
@@ -132,9 +143,11 @@ func registerPostHandler(w http.ResponseWriter, r *http.Request) {
132143 username := r .PostForm .Get ("username" )
133144 password := r .PostForm .Get ("password" )
134145 err := models .RegisterUser (username , password )
135- if err != nil {
136- w .WriteHeader (http .StatusInternalServerError )
137- w .Write ([]byte ("Internal server error" ))
146+ if err == models .ErrUsernameTaken {
147+ utils .ExecuteTemplate (w , "register.html" , "username taken" )
148+ return
149+ } else if err != nil {
150+ utils .InternalServerError (w )
138151 return
139152 }
140153 http .Redirect (w , r , "/login" , 302 )
0 commit comments