1
0
Fork 0
This repository has been archived on 2025-09-02. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
mareshq-yggdrasil/internal/faker/faker.go

254 lines
5.7 KiB
Go

package faker
import (
"math/rand/v2"
"time"
"github.com/shopspring/decimal"
"gitlab.mareshq.com/hq/yggdrasil/internal/currency"
"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: currency.USD,
Type: training.OpenTrainingPrice,
},
{
Amount: decimal.NewFromInt(2000),
Currency: currency.USD,
Type: training.CorporateTrainingPrice,
},
{
Amount: decimal.NewFromInt(9900),
Currency: currency.CZK,
Type: training.OpenTrainingPrice,
},
{
Amount: decimal.NewFromInt(49000),
Currency: currency.CZK,
Type: training.CorporateTrainingPrice,
},
},
},
{
Name: "Terraform",
Days: 1,
Description: "Terraform",
Pricing: []training.TrainingPrice{
{
Amount: decimal.NewFromInt(200),
Currency: currency.USD,
Type: training.OpenTrainingPrice,
},
{
Amount: decimal.NewFromInt(1000),
Currency: currency.USD,
Type: training.CorporateTrainingPrice,
},
{
Amount: decimal.NewFromInt(4900),
Currency: currency.CZK,
Type: training.OpenTrainingPrice,
},
{
Amount: decimal.NewFromInt(24000),
Currency: currency.CZK,
Type: training.CorporateTrainingPrice,
},
},
},
{
Name: "RKE2",
Days: 1,
Description: "RKE2",
Pricing: []training.TrainingPrice{
{
Amount: decimal.NewFromInt(200),
Currency: currency.USD,
Type: training.OpenTrainingPrice,
},
{
Amount: decimal.NewFromInt(1000),
Currency: currency.USD,
Type: training.CorporateTrainingPrice,
},
{
Amount: decimal.NewFromInt(4900),
Currency: currency.CZK,
Type: training.OpenTrainingPrice,
},
{
Amount: decimal.NewFromInt(24000),
Currency: currency.CZK,
Type: training.CorporateTrainingPrice,
},
},
},
{
Name: "GitHub Actions",
Days: 1,
Description: "GitHub Actions",
Pricing: []training.TrainingPrice{
{
Amount: decimal.NewFromInt(200),
Currency: currency.USD,
Type: training.OpenTrainingPrice,
},
{
Amount: decimal.NewFromInt(1000),
Currency: currency.USD,
Type: training.CorporateTrainingPrice,
},
{
Amount: decimal.NewFromInt(4900),
Currency: currency.CZK,
Type: training.OpenTrainingPrice,
},
{
Amount: decimal.NewFromInt(24000),
Currency: currency.CZK,
Type: training.CorporateTrainingPrice,
},
},
},
{
Name: "GitLab CI",
Days: 1,
Description: "GitLab CI",
Pricing: []training.TrainingPrice{
{
Amount: decimal.NewFromInt(200),
Currency: currency.USD,
Type: training.OpenTrainingPrice,
},
{
Amount: decimal.NewFromInt(1000),
Currency: currency.USD,
Type: training.CorporateTrainingPrice,
},
{
Amount: decimal.NewFromInt(4900),
Currency: currency.CZK,
Type: training.OpenTrainingPrice,
},
{
Amount: decimal.NewFromInt(24000),
Currency: currency.CZK,
Type: training.CorporateTrainingPrice,
},
},
},
{
Name: "Prometheus",
Days: 2,
Description: "Prometheus",
Pricing: []training.TrainingPrice{
{
Amount: decimal.NewFromInt(450),
Currency: currency.USD,
Type: training.OpenTrainingPrice,
},
{
Amount: decimal.NewFromInt(2000),
Currency: currency.USD,
Type: training.CorporateTrainingPrice,
},
{
Amount: decimal.NewFromInt(9900),
Currency: currency.CZK,
Type: training.OpenTrainingPrice,
},
{
Amount: decimal.NewFromInt(49000),
Currency: currency.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()
min := time.Date(now.Year(), now.Month(), now.Day(), 8, 0, 0, 0, time.UTC)
max := time.Date(now.Year()+1, now.Month(), now.Day(), 8, 0, 0, 0, time.UTC)
delta := max.Sub(min)
sec := rand.Int64N(int64(delta.Seconds())) + min.UnixNano()/1000000000
date := time.Unix(sec, 0)
amount := decimal.NewFromInt(4900)
if t.Days == 2 {
amount = decimal.NewFromInt(9900)
}
cur := currency.CZK
if online {
cur = currency.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,
Price: training.TrainingDatePrice{
Amount: amount,
Currency: cur,
},
}
err := f.trainingDateRepository.Create(t.ID, &td)
if err != nil {
return err
}
}
}
return nil
}