From 0591a28f8a6f1b8dab401dd885f1ab9e21398a62 Mon Sep 17 00:00:00 2001 From: efim Date: Sun, 29 Oct 2023 11:44:28 +0000 Subject: [PATCH] feat: adding redis to save sessions --- .gitignore | 1 + flake.nix | 1 + go.mod | 6 ++++ go.sum | 6 ++++ main.go | 17 ++++++++-- routes/login_page.go | 9 ++++-- routes/routes.go | 2 +- sessions/sessions_manager.go | 60 ++++++++++++++++++++++++++++++------ 8 files changed, 87 insertions(+), 15 deletions(-) create mode 100644 go.sum diff --git a/.gitignore b/.gitignore index ac91d12..d672866 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .direnv /.go/ +/dump.rdb diff --git a/flake.nix b/flake.nix index 983de92..cceb23d 100644 --- a/flake.nix +++ b/flake.nix @@ -18,6 +18,7 @@ pkgs.nodePackages.tailwindcss pkgs.nodePackages.prettier pkgs.gnumake + pkgs.redis ]; shellHook = '' export GOPATH=$PWD/.go diff --git a/go.mod b/go.mod index 472bcad..92d9317 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,9 @@ module sunshine.industries/some-automoderation go 1.20 + +require ( + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/redis/go-redis/v9 v9.2.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..0ad7837 --- /dev/null +++ b/go.sum @@ -0,0 +1,6 @@ +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/redis/go-redis/v9 v9.2.1 h1:WlYJg71ODF0dVspZZCpYmoF1+U1Jjk9Rwd7pq6QmlCg= +github.com/redis/go-redis/v9 v9.2.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= diff --git a/main.go b/main.go index b092b35..3ccc211 100644 --- a/main.go +++ b/main.go @@ -1,24 +1,37 @@ package main import ( + "context" "flag" "fmt" "log" "net/http" + "github.com/redis/go-redis/v9" + "sunshine.industries/some-automoderation/routes" "sunshine.industries/some-automoderation/sessions" ) +var ctx = context.Background() + func main() { var port int flag.IntVar(&port, "port", 8080, "Port on which the server should start") flag.Parse() + var redisPort int + flag.IntVar(&redisPort, "redisPort", 7777, "Port on which server should connect to redis db") + + rdb := redis.NewClient(&redis.Options{ + Addr: fmt.Sprintf("localhost:%d", redisPort), + Password: "", + DB: 0, + }) fmt.Printf("Server will start on port %d\n", port) - sessions := sessions.DummySM{} - routes.RegisterRoutes(&sessions) + sessions := sessions.RedisSM{ Rdb: rdb, } + routes.RegisterRoutes(sessions) log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", port), nil)) } diff --git a/routes/login_page.go b/routes/login_page.go index eda7722..62a525f 100644 --- a/routes/login_page.go +++ b/routes/login_page.go @@ -10,7 +10,7 @@ import ( "sunshine.industries/some-automoderation/sessions" ) -func registerLoginRoutes(templateFs *embed.FS, sessions *sessions.DummySM) { +func registerLoginRoutes(templateFs *embed.FS, sessionSM sessions.SessionManagement) { // login page http.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) { var templFile = "templates/login.gohtml" @@ -36,9 +36,12 @@ func registerLoginRoutes(templateFs *embed.FS, sessions *sessions.DummySM) { roomId := 1 // would be taken from rooms interface from redis // would be either taken from room info on correct person pass or created personId := 111 - sessions.Save(int64(roomId), int64(personId)) + id, err := sessionSM.Save(int64(roomId), int64(personId)) + if err != nil { + log.Printf("/login/submit > error saving session %s", err) + } - fmt.Fprintf(w, "room things %s & %s, personal things %s and %s", rn, rp, pn, pp) + fmt.Fprintf(w, "is is %d. room things %s & %s, personal things %s and %s", id, rn, rp, pn, pp) // i suppose here i'll need to // a) check if room password OK // b) get room data diff --git a/routes/routes.go b/routes/routes.go index cce3740..83d715b 100644 --- a/routes/routes.go +++ b/routes/routes.go @@ -15,7 +15,7 @@ var templateFs embed.FS //go:embed static var staticFilesFs embed.FS -func RegisterRoutes(sessions *sessions.DummySM) { +func RegisterRoutes(sessions sessions.SessionManagement) { // login page registerLoginRoutes(&templateFs, sessions) diff --git a/sessions/sessions_manager.go b/sessions/sessions_manager.go index e1304c3..6c500fe 100644 --- a/sessions/sessions_manager.go +++ b/sessions/sessions_manager.go @@ -1,27 +1,69 @@ package sessions import ( + "context" + "fmt" "log" + "math/rand" + + "github.com/redis/go-redis/v9" ) type SessionData struct { - sessionId int64 - roomId int64 - personId int64 + SessionId int64 `redis:"session_id"` + RoomId int64 `redis:"room_id"` + PersonId int64 `redis:"person_id"` } type SessionManagement interface { - Get(sessionId int64) SessionData - Save(roomId int64, personId int64) int64 + Get(sessionId int64) SessionData + Save(roomId int64, personId int64) (int64, error) } -type DummySM struct {} +var ctx = context.Background() -func (d DummySM)Get(sessionId int64) SessionData { +const sessionPrefix = "session" + +func sessionIdToKey(sessionId int64) string { + return fmt.Sprintf("%s:%d", sessionPrefix, sessionId) +} + +type RedisSM struct { + Rdb *redis.Client +} + +func (redisSM RedisSM) Get(sessionId int64) SessionData { + var foundSession SessionData + err := redisSM.Rdb.HGetAll(ctx, sessionIdToKey(sessionId)).Scan(foundSession) + if err != nil { + log.Printf("> error reading %d", sessionId) + return SessionData{} + } + log.Printf("> successfully found %d %+v", sessionId, foundSession) + return foundSession +} +func (redisSM RedisSM) Save(roomId int64, personId int64) (int64, error) { + randId := rand.Int63() + newSession := SessionData{ + SessionId: randId, + RoomId: roomId, + PersonId: personId, + } + err := redisSM.Rdb.HSet(ctx, sessionIdToKey(randId), newSession).Err() + if err != nil { + log.Printf("> error! saving session %+v %s", newSession, err) + return 0, fmt.Errorf("error saving new session: %+v with %s", newSession, err) + } + return randId, nil +} + +type DummySM struct{} + +func (d DummySM) Get(sessionId int64) SessionData { log.Printf("get dummy session by %d", sessionId) return SessionData{} } -func (d DummySM)Save(roomId int64, personId int64) int64 { +func (d DummySM) Save(roomId int64, personId int64) (int64, error) { log.Printf("save dummy session with %d %d", roomId, personId) - return 1 + return 1, nil }