@@ -94,16 +94,53 @@ func (api *API) insightsUserActivity(rw http.ResponseWriter, r *http.Request) {
94
94
return
95
95
}
96
96
97
- // TODO
97
+ rows , err := api .Database .GetUserActivityInsights (ctx , database.GetUserActivityInsightsParams {
98
+ StartTime : startTime ,
99
+ EndTime : endTime ,
100
+ TemplateIDs : templateIDs ,
101
+ })
102
+ if err != nil {
103
+ if httpapi .Is404Error (err ) {
104
+ httpapi .ResourceNotFound (rw )
105
+ return
106
+ }
107
+ httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
108
+ Message : "Internal error fetching user activity." ,
109
+ Detail : err .Error (),
110
+ })
111
+ return
112
+ }
113
+
114
+ templateIDSet := make (map [uuid.UUID ]struct {})
115
+ userActivities := make ([]codersdk.UserActivity , 0 , len (rows ))
116
+ for _ , row := range rows {
117
+ for _ , templateID := range row .TemplateIDs {
118
+ templateIDSet [templateID ] = struct {}{}
119
+ }
120
+ userActivities = append (userActivities , codersdk.UserActivity {
121
+ TemplateIDs : row .TemplateIDs ,
122
+ UserID : row .UserID ,
123
+ Username : row .Username ,
124
+ AvatarURL : row .AvatarURL .String ,
125
+ Seconds : row .UsageSeconds ,
126
+ })
127
+ }
98
128
99
- seenTemplateIDs := templateIDs // FIXME
129
+ // TemplateIDs that contributed to the data.
130
+ seenTemplateIDs := make ([]uuid.UUID , 0 , len (templateIDSet ))
131
+ for templateID := range templateIDSet {
132
+ seenTemplateIDs = append (seenTemplateIDs , templateID )
133
+ }
134
+ slices .SortFunc (seenTemplateIDs , func (a , b uuid.UUID ) int {
135
+ return slice .Ascending (a .String (), b .String ())
136
+ })
100
137
101
138
resp := codersdk.UserActivityInsightsResponse {
102
139
Report : codersdk.UserActivityInsightsReport {
103
140
StartTime : startTime ,
104
141
EndTime : endTime ,
105
142
TemplateIDs : seenTemplateIDs ,
106
- Users : nil , // FIXME
143
+ Users : userActivities ,
107
144
},
108
145
}
109
146
httpapi .Write (ctx , rw , http .StatusOK , resp )
0 commit comments