feat: logout route and button

This commit is contained in:
efim
2023-11-14 04:18:25 +00:00
parent 1297fcf35d
commit 83e81ec011
9 changed files with 130 additions and 22 deletions

View File

@@ -7,7 +7,9 @@ import (
"html/template"
"log"
"net/http"
"slices"
"strconv"
"time"
"sunshine.industries/some-automoderation/rooms"
"sunshine.industries/some-automoderation/sessions"
@@ -30,6 +32,8 @@ func registerLoginRoutes(
http.HandleFunc("/login/join", joinRoomHandler(templateFs, sessionSM, roomsM))
http.HandleFunc("/login/create", createRoomHandler(templateFs, sessionSM, roomsM))
http.HandleFunc("/login/room-name-check", checkRoomName(templateFs, roomsM))
http.Handle("/logout", authedPageMiddleware(sessionSM,
http.HandlerFunc(logoutRoute(sessionSM, roomsM))))
}
const authCookieName = "auth"
@@ -89,7 +93,7 @@ func renderLoginPage(w http.ResponseWriter) {
baseFile := "templates/base.gohtml"
templFile := "templates/login.gohtml"
tmpl := template.Must(template.ParseFS(templateFs, templFile, baseFile))
data := pageData {
data := pageData{
Base: baseData{
Title: "login",
},
@@ -138,7 +142,7 @@ func createRoomHandler(templateFs *embed.FS,
log.Printf("what am i to do? error saving room %s", err)
// todo return error notice somehow
}
newSessionId, err := sessionSM.Save(newRoom.Name, person.Id)
newSessionId, err := sessionSM.Save(r.Context(), newRoom.Name, person.Id)
if err != nil {
log.Printf("what am i to do? error saving session %s", err)
// todo return error notice somehow
@@ -261,7 +265,10 @@ func joinRoomHandler(templateFs *embed.FS,
err = roomsM.Update(r.Context(), room.Name, func(fromRoom rooms.Room) (toRoom rooms.Room) {
toRoom = fromRoom
toRoom.Paricipants = append(toRoom.Paricipants, person.Id)
if !slices.Contains(toRoom.Paricipants, person.Id) {
// consequtive login from additional devices
toRoom.Paricipants = append(toRoom.Paricipants, person.Id)
}
return toRoom
})
if err != nil {
@@ -272,7 +279,7 @@ func joinRoomHandler(templateFs *embed.FS,
return // error sitting a new person
}
newSessionId, err := sessionSM.Save(room.Name, person.Id)
newSessionId, err := sessionSM.Save(r.Context(), room.Name, person.Id)
if err != nil {
log.Printf("/login/submit > error saving session %s", err)
}
@@ -291,3 +298,41 @@ func joinRoomHandler(templateFs *embed.FS,
w.Header().Add("HX-Redirect", "/")
}
}
func logoutRoute(sessionSM sessions.SessionManagement,
roomsM rooms.RoomManager) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
session, found := getContextSession(r.Context())
if !found {
log.Printf("/logout session not found, it's ok.")
// though this is under middleware for now, should be impossible
// TODO return error i guess
w.Header().Add("HX-Redirect", "/")
return
}
http.SetCookie(w, &http.Cookie{
Name: authCookieName,
Expires: time.Now().Add(-time.Hour),
Value: "",
Secure: true,
HttpOnly: true,
Path: "/",
})
err := sessionSM.Remove(r.Context(), session.SessionId)
if err != nil {
log.Printf("/logout error deleting session: %s", err)
}
err = roomsM.Update(r.Context(), session.RoomId, func(fromRoom rooms.Room) (toRoom rooms.Room) {
toRoom = fromRoom
toRoom.PersonToStandUpFromTable(session.PersonId)
return toRoom
})
if err != nil {
log.Printf("/logout error removing person from table: %s", err)
}
log.Printf("/logout deleting session %+v", session)
w.Header().Add("HX-Redirect", "/")
}
}