@@ -39,6 +39,7 @@ func AuditLogs(ctx context.Context, db database.Store, query string) (database.G
3939Email :parser .String (values ,"" ,"email" ),
4040DateFrom :parser .Time (values , time.Time {},"date_from" ,dateLayout ),
4141DateTo :parser .Time (values , time.Time {},"date_to" ,dateLayout ),
42+ OrganizationID :parseOrganization (ctx ,db ,parser ,values ,"organization" ),
4243ResourceType :string (httpapi .ParseCustom (parser ,values ,"" ,"resource_type" ,httpapi .ParseEnum [database .ResourceType ])),
4344Action :string (httpapi .ParseCustom (parser ,values ,"" ,"action" ,httpapi .ParseEnum [database .AuditAction ])),
4445BuildReason :string (httpapi .ParseCustom (parser ,values ,"" ,"build_reason" ,httpapi .ParseEnum [database .BuildReason ])),
@@ -47,27 +48,6 @@ func AuditLogs(ctx context.Context, db database.Store, query string) (database.G
4748filter .DateTo = filter .DateTo .Add (23 * time .Hour + 59 * time .Minute + 59 * time .Second )
4849}
4950
50- // Convert the "organization" parameter to an organization uuid. This can require
51- // a database lookup.
52- organizationArg := parser .String (values ,"" ,"organization" )
53- if organizationArg != "" {
54- organizationID ,err := uuid .Parse (organizationArg )
55- if err == nil {
56- filter .OrganizationID = organizationID
57- }else {
58- // Organization could be a name
59- organization ,err := db .GetOrganizationByName (ctx ,organizationArg )
60- if err != nil {
61- parser .Errors = append (parser .Errors , codersdk.ValidationError {
62- Field :"organization" ,
63- Detail :fmt .Sprintf ("Organization %q either does not exist, or you are unauthorized to view it" ,organizationArg ),
64- })
65- }else {
66- filter .OrganizationID = organization .ID
67- }
68- }
69- }
70-
7151parser .ErrorExcessParams (values )
7252return filter ,parser .Errors
7353}
@@ -95,7 +75,7 @@ func Users(query string) (database.GetUsersParams, []codersdk.ValidationError) {
9575return filter ,parser .Errors
9676}
9777
98- func Workspaces (query string ,page codersdk.Pagination ,agentInactiveDisconnectTimeout time.Duration ) (database.GetWorkspacesParams , []codersdk.ValidationError ) {
78+ func Workspaces (ctx context. Context , db database. Store , query string ,page codersdk.Pagination ,agentInactiveDisconnectTimeout time.Duration ) (database.GetWorkspacesParams , []codersdk.ValidationError ) {
9979filter := database.GetWorkspacesParams {
10080AgentInactiveDisconnectTimeoutSeconds :int64 (agentInactiveDisconnectTimeout .Seconds ()),
10181
@@ -145,6 +125,7 @@ func Workspaces(query string, page codersdk.Pagination, agentInactiveDisconnectT
145125// which will return all workspaces.
146126Valid :values .Has ("outdated" ),
147127}
128+ filter .OrganizationID = parseOrganization (ctx ,db ,parser ,values ,"organization" )
148129
149130type paramMatch struct {
150131name string
@@ -198,32 +179,12 @@ func Templates(ctx context.Context, db database.Store, query string) (database.G
198179
199180parser := httpapi .NewQueryParamParser ()
200181filter := database.GetTemplatesWithFilterParams {
201- Deleted :parser .Boolean (values ,false ,"deleted" ),
202- ExactName :parser .String (values ,"" ,"exact_name" ),
203- FuzzyName :parser .String (values ,"" ,"name" ),
204- IDs :parser .UUIDs (values , []uuid.UUID {},"ids" ),
205- Deprecated :parser .NullableBoolean (values , sql.NullBool {},"deprecated" ),
206- }
207-
208- // Convert the "organization" parameter to an organization uuid. This can require
209- // a database lookup.
210- organizationArg := parser .String (values ,"" ,"organization" )
211- if organizationArg != "" {
212- organizationID ,err := uuid .Parse (organizationArg )
213- if err == nil {
214- filter .OrganizationID = organizationID
215- }else {
216- // Organization could be a name
217- organization ,err := db .GetOrganizationByName (ctx ,organizationArg )
218- if err != nil {
219- parser .Errors = append (parser .Errors , codersdk.ValidationError {
220- Field :"organization" ,
221- Detail :fmt .Sprintf ("Organization %q either does not exist, or you are unauthorized to view it" ,organizationArg ),
222- })
223- }else {
224- filter .OrganizationID = organization .ID
225- }
226- }
182+ Deleted :parser .Boolean (values ,false ,"deleted" ),
183+ ExactName :parser .String (values ,"" ,"exact_name" ),
184+ FuzzyName :parser .String (values ,"" ,"name" ),
185+ IDs :parser .UUIDs (values , []uuid.UUID {},"ids" ),
186+ Deprecated :parser .NullableBoolean (values , sql.NullBool {},"deprecated" ),
187+ OrganizationID :parseOrganization (ctx ,db ,parser ,values ,"organization" ),
227188}
228189
229190parser .ErrorExcessParams (values )
@@ -271,6 +232,23 @@ func searchTerms(query string, defaultKey func(term string, values url.Values) e
271232return searchValues ,nil
272233}
273234
235+ func parseOrganization (ctx context.Context ,db database.Store ,parser * httpapi.QueryParamParser ,vals url.Values ,queryParam string ) uuid.UUID {
236+ return httpapi .ParseCustom (parser ,vals ,uuid .Nil ,queryParam ,func (v string ) (uuid.UUID ,error ) {
237+ if v == "" {
238+ return uuid .Nil ,nil
239+ }
240+ organizationID ,err := uuid .Parse (v )
241+ if err == nil {
242+ return organizationID ,nil
243+ }
244+ organization ,err := db .GetOrganizationByName (ctx ,v )
245+ if err != nil {
246+ return uuid .Nil ,xerrors .Errorf ("organization %q either does not exist, or you are unauthorized to view it" ,v )
247+ }
248+ return organization .ID ,nil
249+ })
250+ }
251+
274252// splitQueryParameterByDelimiter takes a query string and splits it into the individual elements
275253// of the query. Each element is separated by a delimiter. All quoted strings are
276254// kept as a single element.