Seeders

Seeders populate your database with initial or test data. Nimbus provides the database.Seeder interface and a SeedRunner to execute seeders in order.

The Seeder interface

Any type that implements Run(db *gorm.DB) error is a valid seeder:

type Seeder interface {
    Run(db *gorm.DB) error
}

Creating a seeder

Generate a seeder scaffold with the CLI:

nimbus make:seeder user_seeder

This creates a file in database/seeders/. Implement the Run method with your seed logic:

type UserSeeder struct{}

func (s *UserSeeder) Run(db *gorm.DB) error {
    users := []User{
        {Name: "Alice", Email: "alice@example.com", Role: "admin"},
        {Name: "Bob", Email: "bob@example.com", Role: "user"},
        {Name: "Charlie", Email: "charlie@example.com", Role: "user"},
    }
    return db.Create(&users).Error
}

Using SeedFunc

For simple seeders you can use database.SeedFunc to adapt a plain function without defining a struct:

tagSeeder := database.SeedFunc(func(db *gorm.DB) error {
    tags := []Tag{
        {Name: "go"}, {Name: "web"}, {Name: "nimbus"},
    }
    return db.Create(&tags).Error
})

Running seeders

Run all seeders from database/seeders/registry.go with:

nimbus db:seed

Or use database.NewSeedRunner programmatically:

runner := database.NewSeedRunner(db, []database.Seeder{
    &UserSeeder{},
    &PostSeeder{},
    tagSeeder,
})

if err := runner.Run(); err != nil {
    log.Fatalf("seeding failed: %v", err)
}

Seeding relationships

When seeding related records, order your seeders so parent records are created first. Use GORM associations or create records with explicit foreign keys:

type PostSeeder struct{}

func (s *PostSeeder) Run(db *gorm.DB) error {
    var admin User
    db.Where("role = ?", "admin").First(&admin)

    posts := []Post{
        {Title: "Welcome to Nimbus", Body: "Getting started guide", UserID: admin.ID},
        {Title: "Building APIs", Body: "REST API tutorial", UserID: admin.ID},
    }
    return db.Create(&posts).Error
}

Using faker data

For realistic test data, use a library like github.com/brianvoe/gofakeit inside your seeders:

func (s *UserSeeder) Run(db *gorm.DB) error {
    for i := 0; i < 50; i++ {
        user := User{
            Name:  gofakeit.Name(),
            Email: gofakeit.Email(),
            Role:  "user",
        }
        if err := db.Create(&user).Error; err != nil {
            return err
        }
    }
    return nil
}