package faker import ( "math/rand/v2" "time" "github.com/shopspring/decimal" "gitlab.mareshq.com/hq/yggdrasil/internal/money" "gitlab.mareshq.com/hq/yggdrasil/pkg/training" ) type Faker struct { trainingRepository training.TrainingRepository trainingDateRepository training.TrainingDateRepository } func NewFaker(trainingRepository training.TrainingRepository, trainingDateRepository training.TrainingDateRepository) *Faker { return &Faker{ trainingRepository: trainingRepository, trainingDateRepository: trainingDateRepository, } } func (f *Faker) GenerateFakeData() error { var trainings = []training.Training{ { Name: "Kubernetes", Days: 2, Description: "Kubernetes", Pricing: []training.TrainingPrice{ { Amount: decimal.NewFromInt(450), Currency: money.USD, Type: training.OpenTrainingPrice, }, { Amount: decimal.NewFromInt(2000), Currency: money.USD, Type: training.CorporateTrainingPrice, }, { Amount: decimal.NewFromInt(9900), Currency: money.CZK, Type: training.OpenTrainingPrice, }, { Amount: decimal.NewFromInt(49000), Currency: money.CZK, Type: training.CorporateTrainingPrice, }, }, }, { Name: "Terraform", Days: 1, Description: "Terraform", Pricing: []training.TrainingPrice{ { Amount: decimal.NewFromInt(200), Currency: money.USD, Type: training.OpenTrainingPrice, }, { Amount: decimal.NewFromInt(1000), Currency: money.USD, Type: training.CorporateTrainingPrice, }, { Amount: decimal.NewFromInt(4900), Currency: money.CZK, Type: training.OpenTrainingPrice, }, { Amount: decimal.NewFromInt(24000), Currency: money.CZK, Type: training.CorporateTrainingPrice, }, }, }, { Name: "RKE2", Days: 1, Description: "RKE2", Pricing: []training.TrainingPrice{ { Amount: decimal.NewFromInt(200), Currency: money.USD, Type: training.OpenTrainingPrice, }, { Amount: decimal.NewFromInt(1000), Currency: money.USD, Type: training.CorporateTrainingPrice, }, { Amount: decimal.NewFromInt(4900), Currency: money.CZK, Type: training.OpenTrainingPrice, }, { Amount: decimal.NewFromInt(24000), Currency: money.CZK, Type: training.CorporateTrainingPrice, }, }, }, { Name: "GitHub Actions", Days: 1, Description: "GitHub Actions", Pricing: []training.TrainingPrice{ { Amount: decimal.NewFromInt(200), Currency: money.USD, Type: training.OpenTrainingPrice, }, { Amount: decimal.NewFromInt(1000), Currency: money.USD, Type: training.CorporateTrainingPrice, }, { Amount: decimal.NewFromInt(4900), Currency: money.CZK, Type: training.OpenTrainingPrice, }, { Amount: decimal.NewFromInt(24000), Currency: money.CZK, Type: training.CorporateTrainingPrice, }, }, }, { Name: "GitLab CI", Days: 1, Description: "GitLab CI", Pricing: []training.TrainingPrice{ { Amount: decimal.NewFromInt(200), Currency: money.USD, Type: training.OpenTrainingPrice, }, { Amount: decimal.NewFromInt(1000), Currency: money.USD, Type: training.CorporateTrainingPrice, }, { Amount: decimal.NewFromInt(4900), Currency: money.CZK, Type: training.OpenTrainingPrice, }, { Amount: decimal.NewFromInt(24000), Currency: money.CZK, Type: training.CorporateTrainingPrice, }, }, }, { Name: "Prometheus", Days: 2, Description: "Prometheus", Pricing: []training.TrainingPrice{ { Amount: decimal.NewFromInt(450), Currency: money.USD, Type: training.OpenTrainingPrice, }, { Amount: decimal.NewFromInt(2000), Currency: money.USD, Type: training.CorporateTrainingPrice, }, { Amount: decimal.NewFromInt(9900), Currency: money.CZK, Type: training.OpenTrainingPrice, }, { Amount: decimal.NewFromInt(49000), Currency: money.CZK, Type: training.CorporateTrainingPrice, }, }, }, } for _, t := range trainings { err := f.trainingRepository.Create(&t) if err != nil { return err } r := rand.IntN(5) for i := 0; i < r; i++ { online := rand.IntN(4) == 0 location := "Praha" if online { location = "Online" } else { if rand.IntN(2) == 0 { location = "Brno" } } now := time.Now() minT := time.Date(now.Year(), now.Month(), now.Day(), 8, 0, 0, 0, time.UTC) maxT := time.Date(now.Year()+1, now.Month(), now.Day(), 8, 0, 0, 0, time.UTC) delta := maxT.Sub(minT) sec := rand.Int64N(int64(delta.Seconds())) + minT.UnixNano()/1000000000 date := time.Unix(sec, 0) amount := decimal.NewFromInt(4900) if t.Days == 2 { amount = decimal.NewFromInt(9900) } cur := money.CZK if online { cur = money.EUR if t.Days == 2 { amount = decimal.NewFromInt(450) } else { amount = decimal.NewFromInt(200) } } td := training.TrainingDate{ Date: date, StartTime: date.Truncate(24 * time.Hour), Days: t.Days, IsOnline: online, Location: location, Address: "TBD", Capacity: 12, PriceAmount: amount, PriceCurrency: cur, } dateErr := f.trainingDateRepository.Create(t.ID, &td) if dateErr != nil { return dateErr } } } return nil }