summaryrefslogtreecommitdiffstats
path: root/pkg/session
diff options
context:
space:
mode:
authorLeonardo Bishop <me@leonardobishop.net>2026-01-07 23:39:53 +0000
committerLeonardo Bishop <me@leonardobishop.net>2026-01-07 23:39:53 +0000
commit03cd6bdfbd473dba3f3dc50a1b15e389aac5bc70 (patch)
tree5fea2b1840e298aaab953add749fb9226bd4a710 /pkg/session
Initial commit
Diffstat (limited to 'pkg/session')
-rw-r--r--pkg/session/session.go85
1 files changed, 85 insertions, 0 deletions
diff --git a/pkg/session/session.go b/pkg/session/session.go
new file mode 100644
index 0000000..87306ac
--- /dev/null
+++ b/pkg/session/session.go
@@ -0,0 +1,85 @@
+package session
+
+import (
+ "crypto/rand"
+ "encoding/base64"
+ "fmt"
+ "sync"
+)
+
+type UserSession struct {
+ Token string
+ Team string
+}
+
+// implemtation adapted from
+// https://git.leonardobishop.net/confplanner/tree/pkg/session/memory.go
+
+// TODO add expiry
+type MemoryStore struct {
+ sessions map[string]*UserSession
+ lock sync.RWMutex
+}
+
+func NewMemoryStore() *MemoryStore {
+ return &MemoryStore{
+ sessions: make(map[string]*UserSession),
+ }
+}
+
+func (s *MemoryStore) GetByToken(token string) *UserSession {
+ if token == "" {
+ return nil
+ }
+
+ s.lock.RLock()
+ defer s.lock.RUnlock()
+
+ return s.sessions[token]
+}
+
+func (s *MemoryStore) Create(team string) (*UserSession, error) {
+
+ s.lock.Lock()
+ defer s.lock.Unlock()
+
+ var token string
+ for {
+ token = generateSessionToken()
+
+ _, tokenExists := s.sessions[token]
+
+ if !tokenExists {
+ break
+ }
+ }
+
+ session := &UserSession{
+ Token: token,
+ Team: team,
+ }
+ s.sessions[token] = session
+
+ return session, nil
+}
+
+func (s *MemoryStore) Destroy(token string) error {
+ s.lock.Lock()
+ defer s.lock.Unlock()
+
+ session := s.sessions[token]
+ if session == nil {
+ return fmt.Errorf("session does not exist")
+ }
+
+ delete(s.sessions, token)
+ return nil
+}
+
+func generateSessionToken() string {
+ b := make([]byte, 100)
+ if _, err := rand.Read(b); err != nil {
+ return ""
+ }
+ return base64.StdEncoding.EncodeToString(b)
+}