Added repo for dealing with DB and Hashing password to register/login endpoints
This commit is contained in:
@@ -5,14 +5,15 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
db "git.ego.freeddns.org/egommerce/identity-service/pkg/database"
|
||||
entity "git.ego.freeddns.org/egommerce/api-entities/identity/entity"
|
||||
domain "git.ego.freeddns.org/egommerce/identity-service/domain/repository"
|
||||
|
||||
"github.com/go-redis/redis/v8"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
)
|
||||
|
||||
var (
|
||||
AuthService *Auth
|
||||
passSrv *PaswordService
|
||||
|
||||
ErrLoginIncorrect = errors.New("login incorrect")
|
||||
ErrUnableToCacheToken = errors.New("unable to save token in cache")
|
||||
@@ -20,33 +21,40 @@ var (
|
||||
)
|
||||
|
||||
func init() {
|
||||
passSrv = NewPasswordService()
|
||||
}
|
||||
|
||||
type Auth struct {
|
||||
repo *domain.UserRepository
|
||||
db *pgxpool.Pool
|
||||
cache *redis.Client
|
||||
}
|
||||
|
||||
func NewAuthService(db *pgxpool.Pool, cache *redis.Client) *Auth {
|
||||
func NewAuthService(repo *domain.UserRepository, db *pgxpool.Pool, cache *redis.Client) *Auth {
|
||||
return &Auth{
|
||||
repo: repo,
|
||||
db: db,
|
||||
cache: cache,
|
||||
}
|
||||
}
|
||||
|
||||
func (a *Auth) Login(login, passwd string) (string, error) {
|
||||
var id string
|
||||
var id, hashedPasswd string
|
||||
|
||||
sql := `SELECT id FROM identity.users WHERE username=$1 AND password=$2 LIMIT 1`
|
||||
err := a.db.QueryRow(context.Background(), sql, login, passwd).Scan(&id)
|
||||
sql := `SELECT id, password FROM identity.users WHERE username=$1 LIMIT 1`
|
||||
err := a.db.QueryRow(context.Background(), sql, login).Scan(&id, &hashedPasswd)
|
||||
if err != nil {
|
||||
// if err = db.NoRowsInQuerySet(err); err != nil { // FIXME NoRowsInQuerySet error detect
|
||||
// if err = database.NoRowsInQuerySet(err); err != nil {
|
||||
// return "", errors.New("no user found")
|
||||
// }
|
||||
|
||||
return "", ErrLoginIncorrect
|
||||
}
|
||||
|
||||
if err = passSrv.Verify(passwd, hashedPasswd); err != nil {
|
||||
return "", ErrLoginIncorrect
|
||||
}
|
||||
|
||||
accessToken, _ := jwtSrv.CreateAccessToken(id)
|
||||
refreshToken, _ := jwtSrv.CreateRefreshToken(id)
|
||||
if err = a.saveTokensToCache(id, accessToken, refreshToken); err != nil {
|
||||
@@ -74,16 +82,15 @@ func (a *Auth) RefreshToken(accessToken string) (string, error) {
|
||||
}
|
||||
|
||||
func (a *Auth) Register(email, login, passwd string) (string, error) {
|
||||
var id string
|
||||
passwd, _ = passSrv.Hash(passwd)
|
||||
|
||||
sql := `INSERT INTO identity.users(email, username, password) VALUES($1, $2, $3) LIMIT 1 RETURNING id`
|
||||
err := a.db.QueryRow(context.Background(), sql, email, login, passwd).Scan(&id)
|
||||
id, err := a.repo.Create(&entity.User{
|
||||
Email: email,
|
||||
Username: login,
|
||||
Password: passwd,
|
||||
})
|
||||
if err != nil {
|
||||
if err = db.IsDuplicatedRow(err); err != nil {
|
||||
return "", errors.New("username/email is already taken")
|
||||
}
|
||||
|
||||
return "", errors.New("Failed to create new user: " + err.Error())
|
||||
return "", err
|
||||
}
|
||||
|
||||
return id, nil
|
||||
|
||||
Reference in New Issue
Block a user