snapshot of https://github.com/traggo/server.git (master, 2026-09-16; blobs > 131072B omitted)
Some checks failed
build / build (push) Failing after 3s
Some checks failed
build / build (push) Failing after 3s
This commit is contained in:
224
hack/datagen/datagen.go
Normal file
224
hack/datagen/datagen.go
Normal file
@@ -0,0 +1,224 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
gotime "time"
|
||||
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/traggo/server/database"
|
||||
"github.com/traggo/server/logger"
|
||||
"github.com/traggo/server/model"
|
||||
"github.com/traggo/server/time"
|
||||
"github.com/traggo/server/user/password"
|
||||
)
|
||||
|
||||
func main() {
|
||||
logger.Init(zerolog.InfoLevel)
|
||||
rand.Seed(0)
|
||||
var from string
|
||||
flag.StringVar(&from, "from", "now/y", "from")
|
||||
var to string
|
||||
flag.StringVar(&to, "to", "now", "to")
|
||||
|
||||
db, err := database.New("sqlite3", "data.db")
|
||||
noErr(err)
|
||||
defer db.Close()
|
||||
|
||||
log.Info().Msg("Creating User ...")
|
||||
user := &model.User{
|
||||
Name: "admin",
|
||||
Pass: password.CreatePassword("admin", 10),
|
||||
Admin: true,
|
||||
}
|
||||
noErr(db.Create(user).Error)
|
||||
log.Info().Msg("... Done")
|
||||
uID := user.ID
|
||||
|
||||
log.Info().Msg("Creating Tags ...")
|
||||
|
||||
db.Create(&model.TagDefinition{
|
||||
Key: "type",
|
||||
UserID: uID,
|
||||
Color: "#fff",
|
||||
})
|
||||
db.Create(&model.TagDefinition{
|
||||
Key: "issue",
|
||||
UserID: uID,
|
||||
Color: "#fff",
|
||||
})
|
||||
db.Create(&model.TagDefinition{
|
||||
Key: "meeting",
|
||||
UserID: uID,
|
||||
Color: "#fff",
|
||||
})
|
||||
db.Create(&model.TagDefinition{
|
||||
Key: "with",
|
||||
UserID: uID,
|
||||
Color: "#fff",
|
||||
})
|
||||
db.Create(&model.TagDefinition{
|
||||
Key: "misc",
|
||||
UserID: uID,
|
||||
Color: "#fff",
|
||||
})
|
||||
db.Create(&model.TagDefinition{
|
||||
Key: "proj",
|
||||
UserID: uID,
|
||||
Color: "#fff",
|
||||
})
|
||||
log.Info().Msg("... Done")
|
||||
|
||||
now := gotime.Now().UTC()
|
||||
fromTime, err := time.ParseTime(now, from, true, gotime.Monday)
|
||||
noErr(err)
|
||||
toTime, err := time.ParseTime(now, to, false, gotime.Sunday)
|
||||
noErr(err)
|
||||
|
||||
buckets := []bucket{
|
||||
{
|
||||
TimeSpans: generateSupport(),
|
||||
weight: 100,
|
||||
},
|
||||
{
|
||||
TimeSpans: generateMeeting(),
|
||||
weight: 30,
|
||||
},
|
||||
{
|
||||
TimeSpans: generateIssueType("gotify", "review"),
|
||||
weight: 100,
|
||||
Active: 6,
|
||||
},
|
||||
{
|
||||
TimeSpans: generateIssueType("gotify", "work"),
|
||||
weight: 100,
|
||||
Active: 6,
|
||||
},
|
||||
{
|
||||
TimeSpans: generateIssueType("traggo", "review"),
|
||||
weight: 100,
|
||||
Active: 6,
|
||||
},
|
||||
{
|
||||
TimeSpans: generateIssueType("traggo", "work"),
|
||||
weight: 100,
|
||||
Active: 6,
|
||||
},
|
||||
}
|
||||
|
||||
sum := 0
|
||||
for _, bucket := range buckets {
|
||||
sum += bucket.weight
|
||||
}
|
||||
|
||||
currentNow := fromTime
|
||||
|
||||
log.Info().Msg("Creating TimeSpans ...")
|
||||
for i := 1; currentNow.Before(toTime); i++ {
|
||||
selected := randInt(0, sum)
|
||||
current := 0
|
||||
var bucket bucket
|
||||
for _, bucket = range buckets {
|
||||
current += bucket.weight
|
||||
if current > selected {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
duration := gotime.Minute * gotime.Duration(randInt(1, 150))
|
||||
|
||||
ts := bucket.TimeSpans[randInt(0, len(bucket.TimeSpans))]
|
||||
end := currentNow.Add(duration)
|
||||
db.Create(&model.TimeSpan{
|
||||
Tags: ts.Tags,
|
||||
UserID: uID,
|
||||
StartUserTime: currentNow,
|
||||
StartUTC: currentNow,
|
||||
EndUserTime: &end,
|
||||
EndUTC: &end,
|
||||
OffsetUTC: 0,
|
||||
})
|
||||
currentNow = end.Add(gotime.Minute * gotime.Duration(randInt(1, 20)))
|
||||
if i%500 == 0 {
|
||||
log.Info().Msgf("Inserted %d ...", i)
|
||||
}
|
||||
}
|
||||
log.Info().Msg("... Done")
|
||||
}
|
||||
|
||||
func generateIssueType(proj, t string) []timeSpan {
|
||||
numbers := []int{}
|
||||
for i := 1; i <= 1000; i++ {
|
||||
numbers = append(numbers, i)
|
||||
}
|
||||
|
||||
result := []timeSpan{}
|
||||
for _, number := range numbers {
|
||||
result = append(result, timeSpan{
|
||||
Tags: []model.TimeSpanTag{
|
||||
{Key: "proj", StringValue: proj},
|
||||
{Key: "type", StringValue: t},
|
||||
{Key: "issue", StringValue: fmt.Sprintf("%X-%d", proj, number)},
|
||||
},
|
||||
Runtime: gotime.Hour * 24 * 12,
|
||||
})
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func generateMeeting() []timeSpan {
|
||||
names := []string{"weekly", "retro", "company", "team", "feature"}
|
||||
|
||||
result := []timeSpan{}
|
||||
for _, name := range names {
|
||||
result = append(result, timeSpan{
|
||||
Tags: []model.TimeSpanTag{
|
||||
{Key: "type", StringValue: "meeting"},
|
||||
{Key: "meeting", StringValue: name},
|
||||
},
|
||||
Runtime: gotime.Duration(-1),
|
||||
})
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func generateSupport() []timeSpan {
|
||||
names := []string{"Tom", "Jerry", "Nico", "Anton", "Noob", "Alex", "Bob", "jmattheis", "nicories"}
|
||||
|
||||
result := []timeSpan{}
|
||||
for _, name := range names {
|
||||
result = append(result, timeSpan{
|
||||
Tags: []model.TimeSpanTag{
|
||||
{Key: "type", StringValue: "support"},
|
||||
{Key: "with", StringValue: name},
|
||||
},
|
||||
Runtime: gotime.Duration(-1),
|
||||
})
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
type bucket struct {
|
||||
TimeSpans []timeSpan
|
||||
Active int
|
||||
CurrentlyActive []timeSpan
|
||||
weight int
|
||||
}
|
||||
|
||||
type timeSpan struct {
|
||||
ActiveSince gotime.Time
|
||||
Runtime gotime.Duration
|
||||
Tags []model.TimeSpanTag
|
||||
}
|
||||
|
||||
func noErr(err error) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func randInt(min int, max int) int {
|
||||
return min + rand.Intn(max-min)
|
||||
}
|
||||
Reference in New Issue
Block a user