auth.*UseCase.RefreshToken   A
last analyzed

Complexity

Conditions 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 5
nop 1
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
package auth
2
3
import (
4
	"strings"
5
6
	"github.com/memnix/memnix-rest/domain"
7
	"github.com/memnix/memnix-rest/internal/user"
8
	"github.com/memnix/memnix-rest/pkg/jwt"
9
	"github.com/pkg/errors"
10
	"golang.org/x/crypto/bcrypt"
11
)
12
13
type UseCase struct {
14
	user.IRepository
15
}
16
17
func NewUseCase(repo user.IRepository) IUseCase {
18
	return &UseCase{IRepository: repo}
19
}
20
21
// Login logs in a user
22
// Returns a token and error
23
func (a *UseCase) Login(password string, email string) (string, error) {
24
	userModel, err := a.GetByEmail(email)
25
	if err != nil {
26
		return "", errors.New("user not found")
27
	}
28
29
	ok, err := ComparePasswords(password, []byte(userModel.Password))
30
	if errors.Is(err, bcrypt.ErrMismatchedHashAndPassword) || !ok {
31
		return "", errors.New("invalid password")
32
	}
33
	if err != nil {
34
		return "", err
35
	}
36
37
	token, err := jwt.GenerateToken(userModel.ID)
38
	if err != nil {
39
		return "", err
40
	}
41
42
	return token, nil
43
}
44
45
// Register registers a new user
46
// Returns an error
47
func (a *UseCase) Register(user domain.User) (domain.User, error) {
48
	if err := VerifyPassword(user.Password); err != nil {
49
		return domain.User{}, errors.Wrap(err, "Verify password failed")
50
	}
51
52
	hash, err := GenerateEncryptedPassword(user.Password)
53
	if err != nil {
54
		return domain.User{}, errors.Wrap(err, "Generate encrypted password failed")
55
	}
56
57
	user.Password = string(hash)
58
	user.Email = strings.ToLower(user.Email)
59
60
	if err = a.Create(&user); err != nil {
61
		return domain.User{}, errors.Wrap(err, "failed to create user in register")
62
	}
63
64
	newUser, err := a.GetByEmail(user.Email)
65
	if err != nil {
66
		return domain.User{}, errors.Wrap(err, "failed to get user in register")
67
	}
68
69
	return newUser, nil
70
}
71
72
// Logout returns an empty string
73
// It might be used to invalidate a token in the future
74
func (a *UseCase) Logout() (string, error) {
75
	return "", nil
76
}
77
78
// RefreshToken refreshes a token
79
func (a *UseCase) RefreshToken(user domain.User) (string, error) {
80
	token, err := jwt.GenerateToken(user.ID)
81
	if err != nil {
82
		return "", err
83
	}
84
85
	return token, nil
86
}
87