Skip to content

Commit

Permalink
factorisations of some part of the code
Browse files Browse the repository at this point in the history
  • Loading branch information
makhlouf1102 committed Jan 5, 2025
1 parent 488037f commit 52eb968
Show file tree
Hide file tree
Showing 7 changed files with 118 additions and 94 deletions.
90 changes: 8 additions & 82 deletions handlers/auth/auth.go
Original file line number Diff line number Diff line change
@@ -1,63 +1,28 @@
package auth
package authHandler

import (
"encoding/json"
"errors"
"fmt"
"lets-go/libs/bcrypt"
commonerrors "lets-go/libs/commonErrors"
"lets-go/libs/env"
localconstants "lets-go/libs/localConstants"
loglib "lets-go/libs/logLib"
"lets-go/libs/token"
role_model "lets-go/models/role"
user_model "lets-go/models/user"
userModel "lets-go/models/user"
user_role_model "lets-go/models/user_role"
localTypes "lets-go/types"
"net/http"
"reflect"

"github.com/google/uuid"
)

type Model interface {
Create() error
Delete() error
CheckDuplicate() (bool, error)
}

func createModel(model Model) error {
duplicate, err := model.CheckDuplicate()
modelName := reflect.ValueOf(model).Type().String()
var formated string
if err != nil {
formated = fmt.Sprintf("an error occured while checking for duplicates of %s", modelName)
loglib.LogError(formated, err)
return err
}

if duplicate {
formated = fmt.Sprintf("the %s already exists", modelName)
err = errors.New(formated)
loglib.LogError(formated, err)
return err
}

if err := model.Create(); err != nil {
formated = fmt.Sprintf("an error occured while creating %s", modelName)
loglib.LogError(formated, err)
return err
}

return nil
}

