MCPcopy Index your code
hub / github.com/coder/coder / ExtractUserContext

Function ExtractUserContext

coderd/httpmw/userparam.go:73–138  ·  view source on GitHub ↗

ExtractUserContext queries the database for the parameterized `{user}` from the request URL.

(ctx context.Context, db database.Store, rw http.ResponseWriter, r *http.Request)

Source from the content-addressed store, hash-verified

71
72// ExtractUserContext queries the database for the parameterized `{user}` from the request URL.
73func ExtractUserContext(ctx context.Context, db database.Store, rw http.ResponseWriter, r *http.Request) (user database.User, ok bool) {
74 // userQuery is either a uuid, a username, or 'me'
75 userQuery := chi.URLParam(r, "user")
76 if userQuery == "" {
77 httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
78 Message: "\"user\" must be provided.",
79 })
80 return database.User{}, false
81 }
82
83 if userQuery == "me" {
84 apiKey, ok := APIKeyOptional(r)
85 if !ok {
86 httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
87 Message: "Cannot use \"me\" without a valid session.",
88 })
89 return database.User{}, false
90 }
91 user, err := db.GetUserByID(ctx, apiKey.UserID)
92 if httpapi.Is404Error(err) {
93 httpapi.ResourceNotFound(rw)
94 return database.User{}, false
95 }
96 if err != nil {
97 httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
98 Message: "Internal error fetching user.",
99 Detail: err.Error(),
100 })
101 return database.User{}, false
102 }
103 return user, true
104 }
105
106 if userID, err := uuid.Parse(userQuery); err == nil {
107 user, err = db.GetUserByID(ctx, userID)
108 if err != nil {
109 if httpapi.Is404Error(err) {
110 httpapi.ResourceNotFound(rw)
111 return database.User{}, false
112 }
113 httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
114 Message: userErrorMessage,
115 Detail: fmt.Sprintf("queried user=%q", userQuery),
116 })
117 return database.User{}, false
118 }
119 return user, true
120 }
121
122 // Try as a username last
123 user, err := db.GetUserByEmailOrUsername(ctx, database.GetUserByEmailOrUsernameParams{
124 Username: userQuery,
125 })
126 if err != nil {
127 if httpapi.Is404Error(err) {
128 httpapi.ResourceNotFound(rw)
129 return database.User{}, false
130 }

Callers 3

ExtractUserParamFunction · 0.85
ExtractUserParamOptionalFunction · 0.85

Calls 8

WriteFunction · 0.92
Is404ErrorFunction · 0.92
ResourceNotFoundFunction · 0.92
APIKeyOptionalFunction · 0.85
GetUserByIDMethod · 0.65
ParseMethod · 0.65
ErrorMethod · 0.45

Tested by

no test coverage detected