From b34d6b294f06070ecd10ffea51160568bc6f1dab Mon Sep 17 00:00:00 2001 From: "spam.harun0813@gmail.com" Date: Wed, 23 Sep 2020 07:13:05 +0700 Subject: [PATCH 1/2] improving token config and create bindingJSON utils --- config/token.go | 25 +++++++++++++++++++++++++ controllers/testing/test_handler.go | 12 +++++++----- middleware/token.go | 4 ++-- models/response/model.go | 12 ------------ models/token/token.go | 8 +++++--- utils/bind/bind.go | 23 +++++++++++++++++++++++ {models => utils}/response/response.go | 9 +++++++++ 7 files changed, 71 insertions(+), 22 deletions(-) create mode 100644 config/token.go delete mode 100644 models/response/model.go create mode 100644 utils/bind/bind.go rename {models => utils}/response/response.go (64%) diff --git a/config/token.go b/config/token.go new file mode 100644 index 0000000..69c252a --- /dev/null +++ b/config/token.go @@ -0,0 +1,25 @@ +package config + +import ( + "github.com/joho/godotenv" + "os" +) + +type TokenENV struct { + JWTSecret string +} + +type TokenENVInterface interface { + BuildTokenConfig() error +} + +func (te *TokenENV) BuildTokenConfig() (*TokenENV, error) { + // load .env file + if err := godotenv.Load(".env"); err != nil { + return nil, err + } + + return &TokenENV{ + JWTSecret: os.Getenv("JWT_SECRET"), + }, nil +} diff --git a/controllers/testing/test_handler.go b/controllers/testing/test_handler.go index f910862..fd8bc2e 100644 --- a/controllers/testing/test_handler.go +++ b/controllers/testing/test_handler.go @@ -1,15 +1,17 @@ package testing import ( - "github.com/divisi-developer-poros/poros-web-backend/models/response" "github.com/divisi-developer-poros/poros-web-backend/models/token" + "github.com/divisi-developer-poros/poros-web-backend/utils/bind" + "github.com/divisi-developer-poros/poros-web-backend/utils/response" "github.com/gin-gonic/gin" "net/http" ) type Cobs struct { - Res response.Response - Token token.JWTToken + Res response.Response + Binding bind.Binding + Token token.JWTToken } type TestInterface interface { @@ -31,8 +33,8 @@ type UserTesting struct { func (cobs *Cobs) Login(c *gin.Context) { var userCobs UserTesting - if err := c.BindJSON(&userCobs); err != nil { - cobs.Res.CustomResponse(c, "Content-Type", "application/json", "error", "failed when parsing data", http.StatusBadRequest, nil) + if err := cobs.Binding.BindingJSON(c, &userCobs); err != nil { + cobs.Res.CustomResponse(c, "Content-Type", "application/json", "error", "failed when binding data", http.StatusBadRequest, nil) return } diff --git a/middleware/token.go b/middleware/token.go index d107329..4d0d503 100644 --- a/middleware/token.go +++ b/middleware/token.go @@ -2,8 +2,8 @@ package middleware import ( "fmt" - "github.com/divisi-developer-poros/poros-web-backend/models/response" jt "github.com/divisi-developer-poros/poros-web-backend/models/token" + "github.com/divisi-developer-poros/poros-web-backend/utils/response" "github.com/gin-gonic/gin" "net/http" "strings" @@ -11,7 +11,7 @@ import ( type TokenMiddleware struct { ResponseEntity response.Response - JWT jt.JWTToken + JWT jt.JWTToken } func (tm *TokenMiddleware) AuthorizeToken(c *gin.Context) { diff --git a/models/response/model.go b/models/response/model.go deleted file mode 100644 index bdba25b..0000000 --- a/models/response/model.go +++ /dev/null @@ -1,12 +0,0 @@ -package response - -import "github.com/gin-gonic/gin" - -type Response struct {} - -type ResInterface interface { - CustomResponse(c *gin.Context, - key, value, status, message string, - httpStatus int, - data interface{}) -} \ No newline at end of file diff --git a/models/token/token.go b/models/token/token.go index 98f0279..31cf0c9 100644 --- a/models/token/token.go +++ b/models/token/token.go @@ -3,10 +3,12 @@ package token import ( "errors" "github.com/dgrijalva/jwt-go" - "os" + "github.com/divisi-developer-poros/poros-web-backend/config" "time" ) +var EnvironmentToken config.TokenENV + func (jt *JWTToken) GenerateToken(userName string, userType int) (string, error) { return jwt.NewWithClaims(jwt.SigningMethodHS256, &JWTToken{ Username: userName, @@ -16,7 +18,7 @@ func (jt *JWTToken) GenerateToken(userName string, userType int) (string, error) Issuer: "poros", IssuedAt: time.Now().Unix(), }, - }).SignedString([]byte(os.Getenv("JWT_SECRET"))) + }).SignedString([]byte(EnvironmentToken.JWTSecret)) } func (jt *JWTToken) TokenValidation(encodedToken string) (*jwt.Token, error) { @@ -25,7 +27,7 @@ func (jt *JWTToken) TokenValidation(encodedToken string) (*jwt.Token, error) { if _, valid := token.Method.(*jwt.SigningMethodHMAC); !valid { return nil, errors.New("invalid token") } else { - return []byte(os.Getenv("JWT_SECRET")), nil + return []byte(EnvironmentToken.JWTSecret), nil } }) } diff --git a/utils/bind/bind.go b/utils/bind/bind.go new file mode 100644 index 0000000..128cdef --- /dev/null +++ b/utils/bind/bind.go @@ -0,0 +1,23 @@ +package bind + +import ( + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" + "net/http" +) + +type Binding struct{} + +type BindingInterface interface { + BindingJSON(c gin.Context, obj interface{}) error +} + +func (b *Binding) BindingJSON(c *gin.Context, obj interface{}) error { + if err := c.ShouldBindWith(obj, binding.JSON); err != nil { + if err := c.AbortWithError(http.StatusBadRequest, err).SetType(gin.ErrorTypeBind); err != nil { + return err + } + return err + } + return nil +} diff --git a/models/response/response.go b/utils/response/response.go similarity index 64% rename from models/response/response.go rename to utils/response/response.go index 1d27689..0dc5566 100644 --- a/models/response/response.go +++ b/utils/response/response.go @@ -2,6 +2,15 @@ package response import "github.com/gin-gonic/gin" +type Response struct{} + +type ResInterface interface { + CustomResponse(c *gin.Context, + key, value, status, message string, + httpStatus int, + data interface{}) +} + func (r *Response) CustomResponse(c *gin.Context, key, value, status, message string, httpStatus int, From 08d9e611682c2c442e544cede66655ed0610504c Mon Sep 17 00:00:00 2001 From: "spam.harun0813@gmail.com" Date: Fri, 25 Sep 2020 05:00:07 +0700 Subject: [PATCH 2/2] deleting bind utils --- controllers/testing/test_handler.go | 4 +--- models/token/token.go | 1 - utils/bind/bind.go | 23 ----------------------- 3 files changed, 1 insertion(+), 27 deletions(-) delete mode 100644 utils/bind/bind.go diff --git a/controllers/testing/test_handler.go b/controllers/testing/test_handler.go index fd8bc2e..13b38f4 100644 --- a/controllers/testing/test_handler.go +++ b/controllers/testing/test_handler.go @@ -2,7 +2,6 @@ package testing import ( "github.com/divisi-developer-poros/poros-web-backend/models/token" - "github.com/divisi-developer-poros/poros-web-backend/utils/bind" "github.com/divisi-developer-poros/poros-web-backend/utils/response" "github.com/gin-gonic/gin" "net/http" @@ -10,7 +9,6 @@ import ( type Cobs struct { Res response.Response - Binding bind.Binding Token token.JWTToken } @@ -33,7 +31,7 @@ type UserTesting struct { func (cobs *Cobs) Login(c *gin.Context) { var userCobs UserTesting - if err := cobs.Binding.BindingJSON(c, &userCobs); err != nil { + if err := c.ShouldBindJSON(c); err != nil { cobs.Res.CustomResponse(c, "Content-Type", "application/json", "error", "failed when binding data", http.StatusBadRequest, nil) return } diff --git a/models/token/token.go b/models/token/token.go index 31cf0c9..5ffd659 100644 --- a/models/token/token.go +++ b/models/token/token.go @@ -23,7 +23,6 @@ func (jt *JWTToken) GenerateToken(userName string, userType int) (string, error) func (jt *JWTToken) TokenValidation(encodedToken string) (*jwt.Token, error) { return jwt.Parse(encodedToken, func(token *jwt.Token) (interface{}, error) { - //return signingKey, nil if _, valid := token.Method.(*jwt.SigningMethodHMAC); !valid { return nil, errors.New("invalid token") } else { diff --git a/utils/bind/bind.go b/utils/bind/bind.go deleted file mode 100644 index 128cdef..0000000 --- a/utils/bind/bind.go +++ /dev/null @@ -1,23 +0,0 @@ -package bind - -import ( - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - "net/http" -) - -type Binding struct{} - -type BindingInterface interface { - BindingJSON(c gin.Context, obj interface{}) error -} - -func (b *Binding) BindingJSON(c *gin.Context, obj interface{}) error { - if err := c.ShouldBindWith(obj, binding.JSON); err != nil { - if err := c.AbortWithError(http.StatusBadRequest, err).SetType(gin.ErrorTypeBind); err != nil { - return err - } - return err - } - return nil -}