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

252 lines
5.6 KiB
Go

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.Repository
trainingDateRepository training.DateRepository
}
func NewFaker(trainingRepository training.Repository, trainingDateRepository training.DateRepository) *Faker {
return &Faker{
trainingRepository: trainingRepository,
trainingDateRepository: trainingDateRepository,
}
}
func (f *Faker) GenerateFakeData() error {
var trainings = []training.Training{
{
Name: "Kubernetes",
Days: 2,
Description: "Kubernetes",
Pricing: []training.Price{
{
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.Price{
{
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.Price{
{
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.Price{
{
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.Price{
{
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.Price{
{
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.Date{
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
}