func Register(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()

var dataObj localTypes.RegisterRequestData

if err := json.NewDecoder(r.Body).Decode(&dataObj); err != nil {
http.Error(w, "invalid Json format", http.StatusBadRequest)
commonerrors.DencodingError(w, err)
return
}

Expand All @@ -69,7 +34,7 @@ func Register(w http.ResponseWriter, r *http.Request) {
return
}

user := &user_model.User{
user := &userModel.User{
ID: uuid.New().String(),
Username: dataObj.Username,
Email: dataObj.Email,
Expand Down Expand Up @@ -114,57 +79,19 @@ func Register(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)

if err := json.NewEncoder(w).Encode(response); err != nil {
loglib.LogError("error while encoding response", err)
http.Error(w, localconstants.SERVER_ERROR, http.StatusInternalServerError)
commonerrors.EncodingError(w, err)
return
}

}

func validateUser(dataObj *localTypes.LoginRequestData) (*user_model.User, error) {
user, err := user_model.GetByEmail(dataObj.Email)
if err != nil {
loglib.LogError("the e-mail doesn't exist", err)
return nil, err
}

if !bcrypt.CheckPasswordHash(dataObj.Password, user.Password) {
loglib.LogError("wrong password", nil)
return nil, errors.New("wrong password")
}

return user, nil
}

type Tokens struct {
accessToken string
refreshToken string
}

func generateTokens(userID string, listRoles []string) (*Tokens, error) {
accessToken, err := token.CreateAccessToken(userID, listRoles)

if err != nil {
loglib.LogError("error while creating access token", err)
return nil, err
}

refreshToken, err := token.CreateRefreshToken(userID, listRoles)
if err != nil {
loglib.LogError("error while creating refresh token", err)
return nil, err
}

return &Tokens{accessToken, refreshToken}, nil
}

func Login(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()

var dataObj localTypes.LoginRequestData

if err := json.NewDecoder(r.Body).Decode(&dataObj); err != nil {
http.Error(w, "invalid Json format", http.StatusBadRequest)
commonerrors.DencodingError(w, err)
return
}

Expand Down Expand Up @@ -232,8 +159,7 @@ func Login(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)

if err := json.NewEncoder(w).Encode(response); err != nil {
loglib.LogError("error while encoding response", err)
http.Error(w, localconstants.SERVER_ERROR, http.StatusInternalServerError)
commonerrors.EncodingError(w, err)
return
}
}
81 changes: 81 additions & 0 deletions handlers/auth/helperFunctions.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package authHandler

import (
"errors"
"fmt"
"lets-go/libs/bcrypt"
loglib "lets-go/libs/logLib"
"lets-go/libs/token"
userModel "lets-go/models/user"
localTypes "lets-go/types"
"reflect"
)

type Model interface {
Create() error
Delete() error
CheckDuplicate() (bool, error)
}

func createModel(model Model) error {
duplicate, err := model.CheckDuplicate()
modelName := reflect.ValueOf(model).Type().String()
var formated string
if err != nil {
formated = fmt.Sprintf("an error occured while checking for duplicates of %s", modelName)
loglib.LogError(formated, err)
return err
}

if duplicate {
formated = fmt.Sprintf("the %s already exists", modelName)
err = errors.New(formated)
loglib.LogError(formated, err)
return err
}

if err := model.Create(); err != nil {
formated = fmt.Sprintf("an error occured while creating %s", modelName)
loglib.LogError(formated, err)
return err
}

return nil
}

func validateUser(dataObj *localTypes.LoginRequestData) (*userModel.User, error) {
user, err := userModel.GetByEmail(dataObj.Email)
if err != nil {
loglib.LogError("the e-mail doesn't exist", err)
return nil, err
}

if !bcrypt.CheckPasswordHash(dataObj.Password, user.Password) {
loglib.LogError("wrong password", nil)
return nil, errors.New("wrong password")
}

return user, nil
}

type Tokens struct {
accessToken string
refreshToken string
}

func generateTokens(userID string, listRoles []string) (*Tokens, error) {
accessToken, err := token.CreateAccessToken(userID, listRoles)

if err != nil {
loglib.LogError("error while creating access token", err)
return nil, err
}

refreshToken, err := token.CreateRefreshToken(userID, listRoles)
if err != nil {
loglib.LogError("error while creating refresh token", err)
return nil, err
}

return &Tokens{accessToken, refreshToken}, nil
}
16 changes: 16 additions & 0 deletions libs/commonErrors/commonErrors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package commonerrors

import (
localconstants "lets-go/libs/localConstants"
loglib "lets-go/libs/logLib"
"net/http"
)

func EncodingError(responseWriter http.ResponseWriter, err error) {
loglib.LogError("error while encoding response", err)
http.Error(responseWriter, localconstants.SERVER_ERROR, http.StatusInternalServerError)
}

func DencodingError(responseWriter http.ResponseWriter, err error) {
http.Error(responseWriter, localconstants.INVALID_JSON_FORMAT, http.StatusBadRequest)
}
5 changes: 3 additions & 2 deletions libs/localConstants/errors.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package localconstants

const (
SERVER_ERROR = "server error"
UNAUTHORIZED = "unauthorized"
SERVER_ERROR = "server error"
UNAUTHORIZED = "unauthorized"
INVALID_JSON_FORMAT = "invalid Json format"
)
2 changes: 1 addition & 1 deletion models/user/user.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package user_model
package userModel

import (
"fmt"
Expand Down
2 changes: 1 addition & 1 deletion models/user/user_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// models/user/user_test.go
package user_model
package userModel

import (
"os"
Expand Down
16 changes: 8 additions & 8 deletions types/localTypes.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package localTypes

import user_model "lets-go/models/user"
import userModel "lets-go/models/user"

type ProgrammingLanguage struct {
Name string
Expand All @@ -15,9 +15,9 @@ type RegisterRequestData struct {
}

type RegisterResponseData struct {
Status string `json:"status"`
Message string `json:"message"`
Data *user_model.User `json:"data"`
Status string `json:"status"`
Message string `json:"message"`
Data *userModel.User `json:"data"`
}

type LoginRequestData struct {
Expand All @@ -26,8 +26,8 @@ type LoginRequestData struct {
}

type LoginResponseData struct {
Status string `json:"status"`
Message string `json:"message"`
AccessToken string `json:"accessToken"`
Data *user_model.User `json:"data"`
Status string `json:"status"`
Message string `json:"message"`
AccessToken string `json:"accessToken"`
Data *userModel.User `json:"data"`
}

0 comments on commit 52eb968

Please sign in to comment.