From d7e83c1f0d9acf00b97617a4d0fd032cd452c6f1 Mon Sep 17 00:00:00 2001 From: nutcas3 Date: Sat, 25 Apr 2026 03:43:32 +0300 Subject: [PATCH] feat: Add API key authentication support to charging engine client - Add APIKey field to ChargingEngineConfig struct - Add apiKey field to ChargingEngineClient struct - Add setAPIKeyHeader method to set X-API-Key header when API key is configured - Call setAPIKeyHeader in CheckCredit, DeductCredit, AddCredit, GetBalance, and HealthCheck methods --- apps/api-server/internal/config/config.go | 1 + .../internal/services/charging_client.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/apps/api-server/internal/config/config.go b/apps/api-server/internal/config/config.go index 2235d1b..e9a8584 100644 --- a/apps/api-server/internal/config/config.go +++ b/apps/api-server/internal/config/config.go @@ -19,6 +19,7 @@ type Config struct { type ChargingEngineConfig struct { BaseURL string `json:"base_url"` Timeout time.Duration `json:"timeout"` + APIKey string `json:"api_key"` } type PaymentConfig struct { diff --git a/apps/api-server/internal/services/charging_client.go b/apps/api-server/internal/services/charging_client.go index 27e9dee..74de988 100644 --- a/apps/api-server/internal/services/charging_client.go +++ b/apps/api-server/internal/services/charging_client.go @@ -14,18 +14,27 @@ import ( type ChargingEngineClient struct { baseURL string httpClient *http.Client + apiKey string } // NewChargingEngineClient creates a new client for the Rust charging engine func NewChargingEngineClient(cfg *config.ChargingEngineConfig) *ChargingEngineClient { return &ChargingEngineClient{ baseURL: cfg.BaseURL, + apiKey: cfg.APIKey, httpClient: &http.Client{ Timeout: cfg.Timeout, }, } } +// setAPIKeyHeader adds the X-API-Key header to a request if an API key is configured +func (c *ChargingEngineClient) setAPIKeyHeader(req *http.Request) { + if c.apiKey != "" { + req.Header.Set("X-API-Key", c.apiKey) + } +} + type CreditCheckRequest struct { BytesRequested uint64 `json:"bytes_requested"` } @@ -66,6 +75,7 @@ func (c *ChargingEngineClient) CheckCredit(ctx context.Context, ip string, bytes return nil, fmt.Errorf("create request: %w", err) } req.Header.Set("Content-Type", "application/json") + c.setAPIKeyHeader(req) resp, err := c.httpClient.Do(req) if err != nil { @@ -97,6 +107,7 @@ func (c *ChargingEngineClient) DeductCredit(ctx context.Context, ip string, byte return fmt.Errorf("create request: %w", err) } req.Header.Set("Content-Type", "application/json") + c.setAPIKeyHeader(req) resp, err := c.httpClient.Do(req) if err != nil { @@ -123,6 +134,7 @@ func (c *ChargingEngineClient) AddCredit(ctx context.Context, ip string, bytesTo return fmt.Errorf("create request: %w", err) } req.Header.Set("Content-Type", "application/json") + c.setAPIKeyHeader(req) resp, err := c.httpClient.Do(req) if err != nil { @@ -143,6 +155,7 @@ func (c *ChargingEngineClient) GetBalance(ctx context.Context, ip string) (*Bala if err != nil { return nil, fmt.Errorf("create request: %w", err) } + c.setAPIKeyHeader(req) resp, err := c.httpClient.Do(req) if err != nil { @@ -168,6 +181,7 @@ func (c *ChargingEngineClient) HealthCheck(ctx context.Context) (*EngineHealthRe if err != nil { return nil, fmt.Errorf("create request: %w", err) } + c.setAPIKeyHeader(req) resp, err := c.httpClient.Do(req) if err != nil {