Skip to content

Commit

Permalink
Error codes
Browse files Browse the repository at this point in the history
  • Loading branch information
UnicoYal committed Sep 25, 2024
1 parent 19e8f70 commit cb2ac39
Show file tree
Hide file tree
Showing 7 changed files with 37 additions and 25 deletions.
2 changes: 2 additions & 0 deletions internal/app/handlers/auth/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ func Login(ctx context.Context, api *api.Implementation, next http.Handler) http

loginResp, errResp := api.Login(ctx, loginData)
if errResp != nil {
w.WriteHeader(errResp.StatusCode)
json.NewEncoder(w).Encode(errResp)
return
}
Expand All @@ -47,6 +48,7 @@ func Register(ctx context.Context, api *api.Implementation, next http.Handler) h

regResp, errResp := api.Register(ctx, registerData)
if errResp != nil {
w.WriteHeader(errResp.StatusCode)
json.NewEncoder(w).Encode(errResp)
return
}
Expand Down
5 changes: 3 additions & 2 deletions internal/app/models/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@ type User struct {
}

type ErrorResponse struct {
Success bool `json:"success"`
Errors []errVals.ErrorObj `json:"errors"`
Success bool `json:"success"`
StatusCode int `json:"-"`
Errors []errVals.ErrorObj `json:"errors"`
}

