Skip to content

Commit 031d71e

Browse files
committed
WIP
1 parent 65db7a7 commit 031d71e

File tree

8 files changed

+233
-227
lines changed

8 files changed

+233
-227
lines changed

coderd/database/dbauthz/dbauthz.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,25 @@ func authorizedTemplateVersionFromJob(ctx context.Context, q *querier, job datab
645645
}
646646
}
647647

648+
func (q *querier) GetTemplateInsightsByInterval(ctx context.Context, arg database.GetTemplateInsightsByIntervalParams) ([]database.GetTemplateInsightsByIntervalRow, error) {
649+
for _, templateID := range arg.TemplateIDs {
650+
template, err := q.db.GetTemplateByID(ctx, templateID)
651+
if err != nil {
652+
return nil, err
653+
}
654+
655+
if err := q.authorizeContext(ctx, rbac.ActionUpdate, template); err != nil {
656+
return nil, err
657+
}
658+
}
659+
if len(arg.TemplateIDs) == 0 {
660+
if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceTemplate.All()); err != nil {
661+
return nil, err
662+
}
663+
}
664+
return q.db.GetTemplateInsightsByInterval(ctx, arg)
665+
}
666+
648667
func (q *querier) AcquireLock(ctx context.Context, id int64) error {
649668
return q.db.AcquireLock(ctx, id)
650669
}
@@ -1247,25 +1266,6 @@ func (q *querier) GetTemplateDAUs(ctx context.Context, arg database.GetTemplateD
12471266
return q.db.GetTemplateDAUs(ctx, arg)
12481267
}
12491268

