This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
backend/internal/auth/usecase/usecase.go
2021-03-06 09:32:15 +01:00

85 lines
2.2 KiB
Go

package usecase
import (
"context"
"fmt"
"github.com/zdam-egzamin-zawodowy/backend/internal/auth"
"github.com/zdam-egzamin-zawodowy/backend/internal/auth/jwt"
"github.com/zdam-egzamin-zawodowy/backend/internal/models"
"github.com/zdam-egzamin-zawodowy/backend/internal/user"
errorutils "github.com/zdam-egzamin-zawodowy/backend/pkg/utils/error"
)
type usecase struct {
userRepository user.Repository
tokenGenerator jwt.TokenGenerator
}
type Config struct {
UserRepository user.Repository
TokenGenerator jwt.TokenGenerator
}
func New(cfg *Config) (auth.Usecase, error) {
if cfg == nil || cfg.UserRepository == nil {
return nil, fmt.Errorf("user/usecase: UserRepository is required")
}
return &usecase{
cfg.UserRepository,
cfg.TokenGenerator,
}, nil
}
func (ucase *usecase) SignIn(ctx context.Context, email, password string, staySignedIn bool) (*models.User, string, error) {
user, err := ucase.GetUserByCredentials(ctx, email, password)
if err != nil {
return nil, "", err
}
token, err := ucase.tokenGenerator.Generate(jwt.Metadata{
StaySignedIn: staySignedIn,
Credentials: jwt.Credentials{
Email: user.Email,
Password: user.Password,
},
})
if err != nil {
return nil, "", errorutils.Wrap(err, messageInvalidCredentials)
}
return user, token, nil
}
func (ucase *usecase) ExtractAccessTokenMetadata(ctx context.Context, accessToken string) (*models.User, error) {
metadata, err := ucase.tokenGenerator.ExtractAccessTokenMetadata(accessToken)
if err != nil {
return nil, errorutils.Wrap(err, messageInvalidAccessToken)
}
return ucase.GetUserByCredentials(ctx, metadata.Credentials.Email, metadata.Credentials.Password)
}
func (ucase *usecase) GetUserByCredentials(ctx context.Context, email, password string) (*models.User, error) {
users, _, err := ucase.userRepository.Fetch(ctx, &user.FetchConfig{
Limit: 1,
Count: false,
Filter: &models.UserFilter{
Email: []string{email},
},
})
if err != nil {
return nil, err
}
if len(users) <= 0 {
return nil, fmt.Errorf(messageInvalidCredentials)
}
user := users[0]
if err := user.CompareHashAndPassword(password); err != nil {
return nil, fmt.Errorf(messageInvalidCredentials)
}
return user, nil
}