@@ -39,6 +39,7 @@ func AuditLogs(ctx context.Context, db database.Store, query string) (database.G
3939 Email : parser .String (values , "" , "email" ),
4040 DateFrom : parser .Time (values , time.Time {}, "date_from" , dateLayout ),
4141 DateTo : parser .Time (values , time.Time {}, "date_to" , dateLayout ),
42+ OrganizationID : parseOrganization (ctx , db , parser , values , "organization" ),
4243 ResourceType : string (httpapi .ParseCustom (parser , values , "" , "resource_type" , httpapi .ParseEnum [database .ResourceType ])),
4344 Action : string (httpapi .ParseCustom (parser , values , "" , "action" , httpapi .ParseEnum [database .AuditAction ])),
4445 BuildReason : 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
4748 filter .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-
7151 parser .ErrorExcessParams (values )
7252 return filter , parser .Errors
7353}
@@ -95,7 +75,7 @@ func Users(query string) (database.GetUsersParams, []codersdk.ValidationError) {
9575 return 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 ) {
9979 filter := database.GetWorkspacesParams {
10080 AgentInactiveDisconnectTimeoutSeconds : int64 (agentInactiveDisconnectTimeout .Seconds ()),
10181
@@ -145,6 +125,7 @@ func Workspaces(query string, page codersdk.Pagination, agentInactiveDisconnectT
145125 // which will return all workspaces.
146126 Valid : values .Has ("outdated" ),
147127 }
128+ filter .OrganizationID = parseOrganization (ctx , db , parser , values , "organization" )
148129
149130 type paramMatch struct {
150131 name string
@@ -198,32 +179,12 @@ func Templates(ctx context.Context, db database.Store, query string) (database.G
198179
199180 parser := httpapi .NewQueryParamParser ()
200181 filter := 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
229190 parser .ErrorExcessParams (values )
@@ -271,6 +232,23 @@ func searchTerms(query string, defaultKey func(term string, values url.Values) e
271232 return 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.
0 commit comments