1250-
func (q *querier) GetTemplateDailyInsights(ctx context.Context, arg database.GetTemplateDailyInsightsParams) ([]database.GetTemplateDailyInsightsRow, error) {
1251-
for _, templateID := range arg.TemplateIDs {
1252-
template, err := q.db.GetTemplateByID(ctx, templateID)
1253-
if err != nil {
1254-
return nil, err
1255-
}
1256-
1257-
if err := q.authorizeContext(ctx, rbac.ActionUpdate, template); err != nil {
1258-
return nil, err
1259-
}
1260-
}
1261-
if len(arg.TemplateIDs) == 0 {
1262-
if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceTemplate.All()); err != nil {
1263-
return nil, err
1264-
}
1265-
}
1266-
return q.db.GetTemplateDailyInsights(ctx, arg)
1267-
}
1268-
12691269
func (q *querier) GetTemplateInsights(ctx context.Context, arg database.GetTemplateInsightsParams) (database.GetTemplateInsightsRow, error) {
12701270
for _, templateID := range arg.TemplateIDs {
12711271
template, err := q.db.GetTemplateByID(ctx, templateID)

coderd/database/dbfake/dbfake.go

Lines changed: 86 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,92 @@ func minTime(t, u time.Time) time.Time {
692692
return u
693693
}
694694

695+
func (q *FakeQuerier) GetTemplateInsightsByInterval(ctx context.Context, arg database.GetTemplateInsightsByIntervalParams) ([]database.GetTemplateInsightsByIntervalRow, error) {
696+
err := validateDatabaseType(arg)
697+
if err != nil {
698+
return nil, err
699+
}
700+
701+
q.mutex.RLock()
702+
defer q.mutex.RUnlock()
703+
704+
type dailyStat struct {
705+
startTime, endTime time.Time
706+
userSet map[uuid.UUID]struct{}
707+
templateIDSet map[uuid.UUID]struct{}
708+
}
709+
dailyStats := []dailyStat{{arg.StartTime, arg.StartTime.AddDate(0, 0, 1), make(map[uuid.UUID]struct{}), make(map[uuid.UUID]struct{})}}
710+
for dailyStats[len(dailyStats)-1].endTime.Before(arg.EndTime) {
711+
dailyStats = append(dailyStats, dailyStat{dailyStats[len(dailyStats)-1].endTime, dailyStats[len(dailyStats)-1].endTime.AddDate(0, 0, 1), make(map[uuid.UUID]struct{}), make(map[uuid.UUID]struct{})})
712+
}
713+
if dailyStats[len(dailyStats)-1].endTime.After(arg.EndTime) {
714+
dailyStats[len(dailyStats)-1].endTime = arg.EndTime
715+
}
716+
717+
for _, s := range q.workspaceAgentStats {
718+
if s.CreatedAt.Before(arg.StartTime) || s.CreatedAt.Equal(arg.EndTime) || s.CreatedAt.After(arg.EndTime) {
719+
continue
720+
}
721+
if len(arg.TemplateIDs) > 0 && !slices.Contains(arg.TemplateIDs, s.TemplateID) {
722+
continue
723+
}
724+
if s.ConnectionCount == 0 {
725+
continue
726+
}
727+
728+
for _, ds := range dailyStats {
729+
if s.CreatedAt.Before(ds.startTime) || s.CreatedAt.Equal(ds.endTime) || s.CreatedAt.After(ds.endTime) {
730+
continue
731+
}
732+
ds.userSet[s.UserID] = struct{}{}
733+
ds.templateIDSet[s.TemplateID] = struct{}{}
734+
}
735+
}
736+
737+
for _, s := range q.workspaceAppStats {
738+
w, err := q.getWorkspaceByIDNoLock(ctx, s.WorkspaceID)
739+
if err != nil {
740+
return nil, err
741+
}
742+
743+
if len(arg.TemplateIDs) > 0 && !slices.Contains(arg.TemplateIDs, w.TemplateID) {
744+
continue
745+
}
746+
747+
for _, ds := range dailyStats {
748+
// (was.session_started_at >= ts.from_ AND was.session_started_at < ts.to_)
749+
// OR (was.session_ended_at > ts.from_ AND was.session_ended_at < ts.to_)
750+
// OR (was.session_started_at < ts.from_ AND was.session_ended_at >= ts.to_)
751+
if !(((s.SessionStartedAt.After(ds.startTime) || s.SessionStartedAt.Equal(ds.startTime)) && s.SessionStartedAt.Before(ds.endTime)) ||
752+
(s.SessionEndedAt.After(ds.startTime) && s.SessionEndedAt.Before(ds.endTime)) ||
753+
(s.SessionStartedAt.Before(ds.startTime) && (s.SessionEndedAt.After(ds.endTime) || s.SessionEndedAt.Equal(ds.endTime)))) {
754+
continue
755+
}
756+
757+
ds.userSet[s.UserID] = struct{}{}
758+
ds.templateIDSet[w.TemplateID] = struct{}{}
759+
}
760+
}
761+
762+
var result []database.GetTemplateInsightsByIntervalRow
763+
for _, ds := range dailyStats {
764+
templateIDs := make([]uuid.UUID, 0, len(ds.templateIDSet))
765+
for templateID := range ds.templateIDSet {
766+
templateIDs = append(templateIDs, templateID)
767+
}
768+
slices.SortFunc(templateIDs, func(a, b uuid.UUID) int {
769+
return slice.Ascending(a.String(), b.String())
770+
})
771+
result = append(result, database.GetTemplateInsightsByIntervalRow{
772+
StartTime: ds.startTime,
773+
EndTime: ds.endTime,
774+
TemplateIDs: templateIDs,
775+
ActiveUsers: int64(len(ds.userSet)),
776+
})
777+
}
778+
return result, nil
779+
}
780+
695781
func (*FakeQuerier) AcquireLock(_ context.Context, _ int64) error {
696782
return xerrors.New("AcquireLock must only be called within a transaction")
697783
}
@@ -2340,92 +2426,6 @@ func (q *FakeQuerier) GetTemplateDAUs(_ context.Context, arg database.GetTemplat
23402426
return rs, nil
23412427
}
23422428

2343-
func (q *FakeQuerier) GetTemplateDailyInsights(ctx context.Context, arg database.GetTemplateDailyInsightsParams) ([]database.GetTemplateDailyInsightsRow, error) {
2344-
err := validateDatabaseType(arg)
2345-
if err != nil {
2346-
return nil, err
2347-
}
2348-
2349-
q.mutex.RLock()
2350-
defer q.mutex.RUnlock()
2351-
2352-
type dailyStat struct {
2353-
startTime, endTime time.Time
2354-
userSet map[uuid.UUID]struct{}
2355-
templateIDSet map[uuid.UUID]struct{}
2356-
}
2357-
dailyStats := []dailyStat{{arg.StartTime, arg.StartTime.AddDate(0, 0, 1), make(map[uuid.UUID]struct{}), make(map[uuid.UUID]struct{})}}
2358-
for dailyStats[len(dailyStats)-1].endTime.Before(arg.EndTime) {
2359-
dailyStats = append(dailyStats, dailyStat{dailyStats[len(dailyStats)-1].endTime, dailyStats[len(dailyStats)-1].endTime.AddDate(0, 0, 1), make(map[uuid.UUID]struct{}), make(map[uuid.UUID]struct{})})
2360-
}
2361-
if dailyStats[len(dailyStats)-1].endTime.After(arg.EndTime) {
2362-
dailyStats[len(dailyStats)-1].endTime = arg.EndTime
2363-
}
2364-
2365-
for _, s := range q.workspaceAgentStats {
2366-
if s.CreatedAt.Before(arg.StartTime) || s.CreatedAt.Equal(arg.EndTime) || s.CreatedAt.After(arg.EndTime) {
2367-
continue
2368-
}
2369-
if len(arg.TemplateIDs) > 0 && !slices.Contains(arg.TemplateIDs, s.TemplateID) {
2370-
continue
2371-
}
2372-
if s.ConnectionCount == 0 {
2373-
continue
2374-
}
2375-
2376-
for _, ds := range dailyStats {
2377-
if s.CreatedAt.Before(ds.startTime) || s.CreatedAt.Equal(ds.endTime) || s.CreatedAt.After(ds.endTime) {
2378-
continue
2379-
}
2380-
ds.userSet[s.UserID] = struct{}{}
2381-
ds.templateIDSet[s.TemplateID] = struct{}{}
2382-
}
2383-
}
2384-
2385-
for _, s := range q.workspaceAppStats {
2386-
w, err := q.getWorkspaceByIDNoLock(ctx, s.WorkspaceID)
2387-
if err != nil {
2388-
return nil, err
2389-
}
2390-
2391-
if len(arg.TemplateIDs) > 0 && !slices.Contains(arg.TemplateIDs, w.TemplateID) {
2392-
continue
2393-
}
2394-
2395-
for _, ds := range dailyStats {
2396-
// (was.session_started_at >= ts.from_ AND was.session_started_at < ts.to_)
2397-
// OR (was.session_ended_at > ts.from_ AND was.session_ended_at < ts.to_)
2398-
// OR (was.session_started_at < ts.from_ AND was.session_ended_at >= ts.to_)
2399-
if !(((s.SessionStartedAt.After(ds.startTime) || s.SessionStartedAt.Equal(ds.startTime)) && s.SessionStartedAt.Before(ds.endTime)) ||
2400-
(s.SessionEndedAt.After(ds.startTime) && s.SessionEndedAt.Before(ds.endTime)) ||
2401-
(s.SessionStartedAt.Before(ds.startTime) && (s.SessionEndedAt.After(ds.endTime) || s.SessionEndedAt.Equal(ds.endTime)))) {
2402-
continue
2403-
}
2404-
2405-
ds.userSet[s.UserID] = struct{}{}
2406-
ds.templateIDSet[w.TemplateID] = struct{}{}
2407-
}
2408-
}
2409-
2410-
var result []database.GetTemplateDailyInsightsRow
2411-
for _, ds := range dailyStats {
2412-
templateIDs := make([]uuid.UUID, 0, len(ds.templateIDSet))
2413-
for templateID := range ds.templateIDSet {
2414-
templateIDs = append(templateIDs, templateID)
2415-
}
2416-
slices.SortFunc(templateIDs, func(a, b uuid.UUID) int {
2417-
return slice.Ascending(a.String(), b.String())
2418-
})
2419-
result = append(result, database.GetTemplateDailyInsightsRow{
2420-
StartTime: ds.startTime,
2421-
EndTime: ds.endTime,
2422-
TemplateIDs: templateIDs,
2423-
ActiveUsers: int64(len(ds.userSet)),
2424-
})
2425-
}
2426-
return result, nil
2427-
}
2428-
24292429
func (q *FakeQuerier) GetTemplateInsights(_ context.Context, arg database.GetTemplateInsightsParams) (database.GetTemplateInsightsRow, error) {
24302430
err := validateDatabaseType(arg)
24312431
if err != nil {

coderd/database/dbmetrics/dbmetrics.go

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbmock/dbmock.go

Lines changed: 15 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/querier.go

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)