AuthServiceImpl.java

package com.flogin.backend.service.auth;

import com.flogin.backend.config.JwtUtil;
import com.flogin.backend.dto.LoginRequest;
import com.flogin.backend.dto.LoginResponse;
import com.flogin.backend.entity.User;
import com.flogin.backend.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.Optional;
import java.util.regex.Pattern;

@Service
@RequiredArgsConstructor
public class AuthServiceImpl implements IAuthService {

    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;
    private final JwtUtil jwtUtil;

    @Override
    public String validateUsername(String username) {
        if (username == null || username.isBlank()) {
            return "Username cannot be empty";
        }
        if (username.length() < 3 || username.length() > 50) {
            return "Username must be 3-50 characters";
        }
        if (!Pattern.matches("^[a-zA-Z0-9._-]+$", username)) {
            return "Username contains invalid characters";
        }
        return "";
    }

    @Override
    public String validatePassword(String password) {
        if (password == null || password.isBlank()) {
            return "Password cannot be empty";
        }
        if (password.length() < 6 || password.length() > 100) {
            return "Password must be 6-100 characters";
        }
        boolean hasLetter = password.chars().anyMatch(Character::isLetter);
        boolean hasDigit = password.chars().anyMatch(Character::isDigit);
        if (!hasLetter || !hasDigit) {
            return "Password must contain both letters and numbers";
        }
        return "";
    }

    @Override
    public LoginResponse authenticate(LoginRequest request) {
        String usernameError = validateUsername(request.getUsername());
        if (!usernameError.isBlank()) {
            return new LoginResponse(false, usernameError, null);
        }

        String passwordError = validatePassword(request.getPassword());
        if (!passwordError.isBlank()) {
            return new LoginResponse(false, passwordError, null);
        }

        Optional<User> optionalUser = userRepository.findByUsername(request.getUsername());
        if (optionalUser.isEmpty()) {
            return new LoginResponse(false, "User not found", null);
        }

        User user = optionalUser.get();
        if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) {
            return new LoginResponse(false, "Password is incorrect", null);
        }

        String token = jwtUtil.generateToken(user.getUsername());
        return new LoginResponse(true, "Login successfully", token);
    }
}