5
5
"errors"
6
6
"fmt"
7
7
"net/http"
8
+ "time"
8
9
9
10
"github.com/go-chi/render"
10
11
"github.com/google/uuid"
@@ -30,7 +31,16 @@ type CreateParameterValueRequest struct {
30
31
// Project is the JSON representation of a Coder project.
31
32
// This type matches the database object for now, but is
32
33
// abstracted for ease of change later on.
33
- type Project database.Project
34
+ type Project struct {
35
+ ID uuid.UUID `json:"id"`
36
+ CreatedAt time.Time `json:"created_at"`
37
+ UpdatedAt time.Time `json:"updated_at"`
38
+ OrganizationID string `json:"organization_id"`
39
+ Name string `json:"name"`
40
+ Provisioner database.ProvisionerType `json:"provisioner"`
41
+ ActiveVersionID uuid.UUID `json:"active_version_id"`
42
+ WorkspaceOwnerCount uint32 `json:"workspace_owner_count"`
43
+ }
34
44
35
45
// CreateProjectRequest enables callers to create a new Project.
36
46
type CreateProjectRequest struct {
@@ -69,11 +79,32 @@ func (api *api) projects(rw http.ResponseWriter, r *http.Request) {
69
79
})
70
80
return
71
81
}
72
- if projects == nil {
73
- projects = []database.Project {}
82
+ projectIDs := make ([]uuid.UUID , 0 , len (projects ))
83
+ for _ , project := range projects {
84
+ projectIDs = append (projectIDs , project .ID )
85
+ }
86
+ workspaceCounts , err := api .Database .GetWorkspaceOwnerCountsByProjectIDs (r .Context (), projectIDs )
87
+ if errors .Is (err , sql .ErrNoRows ) {
88
+ err = nil
89
+ }
90
+ if err != nil {
91
+ httpapi .Write (rw , http .StatusInternalServerError , httpapi.Response {
92
+ Message : fmt .Sprintf ("get workspace counts: %s" , err .Error ()),
93
+ })
94
+ return
95
+ }
96
+ apiProjects := make ([]Project , 0 , len (projects ))
97
+ for _ , project := range projects {
98
+ for _ , workspaceCount := range workspaceCounts {
99
+ if workspaceCount .ProjectID .String () != project .ID .String () {
100
+ continue
101
+ }
102
+ apiProjects = append (apiProjects , convertProject (project , uint32 (workspaceCount .Count )))
103
+ break
104
+ }
74
105
}
75
106
render .Status (r , http .StatusOK )
76
- render .JSON (rw , r , projects )
107
+ render .JSON (rw , r , apiProjects )
77
108
}
78
109
79
110
// Lists all projects in an organization.
@@ -89,11 +120,32 @@ func (api *api) projectsByOrganization(rw http.ResponseWriter, r *http.Request)
89
120
})
90
121
return
91
122
}
92
- if projects == nil {
93
- projects = []database.Project {}
123
+ projectIDs := make ([]uuid.UUID , 0 , len (projects ))
124
+ for _ , project := range projects {
125
+ projectIDs = append (projectIDs , project .ID )
126
+ }
127
+ workspaceCounts , err := api .Database .GetWorkspaceOwnerCountsByProjectIDs (r .Context (), projectIDs )
128
+ if errors .Is (err , sql .ErrNoRows ) {
129
+ err = nil
130
+ }
131
+ if err != nil {
132
+ httpapi .Write (rw , http .StatusInternalServerError , httpapi.Response {
133
+ Message : fmt .Sprintf ("get workspace counts: %s" , err .Error ()),
134
+ })
135
+ return
136
+ }
137
+ apiProjects := make ([]Project , 0 , len (projects ))
138
+ for _ , project := range projects {
139
+ for _ , workspaceCount := range workspaceCounts {
140
+ if workspaceCount .ProjectID .String () != project .ID .String () {
141
+ continue
142
+ }
143
+ apiProjects = append (apiProjects , convertProject (project , uint32 (workspaceCount .Count )))
144
+ break
145
+ }
94
146
}
95
147
render .Status (r , http .StatusOK )
96
- render .JSON (rw , r , projects )
148
+ render .JSON (rw , r , apiProjects )
97
149
}
98
150
99
151
// Create a new project in an organization.
@@ -162,7 +214,7 @@ func (api *api) postProjectsByOrganization(rw http.ResponseWriter, r *http.Reque
162
214
if err != nil {
163
215
return xerrors .Errorf ("insert project version: %s" , err )
164
216
}
165
- project = Project (dbProject )
217
+ project = convertProject (dbProject , 0 )
166
218
return nil
167
219
})
168
220
if err != nil {
@@ -241,6 +293,19 @@ func (api *api) parametersByProject(rw http.ResponseWriter, r *http.Request) {
241
293
render .JSON (rw , r , apiParameterValues )
242
294
}
243
295
296
+ func convertProject (project database.Project , workspaceOwnerCount uint32 ) Project {
297
+ return Project {
298
+ ID : project .ID ,
299
+ CreatedAt : project .CreatedAt ,
300
+ UpdatedAt : project .UpdatedAt ,
301
+ OrganizationID : project .OrganizationID ,
302
+ Name : project .Name ,
303
+ Provisioner : project .Provisioner ,
304
+ ActiveVersionID : project .ActiveVersionID ,
305
+ WorkspaceOwnerCount : workspaceOwnerCount ,
306
+ }
307
+ }
308
+
244
309
func convertParameterValue (parameterValue database.ParameterValue ) ParameterValue {
245
310
parameterValue .SourceValue = ""
246
311
return ParameterValue (parameterValue )
0 commit comments