From be5f95c2faa57957deeaa4a50c6aa85bdb3c0aad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Sterba?= <andre@sterba.dev>
Date: Fri, 25 Apr 2025 08:25:35 +0200
Subject: [PATCH] init store

---
 kms/internal/core/model/config.go             | 10 +++
 kms/internal/core/ports/store.go              |  5 ++
 .../infrastructure/interaction/config.go      | 27 +++++++
 .../infrastructure/store/kms-config.go        | 63 +++++++++++++++
 .../infrastructure/store/kms-config_test.go   | 78 +++++++++++++++++++
 5 files changed, 183 insertions(+)
 create mode 100644 kms/internal/core/model/config.go
 create mode 100644 kms/internal/infrastructure/interaction/config.go
 create mode 100644 kms/internal/infrastructure/store/kms-config.go
 create mode 100644 kms/internal/infrastructure/store/kms-config_test.go

diff --git a/kms/internal/core/model/config.go b/kms/internal/core/model/config.go
new file mode 100644
index 00000000..b9e13a28
--- /dev/null
+++ b/kms/internal/core/model/config.go
@@ -0,0 +1,10 @@
+package model
+
+import "github.com/google/uuid"
+
+type KMSConfig struct {
+	ID                  uuid.UUID
+	Name                string
+	IntercomBind        string
+	QuantumPushAddrBind string
+}
diff --git a/kms/internal/core/ports/store.go b/kms/internal/core/ports/store.go
index dc57456d..292d00c8 100644
--- a/kms/internal/core/ports/store.go
+++ b/kms/internal/core/ports/store.go
@@ -13,3 +13,8 @@ type RouteStore interface {
 	GetRouteList(context.Context) ([]model.Route, error)
 	UpdateRoute(context.Context, model.Route) error
 }
