@@ -27,32 +27,60 @@ func UserParam(r *http.Request) database.User {
27
27
func ExtractUserParam (db database.Store ) func (http.Handler ) http.Handler {
28
28
return func (next http.Handler ) http.Handler {
29
29
return http .HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
30
- var userID uuid.UUID
31
- if chi .URLParam (r , "user" ) == "me" {
32
- userID = APIKey (r ).UserID
30
+ var user database.User
31
+ var err error
32
+
33
+ // userQuery is either a uuid, a username, or 'me'
34
+ userQuery := chi .URLParam (r , "user" )
35
+ if userQuery == "" {
36
+ httpapi .Write (rw , http .StatusBadRequest , httpapi.Response {
37
+ Message : fmt .Sprintf ("%q must be provided" , "user" ),
38
+ })
39
+ return
40
+ }
41
+
42
+ if userQuery == "me" {
43
+ user , err = db .GetUserByID (r .Context (), APIKey (r ).UserID )
44
+ if err != nil {
45
+ httpapi .Write (rw , http .StatusInternalServerError , httpapi.Response {
46
+ Message : fmt .Sprintf ("get user: %s" , err .Error ()),
47
+ })
48
+ return
49
+ }
50
+ } else if userID , err := uuid .Parse (userQuery ); err == nil {
51
+ // If the userQuery is a valid uuid
52
+ user , err = db .GetUserByID (r .Context (), userID )
53
+ if err != nil {
54
+ httpapi .Write (rw , http .StatusInternalServerError , httpapi.Response {
55
+ Message : fmt .Sprintf ("get user: %s" , err .Error ()),
56
+ })
57
+ return
58
+ }
33
59
} else {
34
- var ok bool
35
- userID , ok = parseUUID (rw , r , "user" )
36
- if ! ok {
60
+ // Try as a username last
61
+ user , err = db .GetUserByEmailOrUsername (r .Context (), database.GetUserByEmailOrUsernameParams {
62
+ Username : userQuery ,
63
+ })
64
+ if err != nil {
65
+ // If the error is no rows, they might have inputted something
66
+ // that is not a username or uuid. Regardless, let's not indicate if
67
+ // the user exists or not. Just lump all these errors into
68
+ // something generic.
69
+ httpapi .Write (rw , http .StatusBadRequest , httpapi.Response {
70
+ Message : fmt .Sprint ("\" user\" must be a uuid or username" ),
71
+ })
37
72
return
38
73
}
39
74
}
40
75
41
76
apiKey := APIKey (r )
42
- if apiKey .UserID != userID {
77
+ if apiKey .UserID != user . ID {
43
78
httpapi .Write (rw , http .StatusBadRequest , httpapi.Response {
44
79
Message : "getting non-personal users isn't supported yet" ,
45
80
})
46
81
return
47
82
}
48
83
49
- user , err := db .GetUserByID (r .Context (), userID )
50
- if err != nil {
51
- httpapi .Write (rw , http .StatusInternalServerError , httpapi.Response {
52
- Message : fmt .Sprintf ("get user: %s" , err .Error ()),
53
- })
54
- }
55
-
56
84
ctx := context .WithValue (r .Context (), userParamContextKey {}, user )
57
85
next .ServeHTTP (rw , r .WithContext (ctx ))
58
86
})
0 commit comments