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