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

87 lines
2.2 KiB
Go
Raw Normal View History

2021-03-06 08:32:15 +00:00
package usecase
import (
"context"
"github.com/pkg/errors"
2021-07-14 04:58:10 +00:00
2022-09-20 16:46:47 +00:00
"gitea.dwysokinski.me/zdam-egzamin-zawodowy/backend/internal/auth"
"gitea.dwysokinski.me/zdam-egzamin-zawodowy/backend/internal/auth/jwt"
"gitea.dwysokinski.me/zdam-egzamin-zawodowy/backend/internal/model"
"gitea.dwysokinski.me/zdam-egzamin-zawodowy/backend/internal/user"
"gitea.dwysokinski.me/zdam-egzamin-zawodowy/backend/util/errorutil"
2021-03-06 08:32:15 +00:00
)
type Config struct {
UserRepository user.Repository
2021-07-14 05:13:51 +00:00
TokenGenerator *jwt.TokenGenerator
2021-03-06 08:32:15 +00:00
}
2021-07-14 05:13:51 +00:00
type Usecase struct {
userRepository user.Repository
tokenGenerator *jwt.TokenGenerator
}
var _ auth.Usecase = &Usecase{}
func New(cfg *Config) (*Usecase, error) {
2021-03-06 08:32:15 +00:00
if cfg == nil || cfg.UserRepository == nil {
2021-05-14 13:34:26 +00:00
return nil, errors.New("cfg.UserRepository is required")
2021-03-06 08:32:15 +00:00
}
2021-07-14 05:13:51 +00:00
return &Usecase{
2021-03-06 08:32:15 +00:00
cfg.UserRepository,
cfg.TokenGenerator,
}, nil
}
2021-07-14 05:13:51 +00:00
func (ucase *Usecase) SignIn(ctx context.Context, email, password string, staySignedIn bool) (*model.User, string, error) {
u, err := ucase.GetUserByCredentials(ctx, email, password)
2021-03-06 08:32:15 +00:00
if err != nil {
return nil, "", err
}
token, err := ucase.tokenGenerator.Generate(jwt.Metadata{
StaySignedIn: staySignedIn,
Credentials: jwt.Credentials{
Email: u.Email,
Password: u.Password,
2021-03-06 08:32:15 +00:00
},
})
if err != nil {
2021-05-02 06:36:10 +00:00
return nil, "", errorutil.Wrap(err, messageInvalidCredentials)
2021-03-06 08:32:15 +00:00
}
return u, token, nil
2021-03-06 08:32:15 +00:00
}
2021-07-14 05:13:51 +00:00
func (ucase *Usecase) ExtractAccessTokenMetadata(ctx context.Context, accessToken string) (*model.User, error) {
2021-03-06 08:32:15 +00:00
metadata, err := ucase.tokenGenerator.ExtractAccessTokenMetadata(accessToken)
if err != nil {
2021-05-02 06:36:10 +00:00
return nil, errorutil.Wrap(err, messageInvalidAccessToken)
2021-03-06 08:32:15 +00:00
}
return ucase.GetUserByCredentials(ctx, metadata.Credentials.Email, metadata.Credentials.Password)
}
2021-07-14 05:13:51 +00:00
func (ucase *Usecase) GetUserByCredentials(ctx context.Context, email, password string) (*model.User, error) {
2021-03-06 08:32:15 +00:00
users, _, err := ucase.userRepository.Fetch(ctx, &user.FetchConfig{
Limit: 1,
Count: false,
2021-07-14 04:58:10 +00:00
Filter: &model.UserFilter{
2021-03-06 08:32:15 +00:00
Email: []string{email},
},
})
if err != nil {
return nil, err
}
if len(users) <= 0 {
return nil, errors.New(messageInvalidCredentials)
2021-03-06 08:32:15 +00:00
}
u := users[0]
if err := u.CompareHashAndPassword(password); err != nil {
2021-05-02 06:36:10 +00:00
return nil, errorutil.Wrap(err, messageInvalidCredentials)
2021-03-06 08:32:15 +00:00
}
return u, nil
2021-03-06 08:32:15 +00:00
}