+
+type KMSConfigStore interface {
+	GetKMSConfig(context.Context) (model.KMSConfig, error)
+	SetKMSConfig(context.Context, model.KMSConfig) error
+}
diff --git a/kms/internal/infrastructure/interaction/config.go b/kms/internal/infrastructure/interaction/config.go
new file mode 100644
index 00000000..4b743325
--- /dev/null
+++ b/kms/internal/infrastructure/interaction/config.go
@@ -0,0 +1,27 @@
+package interaction
+
+import (
+	pb "code.fbi.h-da.de/danet/costaquanta/gen/go/kms/v1"
+
+	"go.opentelemetry.io/otel/trace"
+	"go.uber.org/zap"
+)
+
+type ConfigServer struct {
+	pb.UnimplementedConfigServiceServer
+
+	logger *zap.SugaredLogger
+	tracer trace.Tracer
+}
+
+func NewConfigServer(
+	logger *zap.SugaredLogger,
+	tracer trace.Tracer,
+) *RoutingServer {
+	s := &RoutingServer{
+		logger: logger,
+		tracer: tracer,
+	}
+
+	return s
+}
diff --git a/kms/internal/infrastructure/store/kms-config.go b/kms/internal/infrastructure/store/kms-config.go
new file mode 100644
index 00000000..091a9056
--- /dev/null
+++ b/kms/internal/infrastructure/store/kms-config.go
@@ -0,0 +1,63 @@
+package store
+
+import (
+	"context"
+	"sync"
+
+	"code.fbi.h-da.de/danet/costaquanta/kms/internal/core/model"
+	"go.opentelemetry.io/otel/trace"
+	"go.uber.org/zap"
+)
+
+type InMemoryKMSConfigStore struct {
+	kmsConfig model.KMSConfig
+
+	// Using a RWMutex to allow multiple readers concurrently.
+	// A write lock can only be acquired once all readers are done and release their locks.
+	mu sync.RWMutex
+
+	logger *zap.SugaredLogger
+	tracer trace.Tracer
+}
+
+func NewInMemoryKMSConfigStore(
+	logger *zap.SugaredLogger,
+	tracer trace.Tracer,
+) *InMemoryKMSConfigStore {
+	return &InMemoryKMSConfigStore{
+		kmsConfig: model.KMSConfig{},
+		mu:        sync.RWMutex{},
+		logger:    logger,
+		tracer:    tracer,
+	}
+}
+
+func (s *InMemoryKMSConfigStore) GetKMSConfig(ctx context.Context) (model.KMSConfig, error) {
+	_, span := s.tracer.Start(ctx, "get-kms-config")
+	defer span.End()
+
+	s.logger.Debug("Getting KMS config from store")
+
+	s.mu.RLock()
+	defer s.mu.RUnlock()
+
+	return s.kmsConfig, nil
+}
+
+func (s *InMemoryKMSConfigStore) SetKMSConfig(
+	ctx context.Context,
+	kmsConfig model.KMSConfig,
+) error {
+	_, span := s.tracer.Start(ctx, "set-kms-config")
+	defer span.End()
+
+	s.logger.Debug(
+		"Setting KMS config in store")
+
+	s.mu.Lock()
+	defer s.mu.Unlock()
+
+	s.kmsConfig = kmsConfig
+
+	return nil
+}
diff --git a/kms/internal/infrastructure/store/kms-config_test.go b/kms/internal/infrastructure/store/kms-config_test.go
new file mode 100644
index 00000000..78ac0cdf
--- /dev/null
+++ b/kms/internal/infrastructure/store/kms-config_test.go
@@ -0,0 +1,78 @@
+package store
+
+import (
+	"context"
+	"testing"
+
+	"code.fbi.h-da.de/danet/costaquanta/kms/internal/core/model"
+	"code.fbi.h-da.de/danet/costaquanta/libs/logging"
+	"github.com/google/uuid"
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+	"go.opentelemetry.io/otel/trace/noop"
+)
+
+func createCtxAndConfigStoreForTest() (*InMemoryKMSConfigStore, context.Context) {
+	tracer := noop.NewTracerProvider().Tracer("routeStoreTest")
+
+	parentLogger := logging.CreateProductionLogger("kms")
+	childLogger := logging.CreateChildLogger(parentLogger, "routeStoreTest")
+
+	ctx := context.Background()
+
+	return NewInMemoryKMSConfigStore(childLogger, tracer), ctx
+}
+
+func TestInMemoryKMSConfigStore_GetKMSConfig(t *testing.T) {
+	t.Parallel()
+
+	t.Run("Get non-existing KMS config from store", func(t *testing.T) {
+		t.Parallel()
+		store, ctx := createCtxAndConfigStoreForTest()
+
+		kmsConfig, err := store.GetKMSConfig(ctx)
+		require.NoError(t, err)
+		assert.Equal(t, model.KMSConfig{}, kmsConfig)
+	})
+
+	t.Run("Get existing KMS config from store", func(t *testing.T) {
+		t.Parallel()
+		store, ctx := createCtxAndConfigStoreForTest()
+
+		testUUID := uuid.New()
+
+		kmsConfig := model.KMSConfig{
+			ID:                  testUUID,
+			Name:                "test",
+			IntercomBind:        "1337",
+			QuantumPushAddrBind: "4242",
+		}
+		store.kmsConfig = kmsConfig
+
+		retrievedKMSConfig, err := store.GetKMSConfig(ctx)
+		require.NoError(t, err)
+		assert.Equal(t, kmsConfig, retrievedKMSConfig)
+	})
+}
+
+func TestInMemoryKMSConfigStore_SetKMSConfig(t *testing.T) {
+	t.Parallel()
+
+	t.Run("Set KMS config in store", func(t *testing.T) {
+		t.Parallel()
+		store, ctx := createCtxAndConfigStoreForTest()
+
+		testUUID := uuid.New()
+
+		kmsConfig := model.KMSConfig{
+			ID:                  testUUID,
+			Name:                "test",
+			IntercomBind:        "1337",
+			QuantumPushAddrBind: "4242",
+		}
+
+		err := store.SetKMSConfig(ctx, kmsConfig)
+		require.NoError(t, err)
+		assert.Equal(t, kmsConfig, store.kmsConfig)
+	})
+}
-- 
GitLab