github.com/goravel/framework@v1.13.9/database/seeder.go (about)

     1  package database
     2  
     3  import (
     4  	"github.com/gookit/color"
     5  	"github.com/goravel/framework/contracts/database/seeder"
     6  )
     7  
     8  type SeederFacade struct {
     9  	Seeders []seeder.Seeder
    10  	Called  []string
    11  }
    12  
    13  func NewSeederFacade() *SeederFacade {
    14  	return &SeederFacade{}
    15  }
    16  
    17  func (s *SeederFacade) Register(seeders []seeder.Seeder) {
    18  	existingSignatures := make(map[string]bool)
    19  
    20  	for _, seeder := range seeders {
    21  		signature := seeder.Signature()
    22  
    23  		if existingSignatures[signature] {
    24  			color.Redf("Duplicate seeder signature: %s in %T\n", signature, seeder)
    25  		} else {
    26  			existingSignatures[signature] = true
    27  			s.Seeders = append(s.Seeders, seeder)
    28  		}
    29  	}
    30  }
    31  
    32  func (s *SeederFacade) GetSeeder(name string) seeder.Seeder {
    33  	var seeder seeder.Seeder
    34  	for _, item := range s.Seeders {
    35  		if item.Signature() == name {
    36  			seeder = item
    37  			break
    38  		}
    39  	}
    40  
    41  	return seeder
    42  }
    43  
    44  func (s *SeederFacade) GetSeeders() []seeder.Seeder {
    45  	return s.Seeders
    46  }
    47  
    48  // Call executes the specified seeder(s).
    49  func (s *SeederFacade) Call(seeders []seeder.Seeder) error {
    50  	for _, seeder := range seeders {
    51  		signature := seeder.Signature()
    52  
    53  		if err := seeder.Run(); err != nil {
    54  			return err
    55  		}
    56  
    57  		if !contains(s.Called, signature) {
    58  			s.Called = append(s.Called, signature)
    59  		}
    60  	}
    61  	return nil
    62  }
    63  
    64  // CallOnce executes the specified seeder(s) only if they haven't been executed before.
    65  func (s *SeederFacade) CallOnce(seeders []seeder.Seeder) error {
    66  	for _, item := range seeders {
    67  		signature := item.Signature()
    68  
    69  		if contains(s.Called, signature) {
    70  			continue
    71  		}
    72  
    73  		if err := s.Call([]seeder.Seeder{item}); err != nil {
    74  			return err
    75  		}
    76  	}
    77  	return nil
    78  }
    79  
    80  // contains checks if a string exists in a slice.
    81  func contains(slice []string, str string) bool {
    82  	for _, s := range slice {
    83  		if s == str {
    84  			return true
    85  		}
    86  	}
    87  	return false
    88  }