type AuthResponse struct {
Expand Down
13 changes: 7 additions & 6 deletions internal/app/repository/login.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@ package repository
import (
"context"
"database/sql"
"net/http"

errVals "github.com/go-park-mail-ru/2024_2_GOATS/internal/app/errors"
"github.com/go-park-mail-ru/2024_2_GOATS/internal/app/models"
"github.com/go-park-mail-ru/2024_2_GOATS/internal/app/models/cookie"
"golang.org/x/crypto/bcrypt"
)

func (r *Repo) Login(ctx context.Context, loginData *models.LoginData) (*models.Token, *errVals.ErrorObj) {
func (r *Repo) Login(ctx context.Context, loginData *models.LoginData) (*models.Token, *errVals.ErrorObj, int) {
var user models.User
err := r.Database.QueryRowContext(
ctx,
Expand All @@ -19,20 +20,20 @@ func (r *Repo) Login(ctx context.Context, loginData *models.LoginData) (*models.

if err != nil {
if err == sql.ErrNoRows {
return nil, errVals.NewErrorObj(errVals.ErrUserNotFoundCode, errVals.ErrUserNotFoundText)
return nil, errVals.NewErrorObj(errVals.ErrUserNotFoundCode, errVals.ErrUserNotFoundText), http.StatusNotFound
}
return nil, errVals.NewErrorObj(errVals.ErrServerCode, errVals.CustomError{Err: err})
return nil, errVals.NewErrorObj(errVals.ErrServerCode, errVals.CustomError{Err: err}), http.StatusUnprocessableEntity
}

err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(loginData.Password))
if err != nil {
return nil, errVals.NewErrorObj(errVals.ErrInvalidPasswordCode, errVals.ErrInvalidPasswordsMatchText)
return nil, errVals.NewErrorObj(errVals.ErrInvalidPasswordCode, errVals.ErrInvalidPasswordsMatchText), http.StatusConflict
}

token, err := cookie.GenerateToken(ctx, user.Id)
if err != nil {
return nil, errVals.NewErrorObj(errVals.ErrGenerateTokenCode, errVals.CustomError{Err: err})
return nil, errVals.NewErrorObj(errVals.ErrGenerateTokenCode, errVals.CustomError{Err: err}), http.StatusInternalServerError
}

return token, nil
return token, nil, http.StatusOK
}
11 changes: 6 additions & 5 deletions internal/app/repository/register.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,18 @@ package repository

import (
"context"
"net/http"

errVals "github.com/go-park-mail-ru/2024_2_GOATS/internal/app/errors"
"github.com/go-park-mail-ru/2024_2_GOATS/internal/app/models"
"github.com/go-park-mail-ru/2024_2_GOATS/internal/app/models/cookie"
"github.com/go-park-mail-ru/2024_2_GOATS/internal/app/repository/password"
)

func (r *Repo) Register(ctx context.Context, registerData *models.RegisterData) (*models.Token, *errVals.ErrorObj) {
func (r *Repo) Register(ctx context.Context, registerData *models.RegisterData) (*models.Token, *errVals.ErrorObj, int) {
hashPass, err := password.HashAndSalt(registerData.Password)
if err != nil {
return nil, errVals.NewErrorObj(errVals.ErrInvalidPasswordCode, errVals.CustomError{Err: err})
return nil, errVals.NewErrorObj(errVals.ErrInvalidPasswordCode, errVals.CustomError{Err: err}), http.StatusUnprocessableEntity
}

sqlStatement := `
Expand All @@ -23,13 +24,13 @@ func (r *Repo) Register(ctx context.Context, registerData *models.RegisterData)
usr := models.User{}
err = r.Database.QueryRowContext(ctx, sqlStatement, registerData.Email, registerData.Username, hashPass).Scan(&usr.Id)
if err != nil {
return nil, errVals.NewErrorObj(errVals.ErrCreateUserCode, errVals.CustomError{Err: err})
return nil, errVals.NewErrorObj(errVals.ErrCreateUserCode, errVals.CustomError{Err: err}), http.StatusConflict
}

token, err := cookie.GenerateToken(ctx, usr.Id)
if err != nil {
return nil, errVals.NewErrorObj(errVals.ErrGenerateTokenCode, errVals.CustomError{Err: err})
return nil, errVals.NewErrorObj(errVals.ErrGenerateTokenCode, errVals.CustomError{Err: err}), http.StatusInternalServerError
}

return token, nil
return token, nil, http.StatusOK
}
7 changes: 4 additions & 3 deletions internal/app/service/login.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@ import (
)

func (s *Service) Login(ctx context.Context, loginData *models.LoginData) (*models.AuthResponse, *models.ErrorResponse) {
token, err := s.repository.Login(ctx, loginData)
token, err, code := s.repository.Login(ctx, loginData)

if err != nil {
errors := make([]errors.ErrorObj, 1)
errors[0] = *err

return nil, &models.ErrorResponse{
Success: false,
Errors: errors,
Success: false,
StatusCode: code,
Errors: errors,
}
}
return &models.AuthResponse{
Expand Down
20 changes: 13 additions & 7 deletions internal/app/service/register.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package service

import (
"context"
"net/http"

"github.com/go-park-mail-ru/2024_2_GOATS/internal/app/errors"
errVals "github.com/go-park-mail-ru/2024_2_GOATS/internal/app/errors"
"github.com/go-park-mail-ru/2024_2_GOATS/internal/app/models"
"github.com/go-park-mail-ru/2024_2_GOATS/internal/app/service/validation"
Expand All @@ -23,16 +23,22 @@ func (s *Service) Register(ctx context.Context, registerData *models.RegisterDat

if len(errors) > 0 {
return nil, &models.ErrorResponse{
Success: success,
Errors: errors,
Success: success,
Errors: errors,
StatusCode: http.StatusUnprocessableEntity,
}
}

token, err := s.repository.Register(ctx, registerData)
token, err, code := s.repository.Register(ctx, registerData)
if err != nil {

errors := make([]errVals.ErrorObj, 1)
errors[0] = *err

return nil, &models.ErrorResponse{
Success: false,
Errors: nil,
Success: false,
Errors: errors,
StatusCode: code,
}
}
return &models.AuthResponse{
Expand All @@ -41,7 +47,7 @@ func (s *Service) Register(ctx context.Context, registerData *models.RegisterDat
}, nil
}

func addError(code string, err errors.CustomError, errors *[]errVals.ErrorObj) bool {
func addError(code string, err errVals.CustomError, errors *[]errVals.ErrorObj) bool {
errStruct := errVals.ErrorObj{
Code: code,
Error: err,
Expand Down
4 changes: 2 additions & 2 deletions internal/app/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import (
var _ api.ServiceInterface = (*Service)(nil)

type RepositoryInterface interface {
Login(ctx context.Context, loginData *models.LoginData) (*models.Token, *errVals.ErrorObj)
Register(ctx context.Context, registerData *models.RegisterData) (*models.Token, *errVals.ErrorObj)
Login(ctx context.Context, loginData *models.LoginData) (*models.Token, *errVals.ErrorObj, int)
Register(ctx context.Context, registerData *models.RegisterData) (*models.Token, *errVals.ErrorObj, int)
GetCollection(ctx context.Context)
}

Expand Down

0 comments on commit cb2ac39

Please sign in to comment.