Skip to content

Commit fb7cf68

Browse files
committed
refactor: error handling
1 parent d6698ee commit fb7cf68

File tree

4 files changed

+21
-36
lines changed

4 files changed

+21
-36
lines changed

docs/database.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ Tracks user devices, type, status, and optional metadata.
5151
"user_id": "uuid-1234",
5252
"name": "Living Room Sensor",
5353
"device_type": "temperature_sensor",
54-
"status": "Online",
54+
"status": "online",
5555
"metadata": {
5656
"manufacturer": "AcmeSensors",
5757
"firmware_version": "v1.2.3",

internal/http/auth_handler.go

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -54,30 +54,21 @@ func (h *AuthHandler) RegisterUser(w http.ResponseWriter, r *http.Request) {
5454
u, err := h.auth.Register(r.Context(), req.Username, req.Email, req.Password)
5555
if err != nil {
5656
switch {
57-
case errors.Is(err, user.ErrEmailInvalid),
58-
errors.Is(err, user.ErrEmailRequired):
59-
WriteJSONError(w, http.StatusBadRequest, invalidEmail, err.Error())
60-
return
61-
6257
case errors.Is(err, user.ErrUsernameRequired),
6358
errors.Is(err, user.ErrUsernameTooShort),
6459
errors.Is(err, user.ErrUsernameTooLong),
65-
errors.Is(err, user.ErrUsernameInvalidChars):
66-
WriteJSONError(w, http.StatusBadRequest, invalidUsername, err.Error())
67-
return
68-
69-
case errors.Is(err, user.ErrPasswordRequired),
60+
errors.Is(err, user.ErrEmailInvalid),
61+
errors.Is(err, user.ErrEmailRequired),
62+
errors.Is(err, user.ErrPasswordRequired),
7063
errors.Is(err, user.ErrPasswordTooShort),
71-
errors.Is(err, user.ErrPasswordTooWeak):
72-
WriteJSONError(w, http.StatusBadRequest, invalidPassword, err.Error())
73-
return
74-
75-
case errors.Is(err, user.ErrEmailAlreadyExists):
76-
WriteJSONError(w, http.StatusConflict, emailExists, err.Error())
64+
errors.Is(err, user.ErrPasswordTooWeak),
65+
errors.Is(err, user.ErrUsernameInvalidChars):
66+
WriteJSONError(w, http.StatusBadRequest, invalidRequest, err.Error())
7767
return
7868

79-
case errors.Is(err, user.ErrUsernameTaken):
80-
WriteJSONError(w, http.StatusConflict, usernameExists, err.Error())
69+
case errors.Is(err, user.ErrEmailAlreadyExists),
70+
errors.Is(err, user.ErrUsernameTaken):
71+
WriteJSONError(w, http.StatusConflict, conflict, err.Error())
8172
return
8273

8374
default:
@@ -116,7 +107,7 @@ func (h *AuthHandler) LoginUser(w http.ResponseWriter, r *http.Request) {
116107
accessToken, refreshToken, err := h.auth.Login(r.Context(), req.Email, req.Password)
117108
if err != nil {
118109
if errors.Is(err, user.ErrInvalidCredentials) {
119-
WriteJSONError(w, http.StatusUnauthorized, invalidCredentials, "Invalid credentials")
110+
WriteJSONError(w, http.StatusUnauthorized, invalidRequest, "Invalid credentials")
120111
return
121112
}
122113

@@ -155,7 +146,7 @@ func (h *AuthHandler) RefreshAccessToken(w http.ResponseWriter, r *http.Request)
155146
if err != nil {
156147
switch {
157148
case errors.Is(err, token.ErrTokenNotFound):
158-
WriteJSONError(w, http.StatusUnauthorized, invalidGrant, "Invalid or expired refresh token")
149+
WriteJSONError(w, http.StatusUnauthorized, unauthorized, "Invalid or expired refresh token")
159150
default:
160151
h.log.Error(fmt.Sprintf("failed to refresh access token: %v", err))
161152
WriteInternalError(w)

internal/http/device_handler.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func (h *DeviceHandler) HandleCreateDevice(w http.ResponseWriter, r *http.Reques
6262
errors.Is(err, device.ErrInvalidStatus),
6363
errors.Is(err, device.ErrInvalidDeviceType),
6464
errors.Is(err, device.ErrInvalidMetadata):
65-
WriteJSONError(w, http.StatusBadRequest, validationError, err.Error())
65+
WriteJSONError(w, http.StatusBadRequest, invalidRequest, err.Error())
6666
return
6767

6868
case errors.Is(err, user.ErrUserNotFound):
@@ -86,3 +86,7 @@ func (h *DeviceHandler) HandleCreateDevice(w http.ResponseWriter, r *http.Reques
8686

8787
WriteJSON(w, http.StatusCreated, res, nil)
8888
}
89+
90+
func (h *DeviceHandler) HandleGetDeviceById(w http.ResponseWriter, r *http.Request) {
91+
92+
}

internal/http/errors.go

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,8 @@ package http
33
type errorCode string
44

55
const (
6-
invalidRequest errorCode = "INVALID_REQUEST"
7-
invalidEmail errorCode = "INVALID_EMAIL"
8-
invalidUsername errorCode = "INVALID_USERNAME"
9-
invalidPassword errorCode = "INVALID_PASSWORD"
10-
unauthorized errorCode = "UNAUTHORIZED"
11-
12-
invalidCredentials errorCode = "INVALID_CREDENTIALS"
13-
invalidGrant errorCode = "INVALID_GRANT"
14-
validationError errorCode = "VALIDATION_ERROR"
15-
16-
emailExists errorCode = "EMAIL_EXISTS"
17-
usernameExists errorCode = "USERNAME_EXISTS"
18-
19-
internalError errorCode = "INTERNAL_ERROR"
6+
invalidRequest errorCode = "INVALID_REQUEST" // includes validation errors
7+
unauthorized errorCode = "UNAUTHORIZED" // invalid token, creds, grant
8+
conflict errorCode = "CONFLICT" // duplicate email/username
9+
internalError errorCode = "INTERNAL_ERROR" // unexpected server error
2010
)

0 commit comments

Comments
 (0)