99 lines
2.2 KiB
Go
99 lines
2.2 KiB
Go
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,
|
|
},
|
|
}
|
|
}
|