wip
This commit is contained in:
98
mangezmieux-backend/internal/users/service/service.go
Normal file
98
mangezmieux-backend/internal/users/service/service.go
Normal file
@@ -0,0 +1,98 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"mangezmieux-backend/internal/jwt"
|
||||
"mangezmieux-backend/internal/responses"
|
||||
"mangezmieux-backend/internal/users/model"
|
||||
"mangezmieux-backend/internal/users/sql"
|
||||
|
||||
"time"
|
||||
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
dao sql.Dao
|
||||
jwt *jwt.Service
|
||||
}
|
||||
|
||||
func NewService(dao sql.Dao, jwt *jwt.Service) *Service {
|
||||
return &Service{dao: dao, jwt: jwt}
|
||||
}
|
||||
|
||||
func (s *Service) CreateUser(userEditable *model.UserEditable) (*model.User, error) {
|
||||
now := time.Now()
|
||||
user := &model.User{
|
||||
ID: nil,
|
||||
CreatedAt: now,
|
||||
UpdatedAt: &now,
|
||||
UserEditable: model.UserEditable{
|
||||
Firstname: userEditable.Firstname,
|
||||
Lastname: userEditable.Lastname,
|
||||
Email: userEditable.Email,
|
||||
Password: userEditable.Password,
|
||||
},
|
||||
}
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(userEditable.Password), 8)
|
||||
if err != nil {
|
||||
return nil, &responses.ErrInternalServer
|
||||
}
|
||||
user.Password = string(hashedPassword)
|
||||
err = s.dao.Create(user)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
user.Password = ""
|
||||
return user, nil
|
||||
}
|
||||
|
||||
func (s *Service) Login(request model.UserLoginRequest) (string, error) {
|
||||
user, err := s.dao.FindByMail(request.Email)
|
||||
if err != nil {
|
||||
return "", &responses.ErrUnauthorized
|
||||
}
|
||||
err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(request.Password))
|
||||
if err != nil {
|
||||
return "", &responses.ErrUnauthorized
|
||||
}
|
||||
return s.jwt.GenerateJWTToken(user.ID.String())
|
||||
}
|
||||
|
||||
func (s *Service) Introspect(token string) (*model.User, error) {
|
||||
claims, err := s.jwt.ValidateToken(token)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
usr, err := s.dao.FindByID(claims.ID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
userModel := s.transformEntityToResponse(usr, false)
|
||||
|
||||
return userModel, nil
|
||||
}
|
||||
|
||||
func (s *Service) Refresh(oldToken string) (string, error) {
|
||||
return s.jwt.Refresh(oldToken)
|
||||
}
|
||||
|
||||
func (s *Service) transformEntityToResponse(user *model.User, withPassword bool) *model.User {
|
||||
password := ""
|
||||
if withPassword {
|
||||
password = user.Password
|
||||
}
|
||||
|
||||
return &model.User{
|
||||
ID: user.ID,
|
||||
CreatedAt: user.CreatedAt,
|
||||
UpdatedAt: user.UpdatedAt,
|
||||
UserEditable: model.UserEditable{
|
||||
Firstname: user.Firstname,
|
||||
Lastname: user.Lastname,
|
||||
Email: user.Email,
|
||||
Password: password,
|
||||
},
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user