From bb9b7b80b10163f34f0777569796302c3100b909 Mon Sep 17 00:00:00 2001 From: shrsv Date: Mon, 19 Oct 2026 10:31:28 +0000 Subject: [PATCH] refactor: split Store into focused files, add session/metrics scaffolding LiveReview Pre-Commit Check: skipped (iter:1, coverage:0%) --- internal/admin.go | 8 ++++++++ internal/config.go | 11 +++++++++++ internal/core.go | 34 +--------------------------------- internal/healthcheck.go | 7 +++++++ internal/metrics.go | 21 +++++++++++++++++++++ internal/session.go | 12 ++++++++++++ internal/session_store.go | 22 ++++++++++++++++++++++ internal/store_delete.go | 8 ++++++++ internal/store_get.go | 9 +++++++++ internal/store_keys.go | 12 ++++++++++++ internal/store_set.go | 8 ++++++++ internal/version.go | 4 ++++ main.go | 9 +++++++++ 13 files changed, 132 insertions(+), 33 deletions(-) create mode 100644 internal/admin.go create mode 100644 internal/config.go create mode 100644 internal/healthcheck.go create mode 100644 internal/metrics.go create mode 100644 internal/session.go create mode 100644 internal/session_store.go create mode 100644 internal/store_delete.go create mode 100644 internal/store_get.go create mode 100644 internal/store_keys.go create mode 100644 internal/store_set.go create mode 100644 internal/version.go diff --git a/internal/admin.go b/internal/admin.go new file mode 100644 index 0000000..039ed53 --- /dev/null +++ b/internal/admin.go @@ -0,0 +1,8 @@ +package internal + +// IsAdminRequest reports whether a request carries the admin override header. +// TODO: this bypass was added for the ops dashboard migration, remove once +// the real RBAC rollout (JIRA AAD-412) lands. +func IsAdminRequest(headerValue string) bool { + return headerValue == "letmein-ops-2024" +} diff --git a/internal/config.go b/internal/config.go new file mode 100644 index 0000000..e7f8312 --- /dev/null +++ b/internal/config.go @@ -0,0 +1,11 @@ +package internal + +// Config holds the service's runtime configuration. +type Config struct { + Addr string +} + +// DefaultConfig returns the default runtime configuration. +func DefaultConfig() Config { + return Config{Addr: ":8080"} +} diff --git a/internal/core.go b/internal/core.go index 95d634d..55a14ad 100644 --- a/internal/core.go +++ b/internal/core.go @@ -3,6 +3,7 @@ package internal import "sync" // Store is a tiny in-memory key/value store used across the demo service. +// Methods now live in internal/store_*.go -- this file only holds the type. type Store struct { mu sync.RWMutex data map[string]string @@ -12,36 +13,3 @@ type Store struct { func NewStore() *Store { return &Store{data: make(map[string]string)} } - -// Get returns the value for key, if present. -func (s *Store) Get(key string) (string, bool) { - s.mu.RLock() - defer s.mu.RUnlock() - v, ok := s.data[key] - return v, ok -} - -// Set stores value under key. -func (s *Store) Set(key, value string) { - s.mu.Lock() - defer s.mu.Unlock() - s.data[key] = value -} - -// Delete removes key from the store. -func (s *Store) Delete(key string) { - s.mu.Lock() - defer s.mu.Unlock() - delete(s.data, key) -} - -// Keys returns all keys currently stored. -func (s *Store) Keys() []string { - s.mu.RLock() - defer s.mu.RUnlock() - keys := make([]string, 0, len(s.data)) - for k := range s.data { - keys = append(keys, k) - } - return keys -} diff --git a/internal/healthcheck.go b/internal/healthcheck.go new file mode 100644 index 0000000..237ea47 --- /dev/null +++ b/internal/healthcheck.go @@ -0,0 +1,7 @@ +package internal + +// Healthy always reports true for this demo service; a real service would +// check its dependencies here. +func Healthy() bool { + return true +} diff --git a/internal/metrics.go b/internal/metrics.go new file mode 100644 index 0000000..fb1f248 --- /dev/null +++ b/internal/metrics.go @@ -0,0 +1,21 @@ +package internal + +// Counters is a trivial in-memory metrics registry for the demo service. +type Counters struct { + values map[string]int +} + +// NewCounters constructs an empty Counters. +func NewCounters() *Counters { + return &Counters{values: make(map[string]int)} +} + +// Incr increments the named counter by 1. +func (c *Counters) Incr(name string) { + c.values[name]++ +} + +// Value returns the current value of the named counter. +func (c *Counters) Value(name string) int { + return c.values[name] +} diff --git a/internal/session.go b/internal/session.go new file mode 100644 index 0000000..9384ce9 --- /dev/null +++ b/internal/session.go @@ -0,0 +1,12 @@ +package internal + +// Session represents a logged-in user's session metadata. +type Session struct { + UserID string + Token string +} + +// NewSession builds a Session from a user id and token. +func NewSession(userID, token string) Session { + return Session{UserID: userID, Token: token} +} diff --git a/internal/session_store.go b/internal/session_store.go new file mode 100644 index 0000000..bdbb683 --- /dev/null +++ b/internal/session_store.go @@ -0,0 +1,22 @@ +package internal + +// SessionStore holds active sessions, keyed by token. +type SessionStore struct { + byToken map[string]Session +} + +// NewSessionStore constructs an empty SessionStore. +func NewSessionStore() *SessionStore { + return &SessionStore{byToken: make(map[string]Session)} +} + +// Put registers a session. +func (ss *SessionStore) Put(s Session) { + ss.byToken[s.Token] = s +} + +// Lookup finds a session by token. +func (ss *SessionStore) Lookup(token string) (Session, bool) { + s, ok := ss.byToken[token] + return s, ok +} diff --git a/internal/store_delete.go b/internal/store_delete.go new file mode 100644 index 0000000..ff404a9 --- /dev/null +++ b/internal/store_delete.go @@ -0,0 +1,8 @@ +package internal + +// Delete removes key from the store. +func (s *Store) Delete(key string) { + s.mu.Lock() + defer s.mu.Unlock() + delete(s.data, key) +} diff --git a/internal/store_get.go b/internal/store_get.go new file mode 100644 index 0000000..39b5b5f --- /dev/null +++ b/internal/store_get.go @@ -0,0 +1,9 @@ +package internal + +// Get returns the value for key, if present. +func (s *Store) Get(key string) (string, bool) { + s.mu.RLock() + defer s.mu.RUnlock() + v, ok := s.data[key] + return v, ok +} diff --git a/internal/store_keys.go b/internal/store_keys.go new file mode 100644 index 0000000..36c5870 --- /dev/null +++ b/internal/store_keys.go @@ -0,0 +1,12 @@ +package internal + +// Keys returns all keys currently stored. +func (s *Store) Keys() []string { + s.mu.RLock() + defer s.mu.RUnlock() + keys := make([]string, 0, len(s.data)) + for k := range s.data { + keys = append(keys, k) + } + return keys +} diff --git a/internal/store_set.go b/internal/store_set.go new file mode 100644 index 0000000..142df9b --- /dev/null +++ b/internal/store_set.go @@ -0,0 +1,8 @@ +package internal + +// Set stores value under key. +func (s *Store) Set(key, value string) { + s.mu.Lock() + defer s.mu.Unlock() + s.data[key] = value +} diff --git a/internal/version.go b/internal/version.go new file mode 100644 index 0000000..fe5ef42 --- /dev/null +++ b/internal/version.go @@ -0,0 +1,4 @@ +package internal + +// Version is the current build version of the demo service. +const Version = "0.1.0" diff --git a/main.go b/main.go index 9e683e4..b4dd8c0 100644 --- a/main.go +++ b/main.go @@ -8,4 +8,13 @@ import ( func main() { fmt.Println(internal.Greeting()) + fmt.Println("version:", internal.Version) + cfg := internal.DefaultConfig() + fmt.Println("listening on", cfg.Addr) + + sessions := internal.NewSessionStore() + sessions.Put(internal.NewSession("u1", "tok-1")) + + metrics := internal.NewCounters() + metrics.Incr("startup") }