package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.impl; import lombok.RequiredArgsConstructor; import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.DTO.SignInDTO; import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.DTO.JwtAuthResponse; import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.DTO.RefreshTokenRequest; import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.JobSeeker; import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.Recruiter; import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.User; import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.JobSeekerRepository; import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.RecruiterRepository; import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.UserRepository; import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.AuthService; import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.JwtService; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import java.util.HashMap; @Service @RequiredArgsConstructor public class AuthServiceImpl implements AuthService { private final RecruiterRepository recruiterRepository; private final JobSeekerRepository jobSeekerRepository; private final PasswordEncoder passwordEncoder; private final AuthenticationManager authenticationManager; private final UserRepository userRepository; private final JwtService jwtService; @Override public User signUpJobSeeker(JobSeeker jobSeeker) { jobSeeker.setPassword(passwordEncoder.encode(jobSeeker.getPassword())); return jobSeekerRepository.save(jobSeeker); } public User signUpRecruiter(Recruiter recruiter) { recruiter.setPassword(passwordEncoder.encode(recruiter.getPassword())); return recruiterRepository.save(recruiter); } public JwtAuthResponse signIn(SignInDTO signInDTO) { authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(signInDTO.getEmail(), signInDTO.getPassword())); User user = userRepository.findByEmail(signInDTO.getEmail()).orElseThrow(() -> new IllegalArgumentException("Email or password is incorrect")); String jwt = jwtService.generateToken(user); String refreshJwt = jwtService.generateRefreshToken(new HashMap<>(), user); return new JwtAuthResponse(user.getId(), user.getEmail(), user.getName(), user.getRole().name(), jwt, refreshJwt); } public JwtAuthResponse refreshToken(RefreshTokenRequest refreshTokenRequest) { String userEmail = jwtService.extractUsername(refreshTokenRequest.getToken()); User user = userRepository.findByEmail(userEmail).orElseThrow(); if(jwtService.isTokenValid(refreshTokenRequest.getToken(), user)) { String jwt = jwtService.generateToken(user); return new JwtAuthResponse(user.getId(), user.getEmail(), user.getName(), user.getRole().name(), jwt, refreshTokenRequest.getToken()); } return null; } }