From b1b6697e630c9fbee7ca8a425de8bd61cbc61561 Mon Sep 17 00:00:00 2001 From: Milan Pavlik Date: Sun, 27 Mar 2022 20:41:40 +0200 Subject: [PATCH 01/10] WIP: Implement db model in go --- components/gitpod-db-go/pagination.go | 8 ++++++ components/gitpod-db-go/project.go | 24 ++++++++++++++++++ components/gitpod-db-go/team-membership.go | 24 ++++++++++++++++++ components/gitpod-db-go/team.go | 29 ++++++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 components/gitpod-db-go/pagination.go create mode 100644 components/gitpod-db-go/project.go create mode 100644 components/gitpod-db-go/team-membership.go create mode 100644 components/gitpod-db-go/team.go diff --git a/components/gitpod-db-go/pagination.go b/components/gitpod-db-go/pagination.go new file mode 100644 index 00000000000000..baae7d27276bbb --- /dev/null +++ b/components/gitpod-db-go/pagination.go @@ -0,0 +1,8 @@ +package db + +type Pagination struct { + // Limit restricts the number of results returned + Limit int + // Offset specifies the offset for DB query + Offset int +} diff --git a/components/gitpod-db-go/project.go b/components/gitpod-db-go/project.go new file mode 100644 index 00000000000000..831652e658eee4 --- /dev/null +++ b/components/gitpod-db-go/project.go @@ -0,0 +1,24 @@ +package db + +type Project struct { + ID string + Name string + Slug string + CloneURL string + + TeamID string + UserID string + AppInstallationID string + + Config *ProjectConfig + Settings *ProjectSettings + CreationTime string + Deleted bool + MarkedDeleted bool +} + +type ProjectConfig struct { +} + +type ProjectSettings struct { +} diff --git a/components/gitpod-db-go/team-membership.go b/components/gitpod-db-go/team-membership.go new file mode 100644 index 00000000000000..ad56eba00e9901 --- /dev/null +++ b/components/gitpod-db-go/team-membership.go @@ -0,0 +1,24 @@ +package db + +import "context" + +type TeamMemberRole string + +const ( + TeamMemberRole_Owner = "owner" + TeamMemberRole_Member = "member" +) + +type TeamMembership struct { + ID string + TeamID string + UserID string + Role TeamMemberRole + + CreationTime string + Deleted bool +} + +type TeamMembershipRepository interface { + ListByTeam(ctx context.Context, teamID string) ([]*TeamMembership, error) +} diff --git a/components/gitpod-db-go/team.go b/components/gitpod-db-go/team.go new file mode 100644 index 00000000000000..e9b0862ae455d5 --- /dev/null +++ b/components/gitpod-db-go/team.go @@ -0,0 +1,29 @@ +package db + +import "context" + +type Team struct { + ID string + Name string + Slug string + CreationTime string + MarkedDeleted bool +} + +type ListOpts struct { + Pagination + + OrderBy string + SearchTerm string +} + +type TeamRepository interface { + List(ctx context.Context, opts ListOpts) ([]*Team, error) + + Get(ctx context.Context, id string) (*Team, error) + GetByUser(ctx context.Context, userID string) (*Team, error) + + Create(ctx context.Context, team Team) (*Team, error) + + Delete(ctx context.Context, id string) (*Team, error) +} From c07939e4523d8cacb24dba1dffe17b3b9a9d2adc Mon Sep 17 00:00:00 2001 From: Milan Pavlik Date: Sun, 27 Mar 2022 19:09:45 +0000 Subject: [PATCH 02/10] basic --- components/gitpod-db-go/team.go | 9 ++++++--- components/gitpod-db-go/team_test.go | 10 ++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 components/gitpod-db-go/team_test.go diff --git a/components/gitpod-db-go/team.go b/components/gitpod-db-go/team.go index e9b0862ae455d5..d0369f037689f1 100644 --- a/components/gitpod-db-go/team.go +++ b/components/gitpod-db-go/team.go @@ -1,12 +1,15 @@ package db -import "context" +import ( + "context" + "time" +) type Team struct { - ID string + ID string `gorm:"primaryKey"` Name string Slug string - CreationTime string + CreationTime time.Time MarkedDeleted bool } diff --git a/components/gitpod-db-go/team_test.go b/components/gitpod-db-go/team_test.go new file mode 100644 index 00000000000000..34f0ad62bdbfc8 --- /dev/null +++ b/components/gitpod-db-go/team_test.go @@ -0,0 +1,10 @@ +package db + +import ( + "gorm.io/driver/mysql" + "gorm.io/gorm" +) + +func TestTeam(t *testing.T) { + +} From 6cd9c543971d52a89275f89d5b66b82d664fb761 Mon Sep 17 00:00:00 2001 From: Milan Pavlik Date: Sun, 27 Mar 2022 21:47:10 +0200 Subject: [PATCH 03/10] query works --- components/gitpod-db-go/go.mod | 14 ++++++++++++++ components/gitpod-db-go/go.sum | 11 +++++++++++ components/gitpod-db-go/team.go | 7 ++++++- components/gitpod-db-go/team_test.go | 14 ++++++++++++++ components/gitpod-db-go/time.go | 21 +++++++++++++++++++++ 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 components/gitpod-db-go/go.mod create mode 100644 components/gitpod-db-go/go.sum create mode 100644 components/gitpod-db-go/time.go diff --git a/components/gitpod-db-go/go.mod b/components/gitpod-db-go/go.mod new file mode 100644 index 00000000000000..e465fb4c82de94 --- /dev/null +++ b/components/gitpod-db-go/go.mod @@ -0,0 +1,14 @@ +module github.com/gitpod-io/gitpod/gitpod-db + +go 1.18 + +require ( + gorm.io/driver/mysql v1.3.2 + gorm.io/gorm v1.23.3 +) + +require ( + github.com/go-sql-driver/mysql v1.6.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.4 // indirect +) diff --git a/components/gitpod-db-go/go.sum b/components/gitpod-db-go/go.sum new file mode 100644 index 00000000000000..a8c5e6b1f61b3f --- /dev/null +++ b/components/gitpod-db-go/go.sum @@ -0,0 +1,11 @@ +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +gorm.io/driver/mysql v1.3.2 h1:QJryWiqQ91EvZ0jZL48NOpdlPdMjdip1hQ8bTgo4H7I= +gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= +gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.23.3 h1:jYh3nm7uLZkrMVfA8WVNjDZryKfr7W+HTlInVgKFJAg= +gorm.io/gorm v1.23.3/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= diff --git a/components/gitpod-db-go/team.go b/components/gitpod-db-go/team.go index d0369f037689f1..ead6554deb31b4 100644 --- a/components/gitpod-db-go/team.go +++ b/components/gitpod-db-go/team.go @@ -9,10 +9,15 @@ type Team struct { ID string `gorm:"primaryKey"` Name string Slug string - CreationTime time.Time + CreationTime time.Time `gorm:"column:creationTime"` MarkedDeleted bool } +// TableName overrides default GORM handling of table name generation +func (t *Team) TableName() string { + return "d_b_team" +} + type ListOpts struct { Pagination diff --git a/components/gitpod-db-go/team_test.go b/components/gitpod-db-go/team_test.go index 34f0ad62bdbfc8..a09a646c956446 100644 --- a/components/gitpod-db-go/team_test.go +++ b/components/gitpod-db-go/team_test.go @@ -1,10 +1,24 @@ package db import ( + "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" + "testing" ) func TestTeam(t *testing.T) { + // refer https://github.com/go-sql-driver/mysql#dsn-data-source-name for details + dsn := "gitpod:@tcp(127.0.0.1:3306)/gitpod" + db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) + if err != nil { + t.Fatal("could not connect to db") + } + team := Team{} + if tx := db.First(&team); tx.Error != nil { + fmt.Println(tx.Error) + } + + fmt.Println(team) } diff --git a/components/gitpod-db-go/time.go b/components/gitpod-db-go/time.go new file mode 100644 index 00000000000000..4eb258c42b5105 --- /dev/null +++ b/components/gitpod-db-go/time.go @@ -0,0 +1,21 @@ +package db + +import ( + "database/sql/driver" + "fmt" +) + +// StringlyTime is a legacy timestamp defiinition +type StringlyTime string + +func (s StringlyTime) Value() (driver.Value, error) { +} + +func (s StringlyTime) Scan(src any) error { + if val, ok := src.(string); ok { + s = StringlyTime(val) + return nil + } + + return fmt.Errorf("failed to convert") +} From 0952af5f874f1766ebfae4c3eaf98d1f06cd3e12 Mon Sep 17 00:00:00 2001 From: Milan Pavlik Date: Mon, 28 Mar 2022 11:44:10 +0000 Subject: [PATCH 04/10] yolo --- .idea/misc.xml | 23 +++++++++++++++++++++++ components/gitpod-db-go/conn.go | 20 ++++++++++++++++++++ components/gitpod-db-go/go.mod | 6 +++++- components/gitpod-db-go/go.sum | 11 +++++++++++ components/gitpod-db-go/team_test.go | 22 +++++++++++++--------- components/gitpod-db-go/time.go | 27 +++++++++++---------------- 6 files changed, 83 insertions(+), 26 deletions(-) create mode 100644 .idea/misc.xml create mode 100644 components/gitpod-db-go/conn.go diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000000000..c5e7b42a15b6d3 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/components/gitpod-db-go/conn.go b/components/gitpod-db-go/conn.go new file mode 100644 index 00000000000000..e698faa80b21f6 --- /dev/null +++ b/components/gitpod-db-go/conn.go @@ -0,0 +1,20 @@ +package db + +import ( + "fmt" + "gorm.io/driver/mysql" + "gorm.io/gorm" +) + +type ConnectionParams struct { + User string + Password string + Host string + Database string +} + +func Connect(p ConnectionParams) (*gorm.DB, error) { + // refer https://github.com/go-sql-driver/mysql#dsn-data-source-name for details + dsn := fmt.Sprintf("%s:%s@%s/%s", p.User, p.Password, p.Host, p.Database) + return gorm.Open(mysql.Open(dsn), &gorm.Config{}) +} diff --git a/components/gitpod-db-go/go.mod b/components/gitpod-db-go/go.mod index e465fb4c82de94..1894f0e76c7f3a 100644 --- a/components/gitpod-db-go/go.mod +++ b/components/gitpod-db-go/go.mod @@ -1,14 +1,18 @@ module github.com/gitpod-io/gitpod/gitpod-db -go 1.18 +go 1.17 require ( + github.com/stretchr/testify v1.7.1 gorm.io/driver/mysql v1.3.2 gorm.io/gorm v1.23.3 ) require ( + github.com/davecgh/go-spew v1.1.0 // indirect github.com/go-sql-driver/mysql v1.6.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.4 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect ) diff --git a/components/gitpod-db-go/go.sum b/components/gitpod-db-go/go.sum index a8c5e6b1f61b3f..b1f09e65860a6c 100644 --- a/components/gitpod-db-go/go.sum +++ b/components/gitpod-db-go/go.sum @@ -1,9 +1,20 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.3.2 h1:QJryWiqQ91EvZ0jZL48NOpdlPdMjdip1hQ8bTgo4H7I= gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= diff --git a/components/gitpod-db-go/team_test.go b/components/gitpod-db-go/team_test.go index a09a646c956446..1626ef09a31277 100644 --- a/components/gitpod-db-go/team_test.go +++ b/components/gitpod-db-go/team_test.go @@ -2,22 +2,26 @@ package db import ( "fmt" - "gorm.io/driver/mysql" - "gorm.io/gorm" + "github.com/stretchr/testify/require" + "os" "testing" ) func TestTeam(t *testing.T) { - // refer https://github.com/go-sql-driver/mysql#dsn-data-source-name for details - dsn := "gitpod:@tcp(127.0.0.1:3306)/gitpod" - db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) - if err != nil { - t.Fatal("could not connect to db") - } + pass := os.Getenv("MYSQL_DB_PASS") + require.NotEmpty(t, pass) + + db, err := Connect(ConnectionParams{ + User: "gitpod", + Password: pass, + Host: "tcp(127.0.0.1:3306)", + Database: "gitpod", + }) + require.NoError(t, err) team := Team{} if tx := db.First(&team); tx.Error != nil { - fmt.Println(tx.Error) + require.NoError(t, tx.Error) } fmt.Println(team) diff --git a/components/gitpod-db-go/time.go b/components/gitpod-db-go/time.go index 4eb258c42b5105..1ca7a94b51cdd6 100644 --- a/components/gitpod-db-go/time.go +++ b/components/gitpod-db-go/time.go @@ -1,21 +1,16 @@ package db -import ( - "database/sql/driver" - "fmt" -) - // StringlyTime is a legacy timestamp defiinition type StringlyTime string -func (s StringlyTime) Value() (driver.Value, error) { -} - -func (s StringlyTime) Scan(src any) error { - if val, ok := src.(string); ok { - s = StringlyTime(val) - return nil - } - - return fmt.Errorf("failed to convert") -} +//func (s StringlyTime) Value() (driver.Value, error) { +//} +// +//func (s StringlyTime) Scan(src any) error { +// if val, ok := src.(string); ok { +// s = StringlyTime(val) +// return nil +// } +// +// return fmt.Errorf("failed to convert") +//} From ee90a13aee5ddb364a49a530748107765c846c71 Mon Sep 17 00:00:00 2001 From: Milan Pavlik Date: Mon, 28 Mar 2022 12:11:55 +0000 Subject: [PATCH 05/10] make it work --- .idea/misc.xml | 16 ++++++--- components/gitpod-db-go/conn.go | 2 +- components/gitpod-db-go/team.go | 3 +- components/gitpod-db-go/time.go | 59 ++++++++++++++++++++++++++------- 4 files changed, 61 insertions(+), 19 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index c5e7b42a15b6d3..2f00c8e5e8bb66 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -6,16 +6,24 @@ diff --git a/components/gitpod-db-go/conn.go b/components/gitpod-db-go/conn.go index e698faa80b21f6..08ab7e8cad1c20 100644 --- a/components/gitpod-db-go/conn.go +++ b/components/gitpod-db-go/conn.go @@ -15,6 +15,6 @@ type ConnectionParams struct { func Connect(p ConnectionParams) (*gorm.DB, error) { // refer https://github.com/go-sql-driver/mysql#dsn-data-source-name for details - dsn := fmt.Sprintf("%s:%s@%s/%s", p.User, p.Password, p.Host, p.Database) + dsn := fmt.Sprintf("%s:%s@%s/%s?charset=utf8mb4&parseTime=True&loc=Local", p.User, p.Password, p.Host, p.Database) return gorm.Open(mysql.Open(dsn), &gorm.Config{}) } diff --git a/components/gitpod-db-go/team.go b/components/gitpod-db-go/team.go index ead6554deb31b4..931ebe56f0097b 100644 --- a/components/gitpod-db-go/team.go +++ b/components/gitpod-db-go/team.go @@ -2,14 +2,13 @@ package db import ( "context" - "time" ) type Team struct { ID string `gorm:"primaryKey"` Name string Slug string - CreationTime time.Time `gorm:"column:creationTime"` + CreationTime StringlyTime `gorm:"column:creationTime"` MarkedDeleted bool } diff --git a/components/gitpod-db-go/time.go b/components/gitpod-db-go/time.go index 1ca7a94b51cdd6..48690da43231d7 100644 --- a/components/gitpod-db-go/time.go +++ b/components/gitpod-db-go/time.go @@ -1,16 +1,51 @@ package db +import ( + "database/sql/driver" + "fmt" + "time" +) + // StringlyTime is a legacy timestamp defiinition -type StringlyTime string +type StringlyTime struct { + Time time.Time + Valid bool +} + +// Scan implements the Scanner interface. +func (n *StringlyTime) Scan(value interface{}) error { + if value == nil { + n.Time, n.Valid = time.Time{}, false + return nil + } + n.Valid = true + + switch s := value.(type) { + case []uint8: + parsed, err := time.Parse(time.RFC3339, string(s)) + if err != nil { + return fmt.Errorf("failed to parse %v: %w", value, err) + } + n.Time = parsed + case string: + parsed, err := time.Parse(time.RFC3339, s) + if err != nil { + return fmt.Errorf("failed to parse %v: %w", value, err) + } + n.Time = parsed + } + + return nil +} + +// Value implements the driver Valuer interface. +func (n *StringlyTime) Value() (driver.Value, error) { + if !n.Valid { + return nil, nil + } + return n.Time, nil +} -//func (s StringlyTime) Value() (driver.Value, error) { -//} -// -//func (s StringlyTime) Scan(src any) error { -// if val, ok := src.(string); ok { -// s = StringlyTime(val) -// return nil -// } -// -// return fmt.Errorf("failed to convert") -//} +func (n *StringlyTime) String() string { + return n.Time.Format(time.RFC3339) +} From 4412749df16510b094d602ac185c393026c82604 Mon Sep 17 00:00:00 2001 From: Milan Pavlik Date: Mon, 28 Mar 2022 13:04:44 +0000 Subject: [PATCH 06/10] Fix --- .idea/misc.xml | 40 ++++++++++++++++------ components/gitpod-db-go/go.mod | 1 + components/gitpod-db-go/go.sum | 2 ++ components/gitpod-db-go/team.go | 5 +-- components/gitpod-db-go/team_test.go | 39 ++++++++++++++++++--- components/gitpod-db-go/time.go | 51 ---------------------------- components/gitpod-db-go/types.go | 42 +++++++++++++++++++++++ 7 files changed, 113 insertions(+), 67 deletions(-) delete mode 100644 components/gitpod-db-go/time.go create mode 100644 components/gitpod-db-go/types.go diff --git a/.idea/misc.xml b/.idea/misc.xml index 2f00c8e5e8bb66..4c6237f4586e98 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -6,24 +6,44 @@ diff --git a/components/gitpod-db-go/go.mod b/components/gitpod-db-go/go.mod index 1894f0e76c7f3a..73dc9f94f963a3 100644 --- a/components/gitpod-db-go/go.mod +++ b/components/gitpod-db-go/go.mod @@ -3,6 +3,7 @@ module github.com/gitpod-io/gitpod/gitpod-db go 1.17 require ( + github.com/google/uuid v1.3.0 github.com/stretchr/testify v1.7.1 gorm.io/driver/mysql v1.3.2 gorm.io/gorm v1.23.3 diff --git a/components/gitpod-db-go/go.sum b/components/gitpod-db-go/go.sum index b1f09e65860a6c..56420c92043195 100644 --- a/components/gitpod-db-go/go.sum +++ b/components/gitpod-db-go/go.sum @@ -2,6 +2,8 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas= diff --git a/components/gitpod-db-go/team.go b/components/gitpod-db-go/team.go index 931ebe56f0097b..54cfc2fa05dbb4 100644 --- a/components/gitpod-db-go/team.go +++ b/components/gitpod-db-go/team.go @@ -2,14 +2,15 @@ package db import ( "context" + "github.com/google/uuid" ) type Team struct { - ID string `gorm:"primaryKey"` + ID uuid.UUID `gorm:"primaryKey"` Name string Slug string CreationTime StringlyTime `gorm:"column:creationTime"` - MarkedDeleted bool + MarkedDeleted bool `gorm:"column:markedDeleted"` } // TableName overrides default GORM handling of table name generation diff --git a/components/gitpod-db-go/team_test.go b/components/gitpod-db-go/team_test.go index 1626ef09a31277..4e30abbb24c793 100644 --- a/components/gitpod-db-go/team_test.go +++ b/components/gitpod-db-go/team_test.go @@ -1,10 +1,11 @@ package db import ( - "fmt" + "github.com/google/uuid" "github.com/stretchr/testify/require" "os" "testing" + "time" ) func TestTeam(t *testing.T) { @@ -20,9 +21,39 @@ func TestTeam(t *testing.T) { require.NoError(t, err) team := Team{} - if tx := db.First(&team); tx.Error != nil { - require.NoError(t, tx.Error) + tx := db.First(&team) + require.NoError(t, tx.Error) + + teamToCreate := Team{ + ID: uuid.New(), + Name: "foo-bar", + Slug: "foobar", + CreationTime: NewStringlyTime(time.Now()), + MarkedDeleted: false, } + tx = db.Create(&teamToCreate) + require.NoError(t, tx.Error) +} + +func TestTeam_Create(t *testing.T) { + pass := os.Getenv("MYSQL_DB_PASS") + require.NotEmpty(t, pass) + + db, err := Connect(ConnectionParams{ + User: "gitpod", + Password: pass, + Host: "tcp(127.0.0.1:3306)", + Database: "gitpod", + }) + require.NoError(t, err) - fmt.Println(team) + team := Team{ + ID: uuid.New(), + Name: "foo-bar", + Slug: "foobar", + CreationTime: NewStringlyTime(time.Now()), + MarkedDeleted: false, + } + tx := db.Create(&team) + require.NoError(t, tx.Error) } diff --git a/components/gitpod-db-go/time.go b/components/gitpod-db-go/time.go deleted file mode 100644 index 48690da43231d7..00000000000000 --- a/components/gitpod-db-go/time.go +++ /dev/null @@ -1,51 +0,0 @@ -package db - -import ( - "database/sql/driver" - "fmt" - "time" -) - -// StringlyTime is a legacy timestamp defiinition -type StringlyTime struct { - Time time.Time - Valid bool -} - -// Scan implements the Scanner interface. -func (n *StringlyTime) Scan(value interface{}) error { - if value == nil { - n.Time, n.Valid = time.Time{}, false - return nil - } - n.Valid = true - - switch s := value.(type) { - case []uint8: - parsed, err := time.Parse(time.RFC3339, string(s)) - if err != nil { - return fmt.Errorf("failed to parse %v: %w", value, err) - } - n.Time = parsed - case string: - parsed, err := time.Parse(time.RFC3339, s) - if err != nil { - return fmt.Errorf("failed to parse %v: %w", value, err) - } - n.Time = parsed - } - - return nil -} - -// Value implements the driver Valuer interface. -func (n *StringlyTime) Value() (driver.Value, error) { - if !n.Valid { - return nil, nil - } - return n.Time, nil -} - -func (n *StringlyTime) String() string { - return n.Time.Format(time.RFC3339) -} diff --git a/components/gitpod-db-go/types.go b/components/gitpod-db-go/types.go new file mode 100644 index 00000000000000..5e8c78e394d89e --- /dev/null +++ b/components/gitpod-db-go/types.go @@ -0,0 +1,42 @@ +package db + +import ( + "database/sql/driver" + "fmt" + "time" +) + +func NewStringlyTime(t time.Time) StringlyTime { + return StringlyTime(t) +} + +// StringlyTime exists for cases where records are inserted into the DB as VARCHAR but actually contain a timestamp which is time.RFC3339 +type StringlyTime time.Time + +// Scan implements the Scanner interface. +func (n StringlyTime) Scan(value interface{}) error { + if value == nil { + return fmt.Errorf("nil value") + } + + switch s := value.(type) { + case []uint8: + parsed, err := time.Parse(time.RFC3339, string(s)) + if err != nil { + return fmt.Errorf("failed to parse %v: %w", value, err) + } + n = StringlyTime(parsed) + } + + return nil +} + +// Value implements the driver Valuer interface. +func (n StringlyTime) Value() (driver.Value, error) { + + return time.Time(n).UTC(), nil +} + +//func (n *StringlyTime) String() string { +// return n.Time.Format(time.RFC3339) +//} From 673a1dd94dd63ab4f40b5afd75175cd01b6ebaaf Mon Sep 17 00:00:00 2001 From: Milan Pavlik Date: Sat, 9 Apr 2022 21:32:31 +0200 Subject: [PATCH 07/10] fix --- .idea/misc.xml | 51 -------------------------------------------------- 1 file changed, 51 deletions(-) delete mode 100644 .idea/misc.xml diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 4c6237f4586e98..00000000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - \ No newline at end of file From 454d808befc26f2c381f6918f1609dddd616271d Mon Sep 17 00:00:00 2001 From: Milan Pavlik Date: Sun, 10 Apr 2022 15:22:11 +0000 Subject: [PATCH 08/10] fix datetime serialization --- components/gitpod-db-go/conn.go | 18 ++++++- components/gitpod-db-go/go.mod | 3 +- components/gitpod-db-go/go.sum | 2 + components/gitpod-db-go/team.go | 4 +- components/gitpod-db-go/team_test.go | 72 +++++++++++++++++----------- components/gitpod-db-go/types.go | 40 +++++++++++----- 6 files changed, 94 insertions(+), 45 deletions(-) diff --git a/components/gitpod-db-go/conn.go b/components/gitpod-db-go/conn.go index 08ab7e8cad1c20..940ce3066f7a6d 100644 --- a/components/gitpod-db-go/conn.go +++ b/components/gitpod-db-go/conn.go @@ -1,9 +1,10 @@ package db import ( - "fmt" + driver_mysql "github.com/go-sql-driver/mysql" "gorm.io/driver/mysql" "gorm.io/gorm" + "time" ) type ConnectionParams struct { @@ -14,7 +15,20 @@ type ConnectionParams struct { } func Connect(p ConnectionParams) (*gorm.DB, error) { + loc, _ := time.LoadLocation("UTC") + cfg := driver_mysql.Config{ + User: p.User, + Passwd: p.Password, + Net: "tcp", + Addr: p.Host, + DBName: p.Database, + Loc: loc, + AllowNativePasswords: true, + } + + dsn := cfg.FormatDSN() + // refer https://github.com/go-sql-driver/mysql#dsn-data-source-name for details - dsn := fmt.Sprintf("%s:%s@%s/%s?charset=utf8mb4&parseTime=True&loc=Local", p.User, p.Password, p.Host, p.Database) + //dsn := fmt.Sprintf("%s:%s@%s/%s?charset=utf8mb4&parseTime=True&loc=Local", p.User, p.Password, p.Host, p.Database) return gorm.Open(mysql.Open(dsn), &gorm.Config{}) } diff --git a/components/gitpod-db-go/go.mod b/components/gitpod-db-go/go.mod index 73dc9f94f963a3..a98852a4fba5f5 100644 --- a/components/gitpod-db-go/go.mod +++ b/components/gitpod-db-go/go.mod @@ -3,7 +3,9 @@ module github.com/gitpod-io/gitpod/gitpod-db go 1.17 require ( + github.com/go-sql-driver/mysql v1.6.0 github.com/google/uuid v1.3.0 + github.com/relvacode/iso8601 v1.1.0 github.com/stretchr/testify v1.7.1 gorm.io/driver/mysql v1.3.2 gorm.io/gorm v1.23.3 @@ -11,7 +13,6 @@ require ( require ( github.com/davecgh/go-spew v1.1.0 // indirect - github.com/go-sql-driver/mysql v1.6.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect diff --git a/components/gitpod-db-go/go.sum b/components/gitpod-db-go/go.sum index 56420c92043195..5aad99254f4c28 100644 --- a/components/gitpod-db-go/go.sum +++ b/components/gitpod-db-go/go.sum @@ -10,6 +10,8 @@ github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/relvacode/iso8601 v1.1.0 h1:2nV8sp0eOjpoKQ2vD3xSDygsjAx37NHG2UlZiCkDH4I= +github.com/relvacode/iso8601 v1.1.0/go.mod h1:FlNp+jz+TXpyRqgmM7tnzHHzBnz776kmAH2h3sZCn0I= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= diff --git a/components/gitpod-db-go/team.go b/components/gitpod-db-go/team.go index 54cfc2fa05dbb4..c732e1fb142b44 100644 --- a/components/gitpod-db-go/team.go +++ b/components/gitpod-db-go/team.go @@ -9,8 +9,8 @@ type Team struct { ID uuid.UUID `gorm:"primaryKey"` Name string Slug string - CreationTime StringlyTime `gorm:"column:creationTime"` - MarkedDeleted bool `gorm:"column:markedDeleted"` + CreationTime VarCharTime `gorm:"column:creationTime"` + MarkedDeleted bool `gorm:"column:markedDeleted"` } // TableName overrides default GORM handling of table name generation diff --git a/components/gitpod-db-go/team_test.go b/components/gitpod-db-go/team_test.go index 4e30abbb24c793..105ce606b4cad7 100644 --- a/components/gitpod-db-go/team_test.go +++ b/components/gitpod-db-go/team_test.go @@ -1,59 +1,75 @@ package db import ( + "encoding/base64" "github.com/google/uuid" "github.com/stretchr/testify/require" - "os" + "os/exec" "testing" "time" ) func TestTeam(t *testing.T) { - pass := os.Getenv("MYSQL_DB_PASS") - require.NotEmpty(t, pass) + pass := getPreviewEnvDBPass(t) db, err := Connect(ConnectionParams{ User: "gitpod", Password: pass, - Host: "tcp(127.0.0.1:3306)", + Host: "127.0.0.1:3306", Database: "gitpod", }) require.NoError(t, err) - - team := Team{} - tx := db.First(&team) - require.NoError(t, tx.Error) + // + //team := Team{} + //tx := db.Debug().First(&team) + //require.NoError(t, tx.Error) teamToCreate := Team{ ID: uuid.New(), Name: "foo-bar", Slug: "foobar", - CreationTime: NewStringlyTime(time.Now()), + CreationTime: NewVarCharTime(time.Now()), MarkedDeleted: false, } - tx = db.Create(&teamToCreate) + tx := db.Debug().Create(&teamToCreate) require.NoError(t, tx.Error) + + retrieved := Team{} + tx = db.Debug().First(&retrieved, teamToCreate.ID) + require.NoError(t, tx.Error) + + require.Equal(t, teamToCreate.CreationTime, retrieved.CreationTime) } -func TestTeam_Create(t *testing.T) { - pass := os.Getenv("MYSQL_DB_PASS") - require.NotEmpty(t, pass) +//func TestTeam_Create(t *testing.T) { +// pass := getPreviewEnvDBPass(t) +// +// db, err := Connect(ConnectionParams{ +// User: "gitpod", +// Password: pass, +// Host: "tcp(127.0.0.1:3306)", +// Database: "gitpod", +// }) +// require.NoError(t, err) +// +// //team := Team{ +// // ID: uuid.New(), +// // Name: "foo-bar", +// // Slug: "foobar", +// // CreationTime: NewStringlyTime(time.Now()), +// // MarkedDeleted: false, +// //} +// //tx := db.Create(&team) +// //require.NoError(t, tx.Error) +//} - db, err := Connect(ConnectionParams{ - User: "gitpod", - Password: pass, - Host: "tcp(127.0.0.1:3306)", - Database: "gitpod", - }) +func getPreviewEnvDBPass(t *testing.T) string { + cmd := `kubectl get secret mysql -o json | jq -r '.data["password"]'` + out, err := exec.Command("/bin/bash", "-c", cmd).Output() + require.NoError(t, err, "must retrieve db password") + + decoded, err := base64.StdEncoding.DecodeString(string(out)) require.NoError(t, err) - team := Team{ - ID: uuid.New(), - Name: "foo-bar", - Slug: "foobar", - CreationTime: NewStringlyTime(time.Now()), - MarkedDeleted: false, - } - tx := db.Create(&team) - require.NoError(t, tx.Error) + return string(decoded) } diff --git a/components/gitpod-db-go/types.go b/components/gitpod-db-go/types.go index 5e8c78e394d89e..21052d17b27059 100644 --- a/components/gitpod-db-go/types.go +++ b/components/gitpod-db-go/types.go @@ -3,40 +3,56 @@ package db import ( "database/sql/driver" "fmt" + "github.com/relvacode/iso8601" + "strings" "time" ) -func NewStringlyTime(t time.Time) StringlyTime { - return StringlyTime(t) +var ( + // convert iso-8601 into rfc-3339 format + rfc3339t = strings.Replace("2015-12-23 00:00:00", " ", "T", 1) + "Z" +) + +//func ParseISO8601(s string) (time.Time, error) { +// +// t, err := time.Parse(time.RFC3339, converted) +// if err != nil { +// return time.Time{}, fmt.Errorf("failed to parse %s into ISO8601 timestamp: %w", s, err) +// } +// +// return t, nil +//} + +func NewVarCharTime(t time.Time) VarCharTime { + return VarCharTime(t.UTC()) } -// StringlyTime exists for cases where records are inserted into the DB as VARCHAR but actually contain a timestamp which is time.RFC3339 -type StringlyTime time.Time +// VarCharTime exists for cases where records are inserted into the DB as VARCHAR but actually contain a timestamp which is time.RFC3339 +type VarCharTime time.Time // Scan implements the Scanner interface. -func (n StringlyTime) Scan(value interface{}) error { +func (n *VarCharTime) Scan(value interface{}) error { if value == nil { return fmt.Errorf("nil value") } switch s := value.(type) { case []uint8: - parsed, err := time.Parse(time.RFC3339, string(s)) + parsed, err := iso8601.ParseString(string(s)) if err != nil { - return fmt.Errorf("failed to parse %v: %w", value, err) + return fmt.Errorf("failed to parse %v into ISO8601: %w", string(s), err) } - n = StringlyTime(parsed) + *n = VarCharTime(parsed.UTC()) } return nil } // Value implements the driver Valuer interface. -func (n StringlyTime) Value() (driver.Value, error) { - - return time.Time(n).UTC(), nil +func (n VarCharTime) Value() (driver.Value, error) { + return time.Time(n).UTC().Format(time.RFC3339Nano), nil } -//func (n *StringlyTime) String() string { +//func (n *VarCharTime) String() string { // return n.Time.Format(time.RFC3339) //} From 23d0be919b0826ea682b16af0f91d10dd77b5d14 Mon Sep 17 00:00:00 2001 From: Milan Pavlik Date: Sun, 10 Apr 2022 20:34:06 +0000 Subject: [PATCH 09/10] add projects and teams --- components/gitpod-db-go/conn.go | 3 + components/gitpod-db-go/go.mod | 5 +- components/gitpod-db-go/go.sum | 209 ++++++++++++++++++++- components/gitpod-db-go/pagination.go | 8 - components/gitpod-db-go/project.go | 40 ++-- components/gitpod-db-go/project_test.go | 21 +++ components/gitpod-db-go/team-membership.go | 24 --- components/gitpod-db-go/team.go | 15 +- components/gitpod-db-go/team_test.go | 62 +++--- components/gitpod-db-go/types.go | 39 ++-- 10 files changed, 296 insertions(+), 130 deletions(-) delete mode 100644 components/gitpod-db-go/pagination.go create mode 100644 components/gitpod-db-go/project_test.go delete mode 100644 components/gitpod-db-go/team-membership.go diff --git a/components/gitpod-db-go/conn.go b/components/gitpod-db-go/conn.go index 940ce3066f7a6d..cd12d6d743b84f 100644 --- a/components/gitpod-db-go/conn.go +++ b/components/gitpod-db-go/conn.go @@ -1,6 +1,7 @@ package db import ( + "fmt" driver_mysql "github.com/go-sql-driver/mysql" "gorm.io/driver/mysql" "gorm.io/gorm" @@ -24,9 +25,11 @@ func Connect(p ConnectionParams) (*gorm.DB, error) { DBName: p.Database, Loc: loc, AllowNativePasswords: true, + ParseTime: true, } dsn := cfg.FormatDSN() + fmt.Println(dsn) // refer https://github.com/go-sql-driver/mysql#dsn-data-source-name for details //dsn := fmt.Sprintf("%s:%s@%s/%s?charset=utf8mb4&parseTime=True&loc=Local", p.User, p.Password, p.Host, p.Database) diff --git a/components/gitpod-db-go/go.mod b/components/gitpod-db-go/go.mod index a98852a4fba5f5..2ba1c30910d145 100644 --- a/components/gitpod-db-go/go.mod +++ b/components/gitpod-db-go/go.mod @@ -7,14 +7,15 @@ require ( github.com/google/uuid v1.3.0 github.com/relvacode/iso8601 v1.1.0 github.com/stretchr/testify v1.7.1 + gorm.io/datatypes v1.0.6 gorm.io/driver/mysql v1.3.2 gorm.io/gorm v1.23.3 ) require ( - github.com/davecgh/go-spew v1.1.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/components/gitpod-db-go/go.sum b/components/gitpod-db-go/go.sum index 5aad99254f4c28..ef48ba3da3b1cb 100644 --- a/components/gitpod-db-go/go.sum +++ b/components/gitpod-db-go/go.sum @@ -1,26 +1,229 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.12.0 h1:VtrkII767ttSPNRfFekePK3sctr+joXgO58stqQbtUA= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188 h1:+eHOFJl1BaXrQxKX+T06f78590z4qA2ZzBTqahsKSE4= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.10.1/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.11.0 h1:HiHArx4yFbwl91X3qqIHtUFoiIfLNJXCQRsnzkiwwaQ= +github.com/jackc/pgconn v1.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.2.0 h1:r7JypeP2D3onoQTCxWdTpCtJ4D+qpKr0TxvoyMhZ5ns= +github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.9.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.10.0 h1:ILnBWrRMSXGczYvmkYD6PsYyVFUNLTnIUJHHDLmqk38= +github.com/jackc/pgtype v1.10.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.14.1/go.mod h1:RgDuE4Z34o7XE92RpLsvFiOEfrAUT0Xt2KxvX73W06M= +github.com/jackc/pgx/v4 v4.15.0 h1:B7dTkXsdILD3MF987WGGCcg+tvLW6bZJdEcqVFeU//w= +github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.2.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= +github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/relvacode/iso8601 v1.1.0 h1:2nV8sp0eOjpoKQ2vD3xSDygsjAx37NHG2UlZiCkDH4I= github.com/relvacode/iso8601 v1.1.0/go.mod h1:FlNp+jz+TXpyRqgmM7tnzHHzBnz776kmAH2h3sZCn0I= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/datatypes v1.0.6 h1:3cqbakp1DIgC+P7wyODb5k+lSjW8g3mjkg/BIsmhjlE= +gorm.io/datatypes v1.0.6/go.mod h1:Gh/Xd/iUWWybMEk8CzYCK/swqlni2r+ROeM1HGIM0ck= gorm.io/driver/mysql v1.3.2 h1:QJryWiqQ91EvZ0jZL48NOpdlPdMjdip1hQ8bTgo4H7I= gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= +gorm.io/driver/postgres v1.3.1 h1:Pyv+gg1Gq1IgsLYytj/S2k7ebII3CzEdpqQkPOdH24g= +gorm.io/driver/postgres v1.3.1/go.mod h1:WwvWOuR9unCLpGWCL6Y3JOeBWvbKi6JLhayiVclSZZU= +gorm.io/driver/sqlite v1.3.1 h1:bwfE+zTEWklBYoEodIOIBwuWHpnx52Z9zJFW5F33WLk= +gorm.io/driver/sqlite v1.3.1/go.mod h1:wJx0hJspfycZ6myN38x1O/AqLtNS6c5o9TndewFbELg= +gorm.io/driver/sqlserver v1.3.1 h1:F5t6ScMzOgy1zukRTIZgLZwKahgt3q1woAILVolKpOI= +gorm.io/driver/sqlserver v1.3.1/go.mod h1:w25Vrx2BG+CJNUu/xKbFhaKlGxT/nzRkhWCCoptX8tQ= gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.23.2/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.23.3 h1:jYh3nm7uLZkrMVfA8WVNjDZryKfr7W+HTlInVgKFJAg= gorm.io/gorm v1.23.3/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/components/gitpod-db-go/pagination.go b/components/gitpod-db-go/pagination.go deleted file mode 100644 index baae7d27276bbb..00000000000000 --- a/components/gitpod-db-go/pagination.go +++ /dev/null @@ -1,8 +0,0 @@ -package db - -type Pagination struct { - // Limit restricts the number of results returned - Limit int - // Offset specifies the offset for DB query - Offset int -} diff --git a/components/gitpod-db-go/project.go b/components/gitpod-db-go/project.go index 831652e658eee4..2f6ad97c7a9839 100644 --- a/components/gitpod-db-go/project.go +++ b/components/gitpod-db-go/project.go @@ -1,24 +1,30 @@ package db -type Project struct { - ID string - Name string - Slug string - CloneURL string - - TeamID string - UserID string - AppInstallationID string +import ( + "database/sql" + "github.com/google/uuid" + "gorm.io/datatypes" + "time" +) - Config *ProjectConfig - Settings *ProjectSettings - CreationTime string - Deleted bool - MarkedDeleted bool -} +type Project struct { + ID uuid.UUID `gorm:"primary_key;column:id;type:char;size:36;"` + Name string `gorm:"column:name;type:varchar;size:255;"` + CloneURL string `gorm:"column:cloneUrl;type:varchar;size:255;"` + TeamID sql.NullString `gorm:"column:teamId;type:char;size:36;"` + AppInstallationID string `gorm:"column:appInstallationId;type:varchar;size:255;"` + CreationTime VarcharTime `gorm:"column:creationTime;type:varchar;size:255;"` + Deleted int32 `gorm:"column:deleted;type:tinyint;default:0;"` + LastModified time.Time `gorm:"column:_lastModified;type:timestamp;default:CURRENT_TIMESTAMP(6);"` + Config *datatypes.JSON `gorm:"column:config;type:text;size:65535;"` + UserID sql.NullString `gorm:"column:userId;type:char;size:36;"` + Slug sql.NullString `gorm:"column:slug;type:varchar;size:255;"` + Settings *datatypes.JSON `gorm:"column:settings;type:text;size:65535;"` -type ProjectConfig struct { + _ int32 `gorm:"column:markedDeleted;type:tinyint;default:0;"` } -type ProjectSettings struct { +// TableName sets the insert table name for this struct type +func (d *Project) TableName() string { + return "d_b_project" } diff --git a/components/gitpod-db-go/project_test.go b/components/gitpod-db-go/project_test.go new file mode 100644 index 00000000000000..84df201cc8d7f9 --- /dev/null +++ b/components/gitpod-db-go/project_test.go @@ -0,0 +1,21 @@ +package db + +import ( + "fmt" + "github.com/stretchr/testify/require" + "testing" +) + +func TestListAllProject(t *testing.T) { + db := getPreviewDB(t) + + rows, err := db.Model(&Project{}).Rows() + require.NoError(t, err) + + for rows.Next() { + var project Project + require.NoError(t, db.ScanRows(rows, &project)) + + fmt.Println(project) + } +} diff --git a/components/gitpod-db-go/team-membership.go b/components/gitpod-db-go/team-membership.go deleted file mode 100644 index ad56eba00e9901..00000000000000 --- a/components/gitpod-db-go/team-membership.go +++ /dev/null @@ -1,24 +0,0 @@ -package db - -import "context" - -type TeamMemberRole string - -const ( - TeamMemberRole_Owner = "owner" - TeamMemberRole_Member = "member" -) - -type TeamMembership struct { - ID string - TeamID string - UserID string - Role TeamMemberRole - - CreationTime string - Deleted bool -} - -type TeamMembershipRepository interface { - ListByTeam(ctx context.Context, teamID string) ([]*TeamMembership, error) -} diff --git a/components/gitpod-db-go/team.go b/components/gitpod-db-go/team.go index c732e1fb142b44..06d793b350a8fa 100644 --- a/components/gitpod-db-go/team.go +++ b/components/gitpod-db-go/team.go @@ -3,14 +3,17 @@ package db import ( "context" "github.com/google/uuid" + "time" ) type Team struct { - ID uuid.UUID `gorm:"primaryKey"` - Name string - Slug string - CreationTime VarCharTime `gorm:"column:creationTime"` - MarkedDeleted bool `gorm:"column:markedDeleted"` + ID uuid.UUID `gorm:"primary_key;column:id;type:char;size:36;"` + Name string `gorm:"column:name;type:varchar;size:255;"` + Slug string `gorm:"column:slug;type:varchar;size:255;"` + CreationTime VarcharTime `gorm:"column:creationTime;type:varchar;size:255;"` + Deleted int32 `gorm:"column:deleted;type:tinyint;default:0;"` + LastModified time.Time `gorm:"column:_lastModified;type:timestamp;default:CURRENT_TIMESTAMP(6);"` + _ int32 `gorm:"column:markedDeleted;type:tinyint;default:0;"` } // TableName overrides default GORM handling of table name generation @@ -19,8 +22,6 @@ func (t *Team) TableName() string { } type ListOpts struct { - Pagination - OrderBy string SearchTerm string } diff --git a/components/gitpod-db-go/team_test.go b/components/gitpod-db-go/team_test.go index 105ce606b4cad7..5cce6527597bab 100644 --- a/components/gitpod-db-go/team_test.go +++ b/components/gitpod-db-go/team_test.go @@ -4,32 +4,20 @@ import ( "encoding/base64" "github.com/google/uuid" "github.com/stretchr/testify/require" + "gorm.io/gorm" "os/exec" "testing" "time" ) -func TestTeam(t *testing.T) { - pass := getPreviewEnvDBPass(t) - - db, err := Connect(ConnectionParams{ - User: "gitpod", - Password: pass, - Host: "127.0.0.1:3306", - Database: "gitpod", - }) - require.NoError(t, err) - // - //team := Team{} - //tx := db.Debug().First(&team) - //require.NoError(t, tx.Error) +func TestCreateAndRead(t *testing.T) { + db := getPreviewDB(t) teamToCreate := Team{ - ID: uuid.New(), - Name: "foo-bar", - Slug: "foobar", - CreationTime: NewVarCharTime(time.Now()), - MarkedDeleted: false, + ID: uuid.New(), + Name: "foo-bar", + Slug: "foobar", + CreationTime: NewVarcharTime(time.Now()), } tx := db.Debug().Create(&teamToCreate) require.NoError(t, tx.Error) @@ -41,28 +29,6 @@ func TestTeam(t *testing.T) { require.Equal(t, teamToCreate.CreationTime, retrieved.CreationTime) } -//func TestTeam_Create(t *testing.T) { -// pass := getPreviewEnvDBPass(t) -// -// db, err := Connect(ConnectionParams{ -// User: "gitpod", -// Password: pass, -// Host: "tcp(127.0.0.1:3306)", -// Database: "gitpod", -// }) -// require.NoError(t, err) -// -// //team := Team{ -// // ID: uuid.New(), -// // Name: "foo-bar", -// // Slug: "foobar", -// // CreationTime: NewStringlyTime(time.Now()), -// // MarkedDeleted: false, -// //} -// //tx := db.Create(&team) -// //require.NoError(t, tx.Error) -//} - func getPreviewEnvDBPass(t *testing.T) string { cmd := `kubectl get secret mysql -o json | jq -r '.data["password"]'` out, err := exec.Command("/bin/bash", "-c", cmd).Output() @@ -73,3 +39,17 @@ func getPreviewEnvDBPass(t *testing.T) string { return string(decoded) } + +func getPreviewDB(t *testing.T) *gorm.DB { + pass := getPreviewEnvDBPass(t) + + db, err := Connect(ConnectionParams{ + User: "gitpod", + Password: pass, + Host: "127.0.0.1:3306", + Database: "gitpod", + }) + require.NoError(t, err) + + return db +} diff --git a/components/gitpod-db-go/types.go b/components/gitpod-db-go/types.go index 21052d17b27059..1bf0f12242f56f 100644 --- a/components/gitpod-db-go/types.go +++ b/components/gitpod-db-go/types.go @@ -4,34 +4,18 @@ import ( "database/sql/driver" "fmt" "github.com/relvacode/iso8601" - "strings" "time" ) -var ( - // convert iso-8601 into rfc-3339 format - rfc3339t = strings.Replace("2015-12-23 00:00:00", " ", "T", 1) + "Z" -) - -//func ParseISO8601(s string) (time.Time, error) { -// -// t, err := time.Parse(time.RFC3339, converted) -// if err != nil { -// return time.Time{}, fmt.Errorf("failed to parse %s into ISO8601 timestamp: %w", s, err) -// } -// -// return t, nil -//} - -func NewVarCharTime(t time.Time) VarCharTime { - return VarCharTime(t.UTC()) +func NewVarcharTime(t time.Time) VarcharTime { + return VarcharTime(t.UTC()) } -// VarCharTime exists for cases where records are inserted into the DB as VARCHAR but actually contain a timestamp which is time.RFC3339 -type VarCharTime time.Time +// VarcharTime exists for cases where records are inserted into the DB as VARCHAR but actually contain a timestamp which is time.RFC3339 +type VarcharTime time.Time // Scan implements the Scanner interface. -func (n *VarCharTime) Scan(value interface{}) error { +func (n *VarcharTime) Scan(value interface{}) error { if value == nil { return fmt.Errorf("nil value") } @@ -42,17 +26,16 @@ func (n *VarCharTime) Scan(value interface{}) error { if err != nil { return fmt.Errorf("failed to parse %v into ISO8601: %w", string(s), err) } - *n = VarCharTime(parsed.UTC()) + *n = VarcharTime(parsed.UTC()) } - - return nil + return fmt.Errorf("unknown scan value for VarcharTime with value: %v", value) } // Value implements the driver Valuer interface. -func (n VarCharTime) Value() (driver.Value, error) { +func (n VarcharTime) Value() (driver.Value, error) { return time.Time(n).UTC().Format(time.RFC3339Nano), nil } -//func (n *VarCharTime) String() string { -// return n.Time.Format(time.RFC3339) -//} +func (n VarcharTime) String() string { + return time.Time(n).Format(time.RFC3339Nano) +} From 990027ed35b3700f6880039ae0582722600a8b48 Mon Sep 17 00:00:00 2001 From: Milan Pavlik Date: Mon, 11 Apr 2022 05:31:37 +0000 Subject: [PATCH 10/10] add prebuild model --- components/gitpod-db-go/prebuild.go | 28 ++++++++++++++++++++++++ components/gitpod-db-go/prebuild_test.go | 24 ++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 components/gitpod-db-go/prebuild.go create mode 100644 components/gitpod-db-go/prebuild_test.go diff --git a/components/gitpod-db-go/prebuild.go b/components/gitpod-db-go/prebuild.go new file mode 100644 index 00000000000000..acdb59cbe01e62 --- /dev/null +++ b/components/gitpod-db-go/prebuild.go @@ -0,0 +1,28 @@ +package db + +import ( + "database/sql" + "github.com/google/uuid" + "time" +) + +type Prebuild struct { + ID uuid.UUID `gorm:"primary_key;column:id;type:char;size:36;" json:"id"` + CloneURL string `gorm:"column:cloneURL;type:varchar;size:255;" json:"clone_url"` + Commit string `gorm:"column:commit;type:varchar;size:255;" json:"commit"` + State string `gorm:"column:state;type:varchar;size:255;" json:"state"` + BuildWorkspaceID string `gorm:"column:buildWorkspaceId;type:char;size:36;" json:"build_workspace_id"` + Snapshot string `gorm:"column:snapshot;type:varchar;size:255;" json:"snapshot"` + Error string `gorm:"column:error;type:varchar;size:255;" json:"error"` + ProjectID sql.NullString `gorm:"column:projectId;type:char;size:36;" json:"project_id"` + Branch sql.NullString `gorm:"column:branch;type:varchar;size:255;" json:"branch"` + StatusVersion int64 `gorm:"column:statusVersion;type:bigint;default:0;" json:"status_version"` + + CreationTime time.Time `gorm:"column:creationTime;type:timestamp;default:CURRENT_TIMESTAMP(6);->;" json:"creation_time"` + LastModified time.Time `gorm:"column:_lastModified;type:timestamp;default:CURRENT_TIMESTAMP(6);->;" json:"_last_modified"` +} + +// TableName sets the insert table name for this struct type +func (d *Prebuild) TableName() string { + return "d_b_prebuilt_workspace" +} diff --git a/components/gitpod-db-go/prebuild_test.go b/components/gitpod-db-go/prebuild_test.go new file mode 100644 index 00000000000000..333953599eb0de --- /dev/null +++ b/components/gitpod-db-go/prebuild_test.go @@ -0,0 +1,24 @@ +package db + +import ( + "fmt" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "testing" +) + +func TestPrebuildRead(t *testing.T) { + db := getPreviewDB(t) + + prebuild := Prebuild{} + tx := db.First(&prebuild, uuid.MustParse("27836aaa-acb7-45a8-82d0-924c18d8aa26")) + require.NoError(t, tx.Error) + + // +--------------------------------------+--------------------------------------------------------+------------------------------------------+-----------+----------------------------+--------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+-------+----------------------------+--------------------------------------+--------+-----------------+ + //| id | cloneURL | commit | state | creationTime | buildWorkspaceId | snapshot | error | _lastModified | projectId | branch | statusVersion | + //+--------------------------------------+--------------------------------------------------------+------------------------------------------+-----------+----------------------------+--------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+-------+----------------------------+--------------------------------------+--------+-----------------+ + //| 27836aaa-acb7-45a8-82d0-924c18d8aa26 | https://gitlab.com/gitpod-milan/gitpod-large-image.git | d741ef690a211f5a4157f3edc685c984b3b4b1d1 | available | 2022-04-10 14:30:55.170277 | gitpodmilan-gitpodlargei-zmghwy9q41t | workspaces/gitpodmilan-gitpodlargei-zmghwy9q41t/snapshot-1649601374866319750.tar@gitpod-user-1a8ce801-b849-43e2-8c1c-d19473976e55 | | 2022-04-10 14:36:14.926379 | 5b9599ea-235c-4659-80ff-44cc944d7fad | main | 108108275646469 | + //+--------------------------------------+--------------------------------------------------------+------------------------------------------+-----------+----------------------------+--------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+-------+----------------------------+--------------------------------------+--------+-----------------+ + + fmt.Print(prebuild) +}