mirror of
https://github.com/lordmathis/lemma.git
synced 2025-11-06 07:54:22 +00:00
Refactor db init
This commit is contained in:
@@ -19,6 +19,7 @@ import (
|
|||||||
"novamd/internal/config"
|
"novamd/internal/config"
|
||||||
"novamd/internal/db"
|
"novamd/internal/db"
|
||||||
"novamd/internal/handlers"
|
"novamd/internal/handlers"
|
||||||
|
"novamd/internal/secrets"
|
||||||
"novamd/internal/storage"
|
"novamd/internal/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -29,12 +30,26 @@ func main() {
|
|||||||
log.Fatal("Failed to load configuration:", err)
|
log.Fatal("Failed to load configuration:", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Initialize secrets service
|
||||||
|
secretsService, err := secrets.NewService(cfg.EncryptionKey)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Failed to initialize secrets service:", err)
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize database
|
// Initialize database
|
||||||
database, err := db.Init(cfg.DBPath, cfg.EncryptionKey)
|
database, err := db.Init(cfg.DBPath, secretsService)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
defer database.Close()
|
err = database.Migrate()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Failed to apply database migrations:", err)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if err := database.Close(); err != nil {
|
||||||
|
log.Printf("Error closing database: %v", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
// Get or generate JWT signing key
|
// Get or generate JWT signing key
|
||||||
signingKey := cfg.JWTSigningKey
|
signingKey := cfg.JWTSigningKey
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package db
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"novamd/internal/models"
|
"novamd/internal/models"
|
||||||
"novamd/internal/secrets"
|
"novamd/internal/secrets"
|
||||||
@@ -95,11 +94,11 @@ var (
|
|||||||
// database represents the database connection
|
// database represents the database connection
|
||||||
type database struct {
|
type database struct {
|
||||||
*sql.DB
|
*sql.DB
|
||||||
secretsService secrets.Encryptor
|
secretsService secrets.Service
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init initializes the database connection
|
// Init initializes the database connection
|
||||||
func Init(dbPath string, encryptionKey string) (Database, error) {
|
func Init(dbPath string, secretsService secrets.Service) (Database, error) {
|
||||||
db, err := sql.Open("sqlite3", dbPath)
|
db, err := sql.Open("sqlite3", dbPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -109,21 +108,11 @@ func Init(dbPath string, encryptionKey string) (Database, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize crypto service
|
|
||||||
secretsService, err := secrets.New(encryptionKey)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to initialize encryption: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
database := &database{
|
database := &database{
|
||||||
DB: db,
|
DB: db,
|
||||||
secretsService: secretsService,
|
secretsService: secretsService,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := database.Migrate(); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return database, nil
|
return database, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Encryptor is an interface for encrypting and decrypting strings
|
// Service is an interface for encrypting and decrypting strings
|
||||||
type Encryptor interface {
|
type Service interface {
|
||||||
Encrypt(plaintext string) (string, error)
|
Encrypt(plaintext string) (string, error)
|
||||||
Decrypt(ciphertext string) (string, error)
|
Decrypt(ciphertext string) (string, error)
|
||||||
}
|
}
|
||||||
@@ -51,8 +51,8 @@ func decodeAndValidateKey(key string) ([]byte, error) {
|
|||||||
return keyBytes, nil
|
return keyBytes, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new Crypto instance with the provided base64-encoded key
|
// NewService creates a new Encryptor instance with the provided base64-encoded key
|
||||||
func New(key string) (Encryptor, error) {
|
func NewService(key string) (Service, error) {
|
||||||
keyBytes, err := decodeAndValidateKey(key)
|
keyBytes, err := decodeAndValidateKey(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ func TestNew(t *testing.T) {
|
|||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
e, err := secrets.New(tc.key)
|
e, err := secrets.NewService(tc.key)
|
||||||
|
|
||||||
if tc.wantErr {
|
if tc.wantErr {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@@ -122,7 +122,7 @@ func TestNew(t *testing.T) {
|
|||||||
func TestEncryptDecrypt(t *testing.T) {
|
func TestEncryptDecrypt(t *testing.T) {
|
||||||
// Generate a valid key for testing
|
// Generate a valid key for testing
|
||||||
key := base64.StdEncoding.EncodeToString(make([]byte, 32))
|
key := base64.StdEncoding.EncodeToString(make([]byte, 32))
|
||||||
e, err := secrets.New(key)
|
e, err := secrets.NewService(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create Encryptor instance: %v", err)
|
t.Fatalf("failed to create Encryptor instance: %v", err)
|
||||||
}
|
}
|
||||||
@@ -194,7 +194,7 @@ func TestEncryptDecrypt(t *testing.T) {
|
|||||||
|
|
||||||
func TestDecryptInvalidCiphertext(t *testing.T) {
|
func TestDecryptInvalidCiphertext(t *testing.T) {
|
||||||
key := base64.StdEncoding.EncodeToString(make([]byte, 32))
|
key := base64.StdEncoding.EncodeToString(make([]byte, 32))
|
||||||
e, err := secrets.New(key)
|
e, err := secrets.NewService(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to create Encryptor instance: %v", err)
|
t.Fatalf("failed to create Encryptor instance: %v", err)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user