monorepo/cloud/maplepress-backend/internal/usecase/site/generate_apikey.go

70 lines
1.8 KiB
Go

package site
import (
"fmt"
"go.uber.org/zap"
"codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/pkg/security/apikey"
)
// GenerateAPIKeyUseCase generates and hashes an API key
type GenerateAPIKeyUseCase struct {
apiKeyGen apikey.Generator
apiKeyHasher apikey.Hasher
logger *zap.Logger
}
// ProvideGenerateAPIKeyUseCase creates a new GenerateAPIKeyUseCase
func ProvideGenerateAPIKeyUseCase(
apiKeyGen apikey.Generator,
apiKeyHasher apikey.Hasher,
logger *zap.Logger,
) *GenerateAPIKeyUseCase {
return &GenerateAPIKeyUseCase{
apiKeyGen: apiKeyGen,
apiKeyHasher: apiKeyHasher,
logger: logger,
}
}
// APIKeyResult contains the generated API key details
type APIKeyResult struct {
PlaintextKey string
HashedKey string
Prefix string
LastFour string
}
// Execute generates an API key (test or live) and returns its details
func (uc *GenerateAPIKeyUseCase) Execute(testMode bool) (*APIKeyResult, error) {
// Generate API key (test or live based on test_mode)
var apiKey string
var err error
if testMode {
apiKey, err = uc.apiKeyGen.GenerateTest() // test_sk_...
uc.logger.Info("generating test API key for development")
} else {
apiKey, err = uc.apiKeyGen.Generate() // live_sk_...
}
if err != nil {
uc.logger.Error("failed to generate API key", zap.Error(err))
return nil, fmt.Errorf("failed to generate API key: %w", err)
}
// Hash API key
apiKeyHash := uc.apiKeyHasher.Hash(apiKey)
apiKeyPrefix := apikey.ExtractPrefix(apiKey)
apiKeyLastFour := apikey.ExtractLastFour(apiKey)
uc.logger.Info("API key generated",
zap.String("prefix", apiKeyPrefix),
zap.String("last_four", apiKeyLastFour))
return &APIKeyResult{
PlaintextKey: apiKey,
HashedKey: apiKeyHash,
Prefix: apiKeyPrefix,
LastFour: apiKeyLastFour,
}, nil
}