<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package com.chataak.api.service.impl;

import com.chataak.api.dto.ValidateOTPDTO;
import com.chataak.api.entity.OTP;
import com.chataak.api.entity.SessionHistory;
import com.chataak.api.entity.User;
import com.chataak.api.exception.MobileNumberAlreadyExistsException;
import com.chataak.api.exception.MobileNumberInvalidException;
import com.chataak.api.exception.ResourceNotFoundException;
import com.chataak.api.repo.OTPRepository;
import com.chataak.api.repo.SessionHistoryRepository;
import com.chataak.api.repo.UserRepository;
import com.chataak.api.service.JwtService;
import com.chataak.api.service.OTPService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.*;

@Service
public class OTPServiceImpl implements OTPService {
    @Autowired
    private OTPRepository otpRepository;
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private JwtService jwtService;
    @Autowired
    private SessionHistoryRepository historyRepository;
    public String generateOTP() {
        int otpValue = new Random().nextInt(9000) + 1000;
        return String.format("%04d", otpValue);
    }


    @Override
    public OTP generateAndSaveOTP(String mobileNumber,String ipAddress) {
        if (mobileNumber.length() != 10||mobileNumber==null||mobileNumber.equals("")) {
            throw new MobileNumberInvalidException("Incorrect phone number. Please provide a 10-digit mobile number.");
        }
        String value = generateOTP();
        OTP otp = new OTP();
        otp.setMobileNumber(mobileNumber);
        otp.setUser(null);
        if (ipAddress!=null){
            otp.setIpAddress(ipAddress);}
        //   otp.setOtp(value);
        otp.setOtp("1234");
        otp.setGeneratedTime(LocalDateTime.now());
        otp.setExpiryTime(LocalDateTime.now().plusMinutes(10));
        otp.setUtilized(false);
        return otpRepository.save(otp);
    }

