@@ -226,6 +226,7 @@ func Workspaces(ctx context.Context, db database.Store, query string, page coder
226
226
filter .HasExternalAgent = parser .NullableBoolean (values , sql.NullBool {},"has_external_agent" )
227
227
filter .OrganizationID = parseOrganization (ctx ,db ,parser ,values ,"organization" )
228
228
filter .Shared = parser .NullableBoolean (values , sql.NullBool {},"shared" )
229
+ filter .SharedWithUserID = parseUser (ctx ,db ,parser ,values ,"shared_with_user" )
229
230
230
231
type paramMatch struct {
231
232
name string
@@ -363,6 +364,25 @@ func parseOrganization(ctx context.Context, db database.Store, parser *httpapi.Q
363
364
})
364
365
}
365
366
367
+ func parseUser (ctx context.Context ,db database.Store ,parser * httpapi.QueryParamParser ,vals url.Values ,queryParam string ) uuid.UUID {
368
+ return httpapi .ParseCustom (parser ,vals ,uuid .Nil ,queryParam ,func (v string ) (uuid.UUID ,error ) {
369
+ if v == "" {
370
+ return uuid .Nil ,nil
371
+ }
372
+ userID ,err := uuid .Parse (v )
373
+ if err == nil {
374
+ return userID ,nil
375
+ }
376
+ user ,err := db .GetUserByEmailOrUsername (ctx , database.GetUserByEmailOrUsernameParams {
377
+ Username :v ,
378
+ })
379
+ if err != nil {
380
+ return uuid .Nil ,xerrors .Errorf ("user %q either does not exist, or you are unauthorized to view them" ,v )
381
+ }
382
+ return user .ID ,nil
383
+ })
384
+ }
385
+
366
386
// splitQueryParameterByDelimiter takes a query string and splits it into the individual elements
367
387
// of the query. Each element is separated by a delimiter. All quoted strings are
368
388
// kept as a single element.