Return 404 when profile is not found
* Return 404 when profile is not found
* Handler sql.ErrNoRows and avoid returning nil
update federation GetProfile as well
MODIFY
src/github.com/matrix-org/dendrite/clientapi/routing/profile.go
src/github.com/matrix-org/dendrite/clientapi/routing/profile.go
@@ -16,6 +16,7 @@ package routing
import (
"context"
+ "database/sql"
"net/http"
"github.com/matrix-org/dendrite/clientapi/auth/authtypes"
@@ -41,15 +42,12 @@ func GetProfile(
JSON: jsonerror.NotFound("Bad method"),
}
}
- localpart, _, err := gomatrixserverlib.SplitID('@', userID)
- if err != nil {
- return httputil.LogThenError(req, err)
- }
- profile, err := accountDB.GetProfileByLocalpart(req.Context(), localpart)
+ profile, err := getProfileByUserID(req, accountDB, userID)
if err != nil {
- return httputil.LogThenError(req, err)
+ return *err
}
+
res := common.ProfileResponse{
AvatarURL: profile.AvatarURL,
DisplayName: profile.DisplayName,
@@ -60,19 +58,39 @@ func GetProfile(
}
}
-// GetAvatarURL implements GET /profile/{userID}/avatar_url
-func GetAvatarURL(
+// getProfileByUserID returns the profile for userID, otherwise returns an error response
+func getProfileByUserID(
req *http.Request, accountDB *accounts.Database, userID string,
-) util.JSONResponse {
+) (*authtypes.Profile, *util.JSONResponse) {
localpart, _, err := gomatrixserverlib.SplitID('@', userID)
if err != nil {
- return httputil.LogThenError(req, err)
+ resErr := httputil.LogThenError(req, err)
+ return nil, &resErr
}
profile, err := accountDB.GetProfileByLocalpart(req.Context(), localpart)
+ if err == sql.ErrNoRows {
+ return nil, &util.JSONResponse{
+ Code: http.StatusNotFound,
+ JSON: jsonerror.NotFound("no profile information for this user or this user does not exist"),
+ }
+ } else if err != nil {
+ resErr := httputil.LogThenError(req, err)
+ return nil, &resErr
+ }
+
+ return profile, nil
+}
+
+// GetAvatarURL implements GET /profile/{userID}/avatar_url
+func GetAvatarURL(
+ req *http.Request, accountDB *accounts.Database, userID string,
+) util.JSONResponse {
+ profile, err := getProfileByUserID(req, accountDB, userID)
if err != nil {
- return httputil.LogThenError(req, err)
+ return *err
}
+
res := common.AvatarURL{
AvatarURL: profile.AvatarURL,
}
@@ -156,15 +174,11 @@ func SetAvatarURL(
func GetDisplayName(
req *http.Request, accountDB *accounts.Database, userID string,
) util.JSONResponse {
- localpart, _, err := gomatrixserverlib.SplitID('@', userID)
+ profile, err := getProfileByUserID(req, accountDB, userID)
if err != nil {
- return httputil.LogThenError(req, err)
+ return *err
}
- profile, err := accountDB.GetProfileByLocalpart(req.Context(), localpart)
- if err != nil {
- return httputil.LogThenError(req, err)
- }
res := common.DisplayName{
DisplayName: profile.DisplayName,
}

MODIFY
src/github.com/matrix-org/dendrite/federationapi/routing/profile.go
src/github.com/matrix-org/dendrite/federationapi/routing/profile.go
package routing
import (
+ "database/sql"
"net/http"
"github.com/matrix-org/dendrite/clientapi/auth/storage/accounts"
@@ -52,7 +53,12 @@ func GetProfile(
}
profile, err := accountDB.GetProfileByLocalpart(httpReq.Context(), localpart)
- if err != nil {
+ if err == sql.ErrNoRows {
+ return util.JSONResponse{
+ Code: http.StatusNotFound,
+ JSON: jsonerror.NotFound("no profile information for this user or this user does not exist"),
+ }
+ } else if err != nil {
return httputil.LogThenError(httpReq, err)
}

Return 404 when profile is not found (#524)

* Return 404 when profile is not found

* Handler sql.ErrNoRows and avoid returning nil

update federation GetProfile as well

Signed-off-by: Anant Prakash <anantprakashjsr@gmail.com>