@@ -271,46 +271,52 @@ func (api *API) insightsTemplates(rw http.ResponseWriter, r *http.Request) {
271
271
EndTime :endTime ,
272
272
TemplateIDs :usage .TemplateIDs ,
273
273
ActiveUsers :usage .ActiveUsers ,
274
- AppsUsage : []codersdk.TemplateAppUsage {
275
- {
276
- TemplateIDs :usage .TemplateIDs ,
277
- Type :codersdk .TemplateAppsTypeBuiltin ,
278
- DisplayName :"Visual Studio Code" ,
279
- Slug :"vscode" ,
280
- Icon :"/icons/code.svg" ,
281
- Seconds :usage .UsageVscodeSeconds ,
282
- },
283
- {
284
- TemplateIDs :usage .TemplateIDs ,
285
- Type :codersdk .TemplateAppsTypeBuiltin ,
286
- DisplayName :"JetBrains" ,
287
- Slug :"jetbrains" ,
288
- Icon :"/icons/intellij.svg" ,
289
- Seconds :usage .UsageJetbrainsSeconds ,
290
- },
291
- {
292
- TemplateIDs :usage .TemplateIDs ,
293
- Type :codersdk .TemplateAppsTypeBuiltin ,
294
- DisplayName :"Web Terminal" ,
295
- Slug :"reconnecting-pty" ,
296
- Icon :"/icons/terminal.svg" ,
297
- Seconds :usage .UsageReconnectingPtySeconds ,
298
- },
299
- {
300
- TemplateIDs :usage .TemplateIDs ,
301
- Type :codersdk .TemplateAppsTypeBuiltin ,
302
- DisplayName :"SSH" ,
303
- Slug :"ssh" ,
304
- Icon :"/icons/terminal.svg" ,
305
- Seconds :usage .UsageSshSeconds ,
306
- },
307
- },
274
+ AppsUsage :convertTemplateInsightsBuiltinApps (usage ),
308
275
},
309
276
IntervalReports :intervalReports ,
310
277
}
311
278
httpapi .Write (ctx ,rw ,http .StatusOK ,resp )
312
279
}
313
280
281
+ // convertTemplateInsightsBuiltinApps builds the list of builtin apps from the
282
+ // database row, these are apps that are implicitly a part of all templates.
283
+ func convertTemplateInsightsBuiltinApps (usage database.GetTemplateInsightsRow ) []codersdk.TemplateAppUsage {
284
+ return []codersdk.TemplateAppUsage {
285
+ {
286
+ TemplateIDs :usage .TemplateIDs ,
287
+ Type :codersdk .TemplateAppsTypeBuiltin ,
288
+ DisplayName :"Visual Studio Code" ,
289
+ Slug :"vscode" ,
290
+ Icon :"/icons/code.svg" ,
291
+ Seconds :usage .UsageVscodeSeconds ,
292
+ },
293
+ {
294
+ TemplateIDs :usage .TemplateIDs ,
295
+ Type :codersdk .TemplateAppsTypeBuiltin ,
296
+ DisplayName :"JetBrains" ,
297
+ Slug :"jetbrains" ,
298
+ Icon :"/icons/intellij.svg" ,
299
+ Seconds :usage .UsageJetbrainsSeconds ,
300
+ },
301
+ {
302
+ TemplateIDs :usage .TemplateIDs ,
303
+ Type :codersdk .TemplateAppsTypeBuiltin ,
304
+ DisplayName :"Web Terminal" ,
305
+ Slug :"reconnecting-pty" ,
306
+ Icon :"/icons/terminal.svg" ,
307
+ Seconds :usage .UsageReconnectingPtySeconds ,
308
+ },
309
+ {
310
+ TemplateIDs :usage .TemplateIDs ,
311
+ Type :codersdk .TemplateAppsTypeBuiltin ,
312
+ DisplayName :"SSH" ,
313
+ Slug :"ssh" ,
314
+ Icon :"/icons/terminal.svg" ,
315
+ Seconds :usage .UsageSshSeconds ,
316
+ },
317
+ }
318
+ }
319
+
314
320
// parseInsightsStartAndEndTime parses the start and end time query parameters
315
321
// and returns the parsed values. The client provided timezone must be preserved
316
322
// when parsing the time. Verification is performed so that the start and end