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 }