diff --git a/internal/controllers/controllers_test.go b/internal/controllers/controllers_test.go index faf77a6..e324c85 100644 --- a/internal/controllers/controllers_test.go +++ b/internal/controllers/controllers_test.go @@ -44,9 +44,6 @@ var ( func TestSuite(t *testing.T) { _ = deleteTestDB("test.db") - if err := database.Open("test.db"); err != nil { - log.Fatalf("Failed to create DB: %#v", err) - } cwd, err := os.Getwd() if err != nil { @@ -77,6 +74,9 @@ func TestSuite(t *testing.T) { log.Fatalf("Error setting environment variable: %v", err) } config.LoadConfig() + if err := database.Open("test.db", config.Recipients.AdminEmail); err != nil { + log.Fatalf("Failed to create DB: %#v", err) + } utils.SMTPStart(Host, Port) emailService := services.NewEmailService(config.SMTP.Host, config.SMTP.Port, config.SMTP.User, config.SMTP.Password) var consentRepo repositories.ConsentRepositoryInterface = &repositories.ConsentRepository{} diff --git a/internal/database/db.go b/internal/database/db.go index 4607423..9fedfe4 100644 --- a/internal/database/db.go +++ b/internal/database/db.go @@ -5,7 +5,7 @@ import ( "GoMembership/internal/models" "GoMembership/pkg/logger" "crypto/rand" - "encoding/hex" + "encoding/base64" "time" "github.com/alexedwards/argon2id" @@ -15,7 +15,7 @@ import ( var DB *gorm.DB -func Open(dbPath string) error { +func Open(dbPath string, adminMail string) error { db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{}) if err != nil { @@ -34,12 +34,60 @@ func Open(dbPath string) error { DB = db logger.Info.Print("Opened DB") - if err := seedDatabase(); err != nil { - return err + + var count int64 + db.Model(&models.User{}).Count(&count) + if count == 0 { + admin, err := seedAdmin(adminMail) + if err != nil { + return err + } + result := db.Create(&admin) + if result.Error != nil { + return result.Error + } } return nil } +// TODO: Landing page to create an admin +func seedAdmin(userMail string) (*models.User, error) { + passwordBytes := make([]byte, 12) + _, err := rand.Read(passwordBytes) + if err != nil { + return nil, err + } + + // Encode into a URL-safe base64 string + password, err := base64.URLEncoding.EncodeToString(passwordBytes)[:12], nil + if err != nil { + return nil, err + } + hash, err := argon2id.CreateHash(password, argon2id.DefaultParams) + if err != nil { + return nil, err + } + + logger.Error.Print("==============================================================") + logger.Error.Printf("Admin Email: %v", userMail) + logger.Error.Printf("Admin Password: %v", password) + logger.Error.Print("==============================================================") + + return &models.User{ + FirstName: "ad", + LastName: "min", + DateOfBirth: time.Now(), + Password: hash, + Address: "Downhill 4", + ZipCode: "9999", + City: "TechTown", + Email: userMail, + Status: constants.ActiveStatus, + RoleID: constants.Roles.Editor, + }, nil + +} + func Close() error { logger.Info.Print("Closing DB") db, err := DB.DB() @@ -48,42 +96,3 @@ func Close() error { } return db.Close() } - -func seedDatabase() error { - var count int64 - DB.Model(&models.User{}).Count(&count) - if count == 0 { - bytes := make([]byte, 12) - _, err := rand.Read(bytes) - if err != nil { - return err - } - password := hex.EncodeToString(bytes) - hash, err := argon2id.CreateHash(password, argon2id.DefaultParams) - if err != nil { - return err - } - - admin := models.User{ - FirstName: "ad", - LastName: "min", - DateOfBirth: time.Now(), - Password: hash, - Address: "Downhill 4", - ZipCode: "9999", - City: "TechTown", - Status: constants.ActiveStatus, - RoleID: constants.Roles.Editor, - } - - result := DB.Create(&admin) - if result.Error != nil { - return result.Error - } - logger.Error.Print("==============================================================") - logger.Error.Printf("Admin Password: %v", password) - logger.Error.Print("==============================================================") - } - - return nil -}