Files
warehouse-management-BE/cmd/seed/main.go
Tran Anh Tuan 6a4a96e0ca Base Project
2026-05-08 14:32:24 +07:00

105 lines
2.5 KiB
Go

package main
import (
"context"
"fmt"
"wm-backend/configs"
"wm-backend/internal/initialization"
"wm-backend/internal/models"
"wm-backend/pkg/helper"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/rs/zerolog/log"
)
func main() {
cfg, err := configs.LoadConfig("configs")
if err != nil {
log.Fatal().Err(err).Msg("Error loading config")
}
pool, err := initialization.ConnectPostgreSQL(&cfg)
if err != nil {
log.Fatal().Err(err).Msg("Error connecting to database")
}
defer pool.Close()
err = seedAdmin(pool, &cfg)
if err != nil {
log.Fatal().Err(err).Msg("Error seeding admin")
}
log.Info().Msg("Seed completed successfully")
}
func seedAdmin(pool *pgxpool.Pool, cfg *models.Config) error {
ctx := context.Background()
// Check if admin user already exists
var exists bool
err := pool.QueryRow(ctx,
"SELECT EXISTS(SELECT 1 FROM users WHERE username = $1)",
cfg.Admin.Username,
).Scan(&exists)
if err != nil {
return fmt.Errorf("checking existing admin: %w", err)
}
if exists {
log.Info().Str("username", cfg.Admin.Username).Msg("Admin user already exists, skipping")
return nil
}
// Hash password
hashedPassword, err := helper.HashPassword(cfg.Admin.Password)
if err != nil {
return fmt.Errorf("hashing password: %w", err)
}
// Get SYS_ADMIN role ID
var roleID string
err = pool.QueryRow(ctx,
"SELECT id FROM roles WHERE name = 'SYS_ADMIN'",
).Scan(&roleID)
if err != nil {
return fmt.Errorf("SYS_ADMIN role not found (did init.sql run?): %w", err)
}
// Create admin user and assign role in a transaction
tx, err := pool.Begin(ctx)
if err != nil {
return fmt.Errorf("begin transaction: %w", err)
}
defer tx.Rollback(ctx)
var userID string
err = tx.QueryRow(ctx,
`INSERT INTO users (username, email, password_hash, full_name, is_active, created_by)
VALUES ($1, $2, $3, $4, TRUE, 'system')
RETURNING id`,
cfg.Admin.Username, cfg.Admin.Email, hashedPassword, cfg.Admin.FullName,
).Scan(&userID)
if err != nil {
return fmt.Errorf("creating admin user: %w", err)
}
_, err = tx.Exec(ctx,
`INSERT INTO user_roles (user_id, role_id) VALUES ($1, $2)`,
userID, roleID,
)
if err != nil {
return fmt.Errorf("assigning SYS_ADMIN role: %w", err)
}
if err := tx.Commit(ctx); err != nil {
return fmt.Errorf("commit transaction: %w", err)
}
log.Info().
Str("username", cfg.Admin.Username).
Str("email", cfg.Admin.Email).
Str("role", "SYS_ADMIN").
Msg("Admin user created successfully")
return nil
}