Skip to content

Commit 4590a60

Browse files
committed
[usage] store and fetch usage entries
1 parent 128195f commit 4590a60

File tree

3 files changed

+115
-3
lines changed

3 files changed

+115
-3
lines changed

components/usage/pkg/db/dbtest/usage.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package dbtest
66

77
import (
8+
"context"
89
"testing"
910

1011
"github.com/gitpod-io/gitpod/usage/pkg/db"
@@ -67,8 +68,7 @@ func CreateUsageRecords(t *testing.T, conn *gorm.DB, entries ...db.Usage) []db.U
6768
ids = append(ids, record.ID.String())
6869
}
6970

70-
require.NoError(t, conn.CreateInBatches(&records, 1000).Error)
71-
71+
require.NoError(t, db.InsertUsage(context.Background(), conn, entries...))
7272
t.Cleanup(func() {
7373
require.NoError(t, conn.Where(ids).Delete(&db.Usage{}).Error)
7474
})

components/usage/pkg/db/usage.go

+23-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/google/uuid"
1212
"gorm.io/datatypes"
1313
"gorm.io/gorm"
14+
"gorm.io/gorm/clause"
1415
)
1516

1617
type Usage struct {
@@ -34,12 +35,33 @@ func (u *Usage) TableName() string {
3435
return "d_b_usage"
3536
}
3637

38+
func InsertUsage(ctx context.Context, conn *gorm.DB, records ...Usage) error {
39+
return conn.WithContext(ctx).Debug().
40+
Clauses(clause.OnConflict{DoNothing: true}).
41+
CreateInBatches(records, 1000).Error
42+
}
43+
44+
func UpdateUsage(ctx context.Context, conn *gorm.DB, record Usage) error {
45+
return conn.WithContext(ctx).Save(record).Error
46+
}
47+
48+
func FindAllDraftUsage(ctx context.Context, conn *gorm.DB) ([]Usage, error) {
49+
var usageRecords []Usage
50+
result := conn.WithContext(ctx).
51+
Where("draft = TRUE").
52+
Order("effectiveTime DESC").
53+
Find(&usageRecords)
54+
if result.Error != nil {
55+
return nil, fmt.Errorf("failed to get usage records: %s", result.Error)
56+
}
57+
return usageRecords, nil
58+
}
59+
3760
func FindUsage(ctx context.Context, conn *gorm.DB, attributionId AttributionID, from, to VarcharTime, offset int64, limit int64) ([]Usage, error) {
3861
db := conn.WithContext(ctx)
3962

4063
var usageRecords []Usage
4164
result := db.
42-
WithContext(ctx).
4365
Where("attributionId = ?", attributionId).
4466
Where("? <= effectiveTime AND effectiveTime < ?", from.String(), to.String()).
4567
Order("effectiveTime DESC").

components/usage/pkg/db/usage_test.go

+90
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,93 @@ func TestFindUsageInRange(t *testing.T) {
4747
require.Equal(t, 1, len(listResult))
4848
require.Equal(t, []db.Usage{entryInside}, listResult)
4949
}
50+
51+
func TestInsertUsageRecords(t *testing.T) {
52+
conn := dbtest.ConnectForTests(t)
53+
54+
attributionID := db.NewTeamAttributionID(uuid.New().String())
55+
start := time.Date(2022, 7, 1, 0, 0, 0, 0, time.UTC)
56+
57+
usage := dbtest.NewUsage(t, db.Usage{
58+
AttributionID: attributionID,
59+
EffectiveTime: db.NewVarcharTime(start.Add(2 * time.Hour)),
60+
Draft: true,
61+
})
62+
63+
dbtest.CreateUsageRecords(t, conn, usage)
64+
updatedDesc := "Updated Description"
65+
usage.Description = updatedDesc
66+
67+
require.NoError(t, db.InsertUsage(context.Background(), conn, usage))
68+
69+
drafts, err := db.FindAllDraftUsage(context.Background(), conn)
70+
require.NoError(t, err)
71+
require.Equal(t, 1, len(drafts))
72+
require.NotEqual(t, updatedDesc, drafts[0].Description)
73+
}
74+
75+
func TestUpdateUsageRecords(t *testing.T) {
76+
conn := dbtest.ConnectForTests(t)
77+
78+
attributionID := db.NewTeamAttributionID(uuid.New().String())
79+
start := time.Date(2022, 7, 1, 0, 0, 0, 0, time.UTC)
80+
81+
usage := dbtest.NewUsage(t, db.Usage{
82+
AttributionID: attributionID,
83+
EffectiveTime: db.NewVarcharTime(start.Add(2 * time.Hour)),
84+
Draft: true,
85+
})
86+
87+
dbtest.CreateUsageRecords(t, conn, usage)
88+
updatedDesc := "Updated Description"
89+
usage.Description = updatedDesc
90+
91+
require.NoError(t, db.UpdateUsage(context.Background(), conn, usage))
92+
93+
drafts, err := db.FindAllDraftUsage(context.Background(), conn)
94+
require.NoError(t, err)
95+
require.Equal(t, 1, len(drafts))
96+
require.Equal(t, updatedDesc, drafts[0].Description)
97+
}
98+
99+
func TestFindAllDraftUsage(t *testing.T) {
100+
conn := dbtest.ConnectForTests(t)
101+
102+
attributionID := db.NewTeamAttributionID(uuid.New().String())
103+
start := time.Date(2022, 7, 1, 0, 0, 0, 0, time.UTC)
104+
105+
usage1 := dbtest.NewUsage(t, db.Usage{
106+
AttributionID: attributionID,
107+
EffectiveTime: db.NewVarcharTime(start.Add(2 * time.Hour)),
108+
Draft: true,
109+
})
110+
usage2 := dbtest.NewUsage(t, db.Usage{
111+
AttributionID: attributionID,
112+
EffectiveTime: db.NewVarcharTime(start.Add(2 * time.Hour)),
113+
Draft: true,
114+
})
115+
usage3 := dbtest.NewUsage(t, db.Usage{
116+
AttributionID: attributionID,
117+
EffectiveTime: db.NewVarcharTime(start.Add(2 * time.Hour)),
118+
Draft: false,
119+
})
120+
121+
dbtest.CreateUsageRecords(t, conn, usage1, usage2, usage3)
122+
drafts, err := db.FindAllDraftUsage(context.Background(), conn)
123+
require.NoError(t, err)
124+
require.Equal(t, 2, len(drafts))
125+
for _, usage := range drafts {
126+
require.True(t, usage.Draft)
127+
}
128+
129+
// let's finalize one record
130+
usage2.Draft = false
131+
require.NoError(t, db.UpdateUsage(context.Background(), conn, usage2))
132+
133+
drafts, err = db.FindAllDraftUsage(context.Background(), conn)
134+
require.NoError(t, err)
135+
require.Equal(t, 1, len(drafts))
136+
for _, usage := range drafts {
137+
require.True(t, usage.Draft)
138+
}
139+
}

0 commit comments

Comments
 (0)