Files
gemini-banlancer/internal/repository/key_crypto.go
2025-11-20 12:24:05 +08:00

63 lines
1.7 KiB
Go

// Filename: internal/repository/key_crypto.go
package repository
import (
"fmt"
"gemini-balancer/internal/models"
)
func (r *gormKeyRepository) decryptKey(key *models.APIKey) error {
if key == nil || key.EncryptedKey == "" {
return nil // Nothing to decrypt
}
// Avoid re-decrypting if plaintext already exists
if key.APIKey != "" {
return nil
}
plaintext, err := r.crypto.Decrypt(key.EncryptedKey)
if err != nil {
return fmt.Errorf("failed to decrypt key ID %d: %w", key.ID, err)
}
key.APIKey = plaintext
return nil
}
func (r *gormKeyRepository) decryptKeys(keys []models.APIKey) error {
for i := range keys {
if err := r.decryptKey(&keys[i]); err != nil {
// In a batch operation, we log the error but allow the rest to proceed.
r.logger.Errorf("Batch decrypt error for key index %d: %v", i, err)
}
}
return nil
}
// Decrypt 实现了 KeyRepository 接口
func (r *gormKeyRepository) Decrypt(key *models.APIKey) error {
if key == nil || len(key.EncryptedKey) == 0 {
return nil // Nothing to decrypt
}
// Avoid re-decrypting if plaintext already exists
if key.APIKey != "" {
return nil
}
plaintext, err := r.crypto.Decrypt(key.EncryptedKey)
if err != nil {
return fmt.Errorf("failed to decrypt key ID %d: %w", key.ID, err)
}
key.APIKey = plaintext
return nil
}
// DecryptBatch 实现了 KeyRepository 接口
func (r *gormKeyRepository) DecryptBatch(keys []models.APIKey) error {
for i := range keys {
// This delegates to the robust single-key decryption logic.
if err := r.Decrypt(&keys[i]); err != nil {
// In a batch operation, we log the error but allow the rest to proceed.
r.logger.Errorf("Batch decrypt error for key index %d (ID: %d): %v", i, keys[i].ID, err)
}
}
return nil
}