From 83e81ec011ac867c588e57435cb307bbe32c2bbb Mon Sep 17 00:00:00 2001 From: efim Date: Tue, 14 Nov 2023 04:18:25 +0000 Subject: [PATCH] feat: logout route and button --- rooms/room.go | 10 +++++++ routes/base_page.go | 7 ++++- routes/index_page.go | 15 ++++++---- routes/login_page.go | 53 +++++++++++++++++++++++++++++++++--- routes/room_page.go | 9 ++++-- routes/static/out.css | 23 ++++++++++++++++ routes/templates/base.gohtml | 11 +++++++- routes/templates/room.gohtml | 1 - sessions/sessions_manager.go | 23 ++++++++++++---- 9 files changed, 130 insertions(+), 22 deletions(-) diff --git a/rooms/room.go b/rooms/room.go index 5c9d61d..af9f0d6 100644 --- a/rooms/room.go +++ b/rooms/room.go @@ -117,6 +117,16 @@ gestureIteration: r.CurrentSpeaker = nextSpeakerId } +func (r *Room) PersonToStandUpFromTable(p PersonId) { + r.ReleaseHand(p) + if slices.Contains(r.Paricipants, p) { + updated := slices.DeleteFunc(r.Paricipants, func(sittingPerson PersonId) bool { + return sittingPerson == p + }) + r.Paricipants = updated + } +} + // find place to start - separate function // current speaker level, searched gesture level, room marks // if search level >= current speaker start from speaker diff --git a/routes/base_page.go b/routes/base_page.go index 0b763fb..cc5ffcd 100644 --- a/routes/base_page.go +++ b/routes/base_page.go @@ -4,7 +4,12 @@ type baseData struct { Title string } +type headerData struct { + Title string +} + type pageData struct { Base baseData - Content interface {} + Content any + Header headerData } diff --git a/routes/index_page.go b/routes/index_page.go index 0698862..27df320 100644 --- a/routes/index_page.go +++ b/routes/index_page.go @@ -27,18 +27,21 @@ func indexPageRoute( type MainData struct { SessionStringToken string SomeString string - SessionToken sessions.SessionData + SessionToken sessions.SessionData } - data := pageData { + data := pageData{ Base: baseData{ Title: "hello base template title", }, + Header: headerData{ + Title: session.RoomId, + }, Content: MainData{ - fmt.Sprintf("%+v", session), - "hello!", - session, - }, + fmt.Sprintf("%+v", session), + "hello!", + session, + }, } tmpl := template.Must(template.ParseFS(templateFs, templFile, baseFile)) err := tmpl.ExecuteTemplate(w, "full-page", data) diff --git a/routes/login_page.go b/routes/login_page.go index 3b2ff5f..494aff0 100644 --- a/routes/login_page.go +++ b/routes/login_page.go @@ -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", "/") + } +} diff --git a/routes/room_page.go b/routes/room_page.go index 55fb1b9..473a488 100644 --- a/routes/room_page.go +++ b/routes/room_page.go @@ -207,15 +207,15 @@ func roomPageRoute( for gesture := rooms.ChangeTopic; gesture <= rooms.Meta; gesture++ { gesturesData = append(gesturesData, GestureData{ Name: gesture.String(), - Url: fmt.Sprintf("%s%d", raiseHandPath, gesture), + Url: fmt.Sprintf("%s%d", raiseHandPath, gesture), }) } contentData := struct { - Room rooms.Room + Room rooms.Room Gestures []GestureData }{ - Room: room, + Room: room, Gestures: gesturesData, } data := pageData{ @@ -223,6 +223,9 @@ func roomPageRoute( Title: "room-lala-from-base", }, Content: contentData, + Header: headerData{ + Title: room.Name, + }, } err = tmpl.ExecuteTemplate(w, "full-page", data) diff --git a/routes/static/out.css b/routes/static/out.css index fc5a8ed..04c43fd 100644 --- a/routes/static/out.css +++ b/routes/static/out.css @@ -550,6 +550,10 @@ video { display: grid; } +.h-14 { + height: 3.5rem; +} + .h-full { height: 100%; } @@ -562,6 +566,10 @@ video { width: 100%; } +.flex-none { + flex: none; +} + .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } @@ -641,10 +649,25 @@ video { background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } +.bg-yellow-200 { + --tw-bg-opacity: 1; + background-color: rgb(254 240 138 / var(--tw-bg-opacity)); +} + .p-4 { padding: 1rem; } +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + .text-xl { font-size: 1.25rem; line-height: 1.75rem; diff --git a/routes/templates/base.gohtml b/routes/templates/base.gohtml index baa1a3f..17e5093 100644 --- a/routes/templates/base.gohtml +++ b/routes/templates/base.gohtml @@ -22,7 +22,16 @@ - + +