This commit is contained in:
2024-07-19 17:04:42 +02:00
commit 5e0d0ec69f
71 changed files with 3316 additions and 0 deletions

View 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,
},
}
}