    @Override
    public OTP resendOtp(String mobileNumber,String ipAddress) {
        if (mobileNumber.length() != 10||mobileNumber==null||mobileNumber.equals("")) {
            throw new MobileNumberInvalidException("Incorrect phone number. Please provide a 10-digit mobile number.");
        }
        Optional&lt;List&lt;OTP&gt;&gt; otpListOptional = otpRepository.findByMobileNumber(mobileNumber);

        List&lt;OTP&gt; otpList = otpListOptional.orElseGet(ArrayList::new);

        if (!otpList.isEmpty()) {
            OTP lastOtp = otpList.get(otpList.size() - 1);

            if (LocalDateTime.now().isBefore(lastOtp.getExpiryTime())) {
                return lastOtp;
            } else {
                OTP newOtp = new OTP();
                newOtp.setMobileNumber(mobileNumber);
                if (ipAddress!=null){
                    newOtp.setIpAddress(ipAddress);}
                // newOtp.setOtp(generateOTP());
                newOtp.setOtp("1234");
                newOtp.setGeneratedTime(LocalDateTime.now());
                newOtp.setExpiryTime(LocalDateTime.now().plusMinutes(10));
                newOtp.setUtilized(false);
                return otpRepository.save(newOtp);
            }
        }
        throw new ResourceNotFoundException("Please Register a Valid Mobile number");
    }
    @Override
    public ValidateOTPDTO OTPAsUtilized(String mobileNo, String otp) {
        if (mobileNo.length() != 10||mobileNo==null||mobileNo.equals("")) {
            throw new MobileNumberInvalidException("Incorrect phone number. Please provide a 10-digit mobile number.");
        }
        if ( otp.length()!=4||otp == null) {
            throw new MobileNumberAlreadyExistsException("InValid OTP. Please provide a 4-digit OTP number.");
        }

        Optional&lt;List&lt;OTP&gt;&gt; otpListOptional = otpRepository.findByMobileNumber(mobileNo);

        List&lt;OTP&gt; otpList = otpListOptional.orElseThrow(() -&gt;
                new ResourceNotFoundException("Please Register a Valid Mobile number")
        );
        ValidateOTPDTO validateOTPDTO = new ValidateOTPDTO();
        if (!otpList.isEmpty()) {
            OTP lastOtp = otpList.get(otpList.size() - 1);

            if (lastOtp.getOtp().equals(otp) &amp;&amp;!lastOtp.getUtilized()) {
                if (LocalDateTime.now().isBefore(lastOtp.getExpiryTime())){
                    lastOtp.setUtilized(true);
                    lastOtp.setUtilizedTime(LocalDateTime.now());
                    Optional&lt;User&gt; mobileNumber = userRepository.findByMobileNumber(mobileNo);
                    if (mobileNumber.isEmpty()||!mobileNumber.isPresent()){

                        User user= new User();
                        user.setMobileNumber(mobileNo);
                        user.setCreatedOn(new Date());
                        user.setStatus(User.UserStatus.ACTIVE);
                        user.setDeletedBy(null);
                        user.setDeletedOn(null);
                        user.setModifiedBy(null);
                        user.setModifiedOn(null);
                        User save = userRepository.save(user);
                        String s =  save.getImageURL();
                        if(s!=null&amp;&amp;!s.isEmpty()){
                            String filename1 = s.substring(s.lastIndexOf("/") + 1);

                            validateOTPDTO.setImageURL("https://chataak.in/images/profile/" + filename1);}
                        else { validateOTPDTO.setImageURL("https://chataak.in/images/profile/default.png");}
                        validateOTPDTO.setEmailId(save.getEmailId());
                        validateOTPDTO.setStatus(1);
                        validateOTPDTO.setMessage("Success");
                        validateOTPDTO.setMobileNumber(save.getMobileNumber());
                        validateOTPDTO.setUserKeyId(save.getUserKeyId());
                        validateOTPDTO.setDisplayName(save.getDisplayName());
                        lastOtp.setUser(save);
                        SessionHistory sessionHistory=new SessionHistory();
                        sessionHistory.setUser(save);
                        sessionHistory.setIpAddress(lastOtp.getIpAddress());
                        sessionHistory.setLoginDateTime(new Date());
                        historyRepository.save(sessionHistory);
                    }
                    else {
                        User user = mobileNumber.get();
                        lastOtp.setUser(user);
                        String s =  user.getImageURL();
                        if(s!=null&amp;&amp;!s.isEmpty()){
                            String filename1 = s.substring(s.lastIndexOf("/") + 1);
                            validateOTPDTO.setImageURL("https://chataak.in/images/profile/" + filename1);}
                        else { validateOTPDTO.setImageURL("https://chataak.in/images/profile/default.png");}
                        validateOTPDTO.setEmailId(user.getEmailId());
                        validateOTPDTO.setMobileNumber(user.getMobileNumber());
                        validateOTPDTO.setUserKeyId(user.getUserKeyId());
                        validateOTPDTO.setDisplayName(user.getDisplayName());
                        validateOTPDTO.setStatus(1);
                        validateOTPDTO.setMessage("Success");
                        SessionHistory sessionHistory=new SessionHistory();
                        sessionHistory.setUser(user);
                        sessionHistory.setIpAddress(lastOtp.getIpAddress());
                        sessionHistory.setLoginDateTime(new Date());
                        historyRepository.save(sessionHistory);
                    }
                    OTP save = otpRepository.save(lastOtp);


                }
                else {
                    throw new ResourceNotFoundException("OTP is Expired");
                }
            } else {
                throw new ResourceNotFoundException("InValid OTP ");
            }
        } else {
            throw new ResourceNotFoundException("Please Register a Valid Mobile number");
        }


        return validateOTPDTO;
    }
    @Override
    public String generatePreLoginToken(String ipAddress) {
        if (ipAddress==null||ipAddress.equals("")) {
            throw new MobileNumberAlreadyExistsException("Please provide a IPAddress.");
        }
        String token = jwtService.generateTokens(ipAddress);

        return token;
    }

}




</pre></body></html>