Skip to content

Commit 860e48a

Browse files
authored
Merge pull request #17 from hammercode-dev/be-09/custome-error
[BE-09] - Custome Error
2 parents b28a02f + 4cb9950 commit 860e48a

File tree

8 files changed

+117
-56
lines changed

8 files changed

+117
-56
lines changed

app/newsletters/delivery/http/newsletter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func (h handler) Subscribe(w http.ResponseWriter, r *http.Request) {
3232

3333
err = h.usecase.Subscribe(r.Context(), payload.Email)
3434
if err != nil {
35-
resp := utils.CostumErr(err.Error())
35+
resp := utils.CustomErrorResponse(err)
3636
utils.Response(resp, w)
3737
return
3838
}

app/users/delivery/http/login_users.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,21 @@ import (
2323
func (h Handler) Login(w http.ResponseWriter, r *http.Request) {
2424
bodyBytes, err := io.ReadAll(r.Body)
2525
if err != nil {
26-
utils.Response(domain.HttpResponse{
27-
Code: 500,
28-
Message: err.Error(),
29-
}, w)
26+
resp := utils.CustomErrorResponse(err)
27+
utils.Response(resp, w)
3028
return
3129
}
3230

3331
loginInstance := domain.Login{}
3432
if err := json.Unmarshal(bodyBytes, &loginInstance); err != nil {
35-
utils.Response(domain.HttpResponse{
36-
Code: 500,
37-
Message: err.Error(),
38-
}, w)
33+
resp := utils.CustomErrorResponse(err)
34+
utils.Response(resp, w)
3935
return
4036
}
4137

4238
_, token, err := h.usecase.Login(r.Context(), loginInstance)
4339
if err != nil {
44-
resp := utils.CostumErr(err.Error())
40+
resp := utils.CustomErrorResponse(err)
4541
utils.Response(resp, w)
4642
return
4743
}

app/users/delivery/http/logout_users.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func (h Handler) Logout(w http.ResponseWriter, r *http.Request) {
2222

2323
err := h.usecase.Logout(r.Context(), *token)
2424
if err != nil {
25-
resp := utils.CostumErr(err.Error())
25+
resp := utils.CustomErrorResponse(err)
2626
utils.Response(resp, w)
2727
return
2828
}

app/users/delivery/http/register_users.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,36 +25,30 @@ import (
2525
func (h Handler) Register(w http.ResponseWriter, r *http.Request) {
2626
bodyBytes, err := io.ReadAll(r.Body)
2727
if err != nil {
28-
utils.Response(domain.HttpResponse{
29-
Code: 500,
30-
Message: err.Error(),
31-
}, w)
28+
resp := utils.CustomErrorResponse(err)
29+
utils.Response(resp, w)
3230
return
3331
}
3432

3533
user := domain.Register{}
3634
if err = json.Unmarshal(bodyBytes, &user); err != nil {
37-
utils.Response(domain.HttpResponse{
38-
Code: 500,
39-
Message: err.Error(),
40-
}, w)
35+
resp := utils.CustomErrorResponse(err)
36+
utils.Response(resp, w)
4137
return
4238
}
4339

4440
if user.Password != user.ConfirmPassword {
45-
utils.Response(domain.HttpResponse{
46-
Code: 400,
47-
Message: "Confirm password doesnt match",
48-
Data: nil,
49-
}, w)
41+
err := utils.NewBadRequestError(r.Context(), "Confirm password doesn't match", nil)
42+
resp := utils.CustomErrorResponse(err)
43+
utils.Response(resp, w)
5044
return
5145
}
5246

5347
userInput := domain.RegistToUser(user)
5448
_, err = h.usecase.Register(r.Context(), userInput)
5549
if err != nil {
5650
logrus.Error("userUsecase: failed to register user")
57-
resp := utils.CostumErr(err.Error())
51+
resp := utils.CustomErrorResponse(err)
5852
utils.Response(resp, w)
5953
return
6054
}

app/users/usecase/login_users.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@ import (
44
"context"
55

66
"github.com/hammer-code/lms-be/domain"
7-
"github.com/sirupsen/logrus"
7+
"github.com/hammer-code/lms-be/utils"
88
"golang.org/x/crypto/bcrypt"
99
)
1010

1111
func (us *usecase) Login(ctx context.Context, userReq domain.Login) (user domain.User, token string, err error) {
1212
err = us.dbTX.StartTransaction(ctx, func(txCtx context.Context) error {
1313
user, err = us.userRepo.FindByEmail(ctx, userReq.Email)
1414
if err != nil {
15-
logrus.Error("us.LoginUser: failed to login", err)
15+
err = utils.NewInternalServerError(ctx, err)
1616
return err
1717
}
1818

1919
if err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(userReq.Password)); err != nil {
20-
logrus.Error("us.Login: invalid password")
20+
err = utils.NewBadRequestError(ctx, "Email or Password is invalid", err)
2121
return err
2222
}
2323

@@ -26,24 +26,24 @@ func (us *usecase) Login(ctx context.Context, userReq domain.Login) (user domain
2626
token = *tokenPtr
2727

2828
if err != nil {
29-
logrus.Error("us.Login: failed to login. ", err)
29+
err = utils.NewInternalServerError(ctx, err)
3030
return err
3131
}
3232

3333
if err = us.userRepo.UnactivateTokenByUser(ctx, user.ID); err != nil {
34-
logrus.Error("us.Login: failed to login. ", err)
34+
err = utils.NewInternalServerError(ctx, err)
3535
return err
3636
}
3737
if err = us.userRepo.StoreToken(ctx, token, expiredTime, user.ID); err != nil {
38-
logrus.Error("us.Login: failed to login. ", err)
38+
err = utils.NewInternalServerError(ctx, err)
3939
return err
4040
}
4141

4242
return nil
4343
})
4444

4545
if err != nil {
46-
logrus.Error("us.Login: failed to login. ", err)
46+
err = utils.NewInternalServerError(ctx, err)
4747
return
4848
}
4949

app/users/usecase/logout_users.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
package usecase
22

3-
import "context"
3+
import (
4+
"context"
5+
6+
"github.com/hammer-code/lms-be/utils"
7+
)
48

59
func (us *usecase) Logout(ctx context.Context, token string) error {
610
jwtData, err := us.jwt.VerifyToken(token)
711
if err != nil {
12+
err = utils.NewInternalServerError(ctx, err)
813
return err
914
}
1015

11-
return us.userRepo.LogoutUser(ctx, token, jwtData.ExpiresAt.Time)
16+
err = us.userRepo.LogoutUser(ctx, token, jwtData.ExpiresAt.Time)
17+
if err != nil {
18+
err = utils.NewInternalServerError(ctx, err)
19+
return err
20+
}
21+
return err
1222
}

app/users/usecase/register_users.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,34 @@ import (
55

66
"github.com/hammer-code/lms-be/constants"
77
"github.com/hammer-code/lms-be/domain"
8-
"github.com/sirupsen/logrus"
8+
"github.com/hammer-code/lms-be/utils"
99
"golang.org/x/crypto/bcrypt"
1010
)
1111

1212
func (us *usecase) Register(ctx context.Context, userReq domain.User) (domain.User, error) {
1313
user := domain.User{}
14-
if err := us.dbTX.StartTransaction(ctx, func(txCtx context.Context) error {
14+
err := us.dbTX.StartTransaction(ctx, func(txCtx context.Context) error {
1515
hashPassword, err := bcrypt.GenerateFromPassword([]byte(userReq.Password), bcrypt.DefaultCost)
1616
if err != nil {
17-
logrus.Error("us.Register: failed to register user", err)
17+
err = utils.NewInternalServerError(ctx, err)
1818
return err
1919
}
2020

2121
userReq.Password = string(hashPassword)
2222
userReq.Role = constants.RoleUser
2323
user, err = us.userRepo.CreateUser(ctx, userReq)
2424
if err != nil {
25-
logrus.Error("us.Register: failed to register users. ", err)
26-
25+
err = utils.NewInternalServerError(ctx, err)
2726
return err
2827
}
2928
return nil
3029

31-
}); err != nil {
32-
logrus.Error("us.Register: failed to get users. ", err)
30+
})
31+
32+
if err != nil {
33+
err = utils.NewInternalServerError(ctx, err)
3334
return domain.User{}, err
3435
}
36+
3537
return user, nil
3638
}

utils/costum_error.go

Lines changed: 74 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,63 @@
11
package utils
22

33
import (
4+
"context"
5+
"fmt"
6+
"net/http"
47
"strings"
58

69
"github.com/hammer-code/lms-be/domain"
10+
"github.com/hammer-code/lms-be/pkg/ngelog"
711
)
812

9-
func CheckError(err, sub, message string, code int) (domain.HttpResponse, bool) {
13+
const (
14+
ErrDuplicateEmail = "\"uni_users_email\" (SQLSTATE 23505)"
15+
ErrWrongPassword = "password"
16+
ErrNotFoundSQL = "sql: no rows in result set"
17+
)
18+
19+
type CustomHttpError struct {
20+
Code int
21+
Message string
22+
OriginError error
23+
}
24+
25+
func (e *CustomHttpError) Error() string {
26+
if e.OriginError != nil {
27+
return fmt.Sprintf("%s: %s", e.Message, e.OriginError.Error())
28+
}
29+
return e.Message
30+
}
1031

11-
if strings.Contains(err, sub) {
32+
func NewBadRequestError(ctx context.Context, msg string, err error) *CustomHttpError {
33+
ngelog.Error(ctx, msg, err)
34+
return &CustomHttpError{
35+
Code: http.StatusBadRequest,
36+
Message: msg,
37+
OriginError: err,
38+
}
39+
}
40+
41+
func NewUnauthorizedError(ctx context.Context, msg string, err error) *CustomHttpError {
42+
ngelog.Error(ctx, msg, err)
43+
return &CustomHttpError{
44+
Code: http.StatusUnauthorized,
45+
Message: msg,
46+
OriginError: err,
47+
}
48+
}
49+
50+
func NewInternalServerError(ctx context.Context, err error) *CustomHttpError {
51+
ngelog.Error(ctx, "Internal server error", err)
52+
return &CustomHttpError{
53+
Code: http.StatusInternalServerError,
54+
Message: "Internal server error",
55+
OriginError: err,
56+
}
57+
}
58+
59+
func CheckError(errStr, containsStr, message string, code int) (domain.HttpResponse, bool) {
60+
if strings.Contains(errStr, containsStr) {
1261
return domain.HttpResponse{
1362
Code: code,
1463
Message: message,
@@ -17,25 +66,35 @@ func CheckError(err, sub, message string, code int) (domain.HttpResponse, bool)
1766
return domain.HttpResponse{}, false
1867
}
1968

20-
func CostumErr(err string) domain.HttpResponse {
69+
func CustomErrorResponse(err error) domain.HttpResponse {
70+
if customErr, ok := err.(*CustomHttpError); ok {
71+
var errStr string
72+
if customErr.OriginError != nil {
73+
errStr = customErr.OriginError.Error()
74+
}
75+
resp, ok := CheckError(errStr, ErrDuplicateEmail, "User already exist", http.StatusBadRequest)
76+
if ok {
77+
return resp
78+
}
2179

22-
resp, ok := CheckError(err, "\"uni_users_email\" (SQLSTATE 23505)", "User already exist", 400)
23-
if ok {
24-
return resp
25-
}
80+
resp, ok = CheckError(errStr, ErrWrongPassword, "Sorry, your password is incorrect", http.StatusBadRequest)
81+
if ok {
82+
return resp
83+
}
2684

27-
resp, ok = CheckError(err, "\"uni_logout_token\" (SQLSTATE 23505)", "You have already logged out.", 400)
28-
if ok {
29-
return resp
30-
}
85+
resp, ok = CheckError(errStr, ErrNotFoundSQL, "Data not found", http.StatusNotFound)
86+
if ok {
87+
return resp
88+
}
3189

32-
resp, ok = CheckError(err, "password", "Sorry, your password is incorrect", 400)
33-
if ok {
34-
return resp
90+
return domain.HttpResponse{
91+
Code: customErr.Code,
92+
Message: customErr.Message,
93+
}
3594
}
3695

3796
return domain.HttpResponse{
38-
Code: 400,
97+
Code: http.StatusInternalServerError,
3998
Message: "Internal server error",
4099
}
41100

0 commit comments

Comments
 (0)