Files
dttmr-api/cmd/bootstrap/main.go
T

87 lines
2.1 KiB
Go

package main
import (
"context"
"database/sql"
"flag"
"log/slog"
"os"
"time"
"github.com/joho/godotenv"
"github.com/robindittmar/dttmr-api/internal/config"
"github.com/robindittmar/dttmr-api/internal/database"
"github.com/robindittmar/dttmr-api/internal/domain"
"github.com/robindittmar/dttmr-api/internal/repository"
)
var (
Version = "dev"
Commit = "none"
BuildTime = "unknown"
)
func main() {
time.Local, _ = time.LoadLocation("UTC")
_ = godotenv.Load(".env")
setupLogging()
email := flag.String("email", "admin@example.com", "Admin email address")
name := flag.String("name", "admin", "Admin name")
password := flag.String("password", "", "Admin password")
cfg := config.Load()
slog.Info("starting bootstrap",
slog.String("version", Version),
slog.String("commit", Commit),
slog.String("build_time", BuildTime),
)
defer slog.Info("bootstrap complete!")
db, err := database.New(context.Background(), cfg.DatabaseURL)
if err != nil {
slog.Error("failed to initialize database", slog.Any("error", err))
os.Exit(1)
}
defer func() {
err := db.Close()
if err != nil {
slog.Error("failed to close database connection", slog.Any("error", err))
}
}()
if err := database.RunMigrations(db); err != nil {
slog.Error("failed to run migrations", slog.Any("error", err))
os.Exit(1)
}
if *password != "" {
err := seedAdminUser(db, *email, *name, *password)
if err != nil {
slog.Error("failed to seed admin user", slog.Any("error", err))
} else {
slog.Info("admin user seeded", slog.String("email", *email), slog.String("name", *name))
}
} else {
slog.Info("skipping admin user seeding, no password provided")
}
}
func seedAdminUser(db *sql.DB, email string, name string, password string) error {
userRepo := repository.NewUserRepo(db)
userService := domain.NewUserService(userRepo)
_, err := userService.CreateUser(context.Background(), email, name, password)
return err
}
func setupLogging() {
baseHandler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
})
logger := slog.New(baseHandler)
slog.SetDefault(logger)
}