feat: logout route and button
This commit is contained in:
@@ -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", "/")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user