79 lines
2.0 KiB
Go
79 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/joho/godotenv"
|
|
|
|
"github.com/techxcar/backend/internal/auth"
|
|
"github.com/techxcar/backend/internal/config"
|
|
"github.com/techxcar/backend/internal/server"
|
|
"github.com/techxcar/backend/internal/tenant"
|
|
"github.com/techxcar/backend/pkg/database"
|
|
redispkg "github.com/techxcar/backend/pkg/redis"
|
|
)
|
|
|
|
func main() {
|
|
if err := godotenv.Load(); err != nil {
|
|
log.Println("No .env file found, reading from environment")
|
|
}
|
|
|
|
cfg, err := config.Load()
|
|
if err != nil {
|
|
log.Fatal("Config error:", err)
|
|
}
|
|
|
|
db, err := database.New(cfg.DatabaseURL)
|
|
if err != nil {
|
|
log.Fatal("Database error:", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
if err := db.MigratePublic(cfg.DatabaseURL, "migrations/public"); err != nil {
|
|
log.Fatal("Migration error:", err)
|
|
}
|
|
|
|
if err := db.MigrateAllTenantSchemas(context.Background(), "migrations/tenant"); err != nil {
|
|
log.Fatal("Tenant migration error:", err)
|
|
}
|
|
|
|
rdb, err := redispkg.New(cfg.RedisURL)
|
|
if err != nil {
|
|
log.Fatal("Redis error:", err)
|
|
}
|
|
defer rdb.Close()
|
|
|
|
seedSuperAdmin(db, cfg)
|
|
|
|
app := server.New(server.Deps{Config: cfg, DB: db, Redis: rdb})
|
|
|
|
log.Printf("TechXCar API v0.2.0 listening on :%s (env: %s)", cfg.Port, cfg.AppEnv)
|
|
log.Fatal(app.Listen(":" + cfg.Port))
|
|
}
|
|
|
|
func seedSuperAdmin(db *database.DB, cfg *config.Config) {
|
|
if cfg.InitialAdminEmail == "" || cfg.InitialAdminPassword == "" {
|
|
return
|
|
}
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
repo := tenant.NewRepository(db)
|
|
existing, err := repo.GetSuperAdminByEmail(ctx, cfg.InitialAdminEmail)
|
|
if err != nil || existing != nil {
|
|
return
|
|
}
|
|
hash, err := auth.HashPassword(cfg.InitialAdminPassword)
|
|
if err != nil {
|
|
log.Printf("Warning: could not hash initial admin password: %v", err)
|
|
return
|
|
}
|
|
if _, err := repo.CreateSuperAdmin(ctx, cfg.InitialAdminEmail, hash); err != nil {
|
|
log.Printf("Warning: could not create initial super admin: %v", err)
|
|
return
|
|
}
|
|
log.Printf("Initial super admin created: %s", cfg.InitialAdminEmail)
|
|
}
|