@@ -812,6 +812,16 @@ func (q *FakeQuerier) ActivityBumpWorkspace(ctx context.Context, workspaceID uui
812
812
return sql .ErrNoRows
813
813
}
814
814
815
+ func (q * FakeQuerier ) AllUserIDs (_ context.Context ) ([]uuid.UUID , error ) {
816
+ q .mutex .RLock ()
817
+ defer q .mutex .RUnlock ()
818
+ userIDs := make ([]uuid.UUID , 0 , len (q .users ))
819
+ for idx := range q .users {
820
+ userIDs [idx ] = q .users [idx ].ID
821
+ }
822
+ return userIDs , nil
823
+ }
824
+
815
825
func (* FakeQuerier ) CleanTailnetCoordinators (_ context.Context ) error {
816
826
return ErrUnimplemented
817
827
}
@@ -2340,7 +2350,76 @@ func (q *FakeQuerier) GetTemplateDAUs(_ context.Context, arg database.GetTemplat
2340
2350
return rs , nil
2341
2351
}
2342
2352
2343
- func (q * FakeQuerier ) GetTemplateDailyInsights (ctx context.Context , arg database.GetTemplateDailyInsightsParams ) ([]database.GetTemplateDailyInsightsRow , error ) {
2353
+ func (q * FakeQuerier ) GetTemplateInsights (_ context.Context , arg database.GetTemplateInsightsParams ) (database.GetTemplateInsightsRow , error ) {
2354
+ err := validateDatabaseType (arg )
2355
+ if err != nil {
2356
+ return database.GetTemplateInsightsRow {}, err
2357
+ }
2358
+
2359
+ templateIDSet := make (map [uuid.UUID ]struct {})
2360
+ appUsageIntervalsByUser := make (map [uuid.UUID ]map [time.Time ]* database.GetTemplateInsightsRow )
2361
+ for _ , s := range q .workspaceAgentStats {
2362
+ if s .CreatedAt .Before (arg .StartTime ) || s .CreatedAt .Equal (arg .EndTime ) || s .CreatedAt .After (arg .EndTime ) {
2363
+ continue
2364
+ }
2365
+ if len (arg .TemplateIDs ) > 0 && ! slices .Contains (arg .TemplateIDs , s .TemplateID ) {
2366
+ continue
2367
+ }
2368
+ if s .ConnectionCount == 0 {
2369
+ continue
2370
+ }
2371
+
2372
+ templateIDSet [s .TemplateID ] = struct {}{}
2373
+ if appUsageIntervalsByUser [s .UserID ] == nil {
2374
+ appUsageIntervalsByUser [s .UserID ] = make (map [time.Time ]* database.GetTemplateInsightsRow )
2375
+ }
2376
+ t := s .CreatedAt .Truncate (time .Minute )
2377
+ if _ , ok := appUsageIntervalsByUser [s.UserID ][t ]; ! ok {
2378
+ appUsageIntervalsByUser [s.UserID ][t ] = & database.GetTemplateInsightsRow {}
2379
+ }
2380
+
2381
+ if s .SessionCountJetBrains > 0 {
2382
+ appUsageIntervalsByUser [s.UserID ][t ].UsageJetbrainsSeconds = 60
2383
+ }
2384
+ if s .SessionCountVSCode > 0 {
2385
+ appUsageIntervalsByUser [s.UserID ][t ].UsageVscodeSeconds = 60
2386
+ }
2387
+ if s .SessionCountReconnectingPTY > 0 {
2388
+ appUsageIntervalsByUser [s.UserID ][t ].UsageReconnectingPtySeconds = 60
2389
+ }
2390
+ if s .SessionCountSSH > 0 {
2391
+ appUsageIntervalsByUser [s.UserID ][t ].UsageSshSeconds = 60
2392
+ }
2393
+ }
2394
+
2395
+ templateIDs := make ([]uuid.UUID , 0 , len (templateIDSet ))
2396
+ for templateID := range templateIDSet {
2397
+ templateIDs = append (templateIDs , templateID )
2398
+ }
2399
+ slices .SortFunc (templateIDs , func (a , b uuid.UUID ) int {
2400
+ return slice .Ascending (a .String (), b .String ())
2401
+ })
2402
+ activeUserIDs := make ([]uuid.UUID , 0 , len (appUsageIntervalsByUser ))
2403
+ for userID := range appUsageIntervalsByUser {
2404
+ activeUserIDs = append (activeUserIDs , userID )
2405
+ }
2406
+
2407
+ result := database.GetTemplateInsightsRow {
2408
+ TemplateIDs : templateIDs ,
2409
+ ActiveUserIDs : activeUserIDs ,
2410
+ }
2411
+ for _ , intervals := range appUsageIntervalsByUser {
2412
+ for _ , interval := range intervals {
2413
+ result .UsageJetbrainsSeconds += interval .UsageJetbrainsSeconds
2414
+ result .UsageVscodeSeconds += interval .UsageVscodeSeconds
2415
+ result .UsageReconnectingPtySeconds += interval .UsageReconnectingPtySeconds
2416
+ result .UsageSshSeconds += interval .UsageSshSeconds
2417
+ }
2418
+ }
2419
+ return result , nil
2420
+ }
2421
+
2422
+ func (q * FakeQuerier ) GetTemplateInsightsByInterval (ctx context.Context , arg database.GetTemplateInsightsByIntervalParams ) ([]database.GetTemplateInsightsByIntervalRow , error ) {
2344
2423
err := validateDatabaseType (arg )
2345
2424
if err != nil {
2346
2425
return nil , err
@@ -2349,17 +2428,18 @@ func (q *FakeQuerier) GetTemplateDailyInsights(ctx context.Context, arg database
2349
2428
q .mutex .RLock ()
2350
2429
defer q .mutex .RUnlock ()
2351
2430
2352
- type dailyStat struct {
2431
+ type statByInterval struct {
2353
2432
startTime , endTime time.Time
2354
2433
userSet map [uuid.UUID ]struct {}
2355
2434
templateIDSet map [uuid.UUID ]struct {}
2356
2435
}
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 {})})
2436
+
2437
+ statsByInterval := []statByInterval {{arg .StartTime , arg .StartTime .AddDate (0 , 0 , int (arg .IntervalDays )), make (map [uuid.UUID ]struct {}), make (map [uuid.UUID ]struct {})}}
2438
+ for statsByInterval [len (statsByInterval )- 1 ].endTime .Before (arg .EndTime ) {
2439
+ statsByInterval = append (statsByInterval , statByInterval {statsByInterval [len (statsByInterval )- 1 ].endTime , statsByInterval [len (statsByInterval )- 1 ].endTime .AddDate (0 , 0 , int (arg .IntervalDays )), make (map [uuid.UUID ]struct {}), make (map [uuid.UUID ]struct {})})
2360
2440
}
2361
- if dailyStats [len (dailyStats )- 1 ].endTime .After (arg .EndTime ) {
2362
- dailyStats [len (dailyStats )- 1 ].endTime = arg .EndTime
2441
+ if statsByInterval [len (statsByInterval )- 1 ].endTime .After (arg .EndTime ) {
2442
+ statsByInterval [len (statsByInterval )- 1 ].endTime = arg .EndTime
2363
2443
}
2364
2444
2365
2445
for _ , s := range q .workspaceAgentStats {
@@ -2373,7 +2453,7 @@ func (q *FakeQuerier) GetTemplateDailyInsights(ctx context.Context, arg database
2373
2453
continue
2374
2454
}
2375
2455
2376
- for _ , ds := range dailyStats {
2456
+ for _ , ds := range statsByInterval {
2377
2457
if s .CreatedAt .Before (ds .startTime ) || s .CreatedAt .Equal (ds .endTime ) || s .CreatedAt .After (ds .endTime ) {
2378
2458
continue
2379
2459
}
@@ -2392,7 +2472,7 @@ func (q *FakeQuerier) GetTemplateDailyInsights(ctx context.Context, arg database
2392
2472
continue
2393
2473
}
2394
2474
2395
- for _ , ds := range dailyStats {
2475
+ for _ , ds := range statsByInterval {
2396
2476
// (was.session_started_at >= ts.from_ AND was.session_started_at < ts.to_)
2397
2477
// OR (was.session_ended_at > ts.from_ AND was.session_ended_at < ts.to_)
2398
2478
// OR (was.session_started_at < ts.from_ AND was.session_ended_at >= ts.to_)
@@ -2407,16 +2487,16 @@ func (q *FakeQuerier) GetTemplateDailyInsights(ctx context.Context, arg database
2407
2487
}
2408
2488
}
2409
2489
2410
- var result []database.GetTemplateDailyInsightsRow
2411
- for _ , ds := range dailyStats {
2490
+ var result []database.GetTemplateInsightsByIntervalRow
2491
+ for _ , ds := range statsByInterval {
2412
2492
templateIDs := make ([]uuid.UUID , 0 , len (ds .templateIDSet ))
2413
2493
for templateID := range ds .templateIDSet {
2414
2494
templateIDs = append (templateIDs , templateID )
2415
2495
}
2416
2496
slices .SortFunc (templateIDs , func (a , b uuid.UUID ) int {
2417
2497
return slice .Ascending (a .String (), b .String ())
2418
2498
})
2419
- result = append (result , database.GetTemplateDailyInsightsRow {
2499
+ result = append (result , database.GetTemplateInsightsByIntervalRow {
2420
2500
StartTime : ds .startTime ,
2421
2501
EndTime : ds .endTime ,
2422
2502
TemplateIDs : templateIDs ,
@@ -2426,75 +2506,6 @@ func (q *FakeQuerier) GetTemplateDailyInsights(ctx context.Context, arg database
2426
2506
return result , nil
2427
2507
}
2428
2508
2429
- func (q * FakeQuerier ) GetTemplateInsights (_ context.Context , arg database.GetTemplateInsightsParams ) (database.GetTemplateInsightsRow , error ) {
2430
- err := validateDatabaseType (arg )
2431
- if err != nil {
2432
- return database.GetTemplateInsightsRow {}, err
2433
- }
2434
-
2435
- templateIDSet := make (map [uuid.UUID ]struct {})
2436
- appUsageIntervalsByUser := make (map [uuid.UUID ]map [time.Time ]* database.GetTemplateInsightsRow )
2437
- for _ , s := range q .workspaceAgentStats {
2438
- if s .CreatedAt .Before (arg .StartTime ) || s .CreatedAt .Equal (arg .EndTime ) || s .CreatedAt .After (arg .EndTime ) {
2439
- continue
2440
- }
2441
- if len (arg .TemplateIDs ) > 0 && ! slices .Contains (arg .TemplateIDs , s .TemplateID ) {
2442
- continue
2443
- }
2444
- if s .ConnectionCount == 0 {
2445
- continue
2446
- }
2447
-
2448
- templateIDSet [s .TemplateID ] = struct {}{}
2449
- if appUsageIntervalsByUser [s .UserID ] == nil {
2450
- appUsageIntervalsByUser [s .UserID ] = make (map [time.Time ]* database.GetTemplateInsightsRow )
2451
- }
2452
- t := s .CreatedAt .Truncate (time .Minute )
2453
- if _ , ok := appUsageIntervalsByUser [s.UserID ][t ]; ! ok {
2454
- appUsageIntervalsByUser [s.UserID ][t ] = & database.GetTemplateInsightsRow {}
2455
- }
2456
-
2457
- if s .SessionCountJetBrains > 0 {
2458
- appUsageIntervalsByUser [s.UserID ][t ].UsageJetbrainsSeconds = 60
2459
- }
2460
- if s .SessionCountVSCode > 0 {
2461
- appUsageIntervalsByUser [s.UserID ][t ].UsageVscodeSeconds = 60
2462
- }
2463
- if s .SessionCountReconnectingPTY > 0 {
2464
- appUsageIntervalsByUser [s.UserID ][t ].UsageReconnectingPtySeconds = 60
2465
- }
2466
- if s .SessionCountSSH > 0 {
2467
- appUsageIntervalsByUser [s.UserID ][t ].UsageSshSeconds = 60
2468
- }
2469
- }
2470
-
2471
- templateIDs := make ([]uuid.UUID , 0 , len (templateIDSet ))
2472
- for templateID := range templateIDSet {
2473
- templateIDs = append (templateIDs , templateID )
2474
- }
2475
- slices .SortFunc (templateIDs , func (a , b uuid.UUID ) int {
2476
- return slice .Ascending (a .String (), b .String ())
2477
- })
2478
- activeUserIDs := make ([]uuid.UUID , 0 , len (appUsageIntervalsByUser ))
2479
- for userID := range appUsageIntervalsByUser {
2480
- activeUserIDs = append (activeUserIDs , userID )
2481
- }
2482
-
2483
- result := database.GetTemplateInsightsRow {
2484
- TemplateIDs : templateIDs ,
2485
- ActiveUserIDs : activeUserIDs ,
2486
- }
2487
- for _ , intervals := range appUsageIntervalsByUser {
2488
- for _ , interval := range intervals {
2489
- result .UsageJetbrainsSeconds += interval .UsageJetbrainsSeconds
2490
- result .UsageVscodeSeconds += interval .UsageVscodeSeconds
2491
- result .UsageReconnectingPtySeconds += interval .UsageReconnectingPtySeconds
2492
- result .UsageSshSeconds += interval .UsageSshSeconds
2493
- }
2494
- }
2495
- return result , nil
2496
- }
2497
-
2498
2509
func (q * FakeQuerier ) GetTemplateParameterInsights (ctx context.Context , arg database.GetTemplateParameterInsightsParams ) ([]database.GetTemplateParameterInsightsRow , error ) {
2499
2510
err := validateDatabaseType (arg )
2500
2511
if err != nil {
0 commit comments