Skip to main content
Became Hot Network Question
added 551 characters in body
Source Link
package com.discwords.discwords.service;


import com.discwords.discwords.model.*;
import com.discwords.discwords.repository.ProfileRepo;
import com.discwords.discwords.repository.SessionRepo;
import com.discwords.discwords.repository.UserRepo;
import com.discwords.discwords.repository.UserSecretRepo;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ResponseStatusException;

import java.util.Collections;
import java.util.Date;
import java.util.Optional;

@Service
public class AuthorizationServiceImpl implements AuthorizationService {

    @Autowired
    private UserRepo userRepo;

    @Autowired
    private UserSecretRepo userSecretRepo;

    @Autowired
    private SessionRepo sessionRepo;


    @Autowired
    private ProfileRepo profileRepo;

    @Autowired
    JWTService jwtService;

    @Value("${google_client_id}")
    private String CLIENT_ID;


    @Override
    public UserSessionDTO loginUser(UserDTO user) {
        Optional<User> userRes = userRepo.findByEmail(user.getEmail());
        if (userRes.isEmpty()) {
            System.out.println("User not found");
            return null;
        }

        User existingUser = userRes.get();

        Optional<Profile> profileRes = profileRepo.findByUserId(existingUser.getUserId());
        if(profileRes.isEmpty()){
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "No Profile with this user id");
        }
        Profile profile = profileRes.get();

        Optional<UserSession> userSessionRes = sessionRepo.findByUserId(existingUser.getUserId());
        if (userSessionRes.isPresent()) {
            UserSession userSession = userSessionRes.get();
            if (userSession.getSessionEndTime().before(new Date())) {
                System.out.println("Deleting User session for new");
                sessionRepo.delete(userSession);
            } else {
                System.out.println("User already logged in");
                return new UserSessionDTO(profile, userSession.getToken());
            }
        }

        Optional<UserSecret> userSecretRes = userSecretRepo.findById(existingUser.getUserId());

        if (userSecretRes.isEmpty()) {
            System.out.println("User secret is empty");
            return null;
        }

        UserSecret userSecret = userSecretRes.get();

        if (BCrypt.checkpw(user.getPassword(), userSecret.getPassword())) {
            String jwtToken = jwtService.generateToken(existingUser.getEmail(), Long.toString(existingUser.getUserId()));
            int newSessionId = (int) (System.currentTimeMillis() / 100000);
            UserSession newUserSession = new UserSession(
                    existingUser.getUserId(),
                    jwtToken,
                    new Date(),
                    jwtService.extractExpiryDate(jwtToken),
                    newSessionId
            );

            UserSession userSession = sessionRepo.save(newUserSession);
            UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

            return userSessionDTO;

        }
        return null;
    }


    @Override
    public UserSessionDTO signupUser(UserDTO user) {

//        checking if email already exists
        Optional<User> userRes = userRepo.findByEmail(user.getEmail());
        if (!userRes.isEmpty()) {
            throw new ResponseStatusException(HttpStatus.CONFLICT, "User already exist");
        }

//       checking if username already exists
        Optional<User> tempUserRes = userRepo.findByUsername(user.getUsername());
        if (!tempUserRes.isEmpty()) {
            throw new ResponseStatusException(HttpStatus.CONFLICT, "Username exist");
        }


        String password = BCrypt.hashpw(user.getPassword(), BCrypt.gensalt());
        Long userId = generateId();

        User newUser = new User(userId, user.getEmail(), user.getUsername());
        userRepo.save(newUser);

        UserSecret newUserSecret = new UserSecret(userId, password);
        userSecretRepo.save(newUserSecret);


        //creating profile
        Profile profile = new Profile();
        profile.setUserId(newUser.getUserId());
        profile.setEmail(newUser.getEmail());
        System.out.println(newUser.getUsername());
        profile.setUsername(newUser.getUsername());
        profileRepo.save(profile);



        //token generation

        String jwtToken = jwtService.generateToken(newUser.getEmail(), Long.toString(newUser.getUserId()));

        int newSessionId = (int) (System.currentTimeMillis() / 100000);
        UserSession newUserSession = new UserSession(
                newUser.getUserId(),
                jwtToken,
                new Date(),
                jwtService.extractExpiryDate(jwtToken),
                newSessionId
        );
        UserSession userSession = sessionRepo.save(newUserSession);


        UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

        return userSessionDTO;
    }

    @Override
    public UserSessionDTO signupUserWithGoogle(TokenRequestDTO tokenRequestDTO) throws Exception {

        GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance())
                .setAudience(Collections.singletonList(CLIENT_ID)).build();
        GoogleIdToken idToken = verifier.verify(tokenRequestDTO.getTokenId());

        if (idToken != null) {
            GoogleIdToken.Payload payload = idToken.getPayload();

            String userEmail = payload.getEmail();

            Optional<User> userRes = userRepo.findByEmail(userEmail);

            if (userRes.isPresent()) {
                return loginUserWithGoogle(tokenRequestDTO);
            }

            long userId = generateId();
            String username = userEmail.split("@")[0];

            User newUser = new User(userId, userEmail, username);
            userRepo.save(newUser);

            Profile profile = new Profile();
            profile.setUserId(newUser.getUserId());
            profile.setEmail(newUser.getEmail());
            System.out.println(newUser.getUsername());
            profile.setUsername(newUser.getUsername());
            profileRepo.save(profile);


            String jwtToken = jwtService.generateToken(newUser.getEmail(), Long.toString(newUser.getUserId()));
            int newSessionId = (int) (System.currentTimeMillis() / 100000);
            UserSession newUserSession = new UserSession(
                    newUser.getUserId(),
                    jwtToken,
                    new Date(),
                    jwtService.extractExpiryDate(jwtToken),
                    newSessionId
            );

            UserSession userSession = sessionRepo.save(newUserSession);

            UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

            return userSessionDTO;
        }

        return null;
    }

    @Override
    public UserSessionDTO loginUserWithGoogle(TokenRequestDTO tokenRequestDTO) throws Exception {

        GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance())
                .setAudience(Collections.singletonList(CLIENT_ID)).build();
        GoogleIdToken idToken = verifier.verify(tokenRequestDTO.getTokenId());

        if (idToken != null) {
            GoogleIdToken.Payload payload = idToken.getPayload();

            String userEmail = payload.getEmail();

            Optional<User> userRes = userRepo.findByEmail(userEmail);

            if (userRes.isEmpty()) {
                return signupUserWithGoogle(tokenRequestDTO);
            }

            User existingUser = userRes.get();

            Optional<Profile> profileRes = profileRepo.findByUserId(existingUser.getUserId());
            if(profileRes.isEmpty()){
                throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "No Profile with this user id");
            }
            Profile profile = profileRes.get();


            Optional<UserSession> userSessionRes = sessionRepo.findByUserId(existingUser.getUserId());
            if (userSessionRes.isPresent()) {
                UserSession userSession = userSessionRes.get();
                if (userSession.getSessionEndTime().before(new Date())) {
                    sessionRepo.delete(userSession);
                } else {
                    System.out.println("User already logged in");
                    return new UserSessionDTO(profile, userSession.getToken());
                }
            } else {
                String jwtToken = jwtService.generateToken(existingUser.getEmail(), Long.toString(existingUser.getUserId()));
                int newSessionId = (int) (System.currentTimeMillis() / 100000);
                UserSession newUserSession = new UserSession(
                        existingUser.getUserId(),
                        jwtToken,
                        new Date(),
                        jwtService.extractExpiryDate(jwtToken),
                        newSessionId
                );
                UserSession userSession = sessionRepo.save(newUserSession);

                UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

                return userSessionDTO;

            }
        }

        return null;
    }

    //using token
    @Override
    public boolean authorizeUser(String jwtToken) throws Exception {

        long userId = (long) jwtService.extractUserId(jwtToken);
        Date tokenExpiryDate = (Date) jwtService.extractExpiryDate(jwtToken);
        Optional<UserSession> userSessionRes = sessionRepo.findByUserId(userId);

        if(userSessionRes.isEmpty()){
            return false;
        }

        UserSession userSession = userSessionRes.get();

        if(userSession.getSessionEndTime().before(new Date()) || tokenExpiryDate.before(new Date())){
            sessionRepo.delete(userSession);
            return false;
        }

        return true;
    }


    //TODO - Making Util package for all these stuff
    private Long generateId() {
        Long time = System.currentTimeMillis();
        time = time % 1000000000;
        time = time * 1000;
        time = time + (long) (Math.random() * 1000);

        return time;
    }

}

package com.discwords.discwords.service;


import com.discwords.discwords.model.*;
import com.discwords.discwords.repository.ProfileRepo;
import com.discwords.discwords.repository.SessionRepo;
import com.discwords.discwords.repository.UserRepo;
import com.discwords.discwords.repository.UserSecretRepo;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ResponseStatusException;

import java.util.Collections;
import java.util.Date;
import java.util.Optional;

@Service
public class AuthorizationServiceImpl implements AuthorizationService {

    @Autowired
    private UserRepo userRepo;

    @Autowired
    private UserSecretRepo userSecretRepo;

    @Autowired
    private SessionRepo sessionRepo;


    @Autowired
    private ProfileRepo profileRepo;

    @Autowired
    JWTService jwtService;

    @Value("${google_client_id}")
    private String CLIENT_ID;


    @Override
    public UserSessionDTO loginUser(UserDTO user) {
        Optional<User> userRes = userRepo.findByEmail(user.getEmail());
        if (userRes.isEmpty()) {
            System.out.println("User not found");
            return null;
        }

        User existingUser = userRes.get();

        Optional<Profile> profileRes = profileRepo.findByUserId(existingUser.getUserId());
        if(profileRes.isEmpty()){
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "No Profile with this user id");
        }
        Profile profile = profileRes.get();

        Optional<UserSession> userSessionRes = sessionRepo.findByUserId(existingUser.getUserId());
        if (userSessionRes.isPresent()) {
            UserSession userSession = userSessionRes.get();
            if (userSession.getSessionEndTime().before(new Date())) {
                System.out.println("Deleting User session for new");
                sessionRepo.delete(userSession);
            } else {
                System.out.println("User already logged in");
                return new UserSessionDTO(profile, userSession.getToken());
            }
        }

        Optional<UserSecret> userSecretRes = userSecretRepo.findById(existingUser.getUserId());

        if (userSecretRes.isEmpty()) {
            System.out.println("User secret is empty");
            return null;
        }

        UserSecret userSecret = userSecretRes.get();

        if (BCrypt.checkpw(user.getPassword(), userSecret.getPassword())) {
            String jwtToken = jwtService.generateToken(existingUser.getEmail(), Long.toString(existingUser.getUserId()));
            int newSessionId = (int) (System.currentTimeMillis() / 100000);
            UserSession newUserSession = new UserSession(
                    existingUser.getUserId(),
                    jwtToken,
                    new Date(),
                    jwtService.extractExpiryDate(jwtToken),
                    newSessionId
            );

            UserSession userSession = sessionRepo.save(newUserSession);
            UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

            return userSessionDTO;

        }
        return null;
    }


    @Override
    public UserSessionDTO signupUser(UserDTO user) {

//        checking if email already exists
        Optional<User> userRes = userRepo.findByEmail(user.getEmail());
        if (!userRes.isEmpty()) {
            throw new ResponseStatusException(HttpStatus.CONFLICT, "User already exist");
        }

//       checking if username already exists
        Optional<User> tempUserRes = userRepo.findByUsername(user.getUsername());
        if (!tempUserRes.isEmpty()) {
            throw new ResponseStatusException(HttpStatus.CONFLICT, "Username exist");
        }


        String password = BCrypt.hashpw(user.getPassword(), BCrypt.gensalt());
        Long userId = generateId();

        User newUser = new User(userId, user.getEmail(), user.getUsername());
        userRepo.save(newUser);

        UserSecret newUserSecret = new UserSecret(userId, password);
        userSecretRepo.save(newUserSecret);


        //creating profile
        Profile profile = new Profile();
        profile.setUserId(newUser.getUserId());
        profile.setEmail(newUser.getEmail());
        System.out.println(newUser.getUsername());
        profile.setUsername(newUser.getUsername());
        profileRepo.save(profile);



        //token generation

        String jwtToken = jwtService.generateToken(newUser.getEmail(), Long.toString(newUser.getUserId()));

        int newSessionId = (int) (System.currentTimeMillis() / 100000);
        UserSession newUserSession = new UserSession(
                newUser.getUserId(),
                jwtToken,
                new Date(),
                jwtService.extractExpiryDate(jwtToken),
                newSessionId
        );
        UserSession userSession = sessionRepo.save(newUserSession);


        UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

        return userSessionDTO;
    }

    @Override
    public UserSessionDTO signupUserWithGoogle(TokenRequestDTO tokenRequestDTO) throws Exception {

        GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance())
                .setAudience(Collections.singletonList(CLIENT_ID)).build();
        GoogleIdToken idToken = verifier.verify(tokenRequestDTO.getTokenId());

        if (idToken != null) {
            GoogleIdToken.Payload payload = idToken.getPayload();

            String userEmail = payload.getEmail();

            Optional<User> userRes = userRepo.findByEmail(userEmail);

            if (userRes.isPresent()) {
                return loginUserWithGoogle(tokenRequestDTO);
            }

            long userId = generateId();
            String username = userEmail.split("@")[0];

            User newUser = new User(userId, userEmail, username);
            userRepo.save(newUser);

            Profile profile = new Profile();
            profile.setUserId(newUser.getUserId());
            profile.setEmail(newUser.getEmail());
            System.out.println(newUser.getUsername());
            profile.setUsername(newUser.getUsername());
            profileRepo.save(profile);


            String jwtToken = jwtService.generateToken(newUser.getEmail(), Long.toString(newUser.getUserId()));
            int newSessionId = (int) (System.currentTimeMillis() / 100000);
            UserSession newUserSession = new UserSession(
                    newUser.getUserId(),
                    jwtToken,
                    new Date(),
                    jwtService.extractExpiryDate(jwtToken),
                    newSessionId
            );

            UserSession userSession = sessionRepo.save(newUserSession);

            UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

            return userSessionDTO;
        }

        return null;
    }

    @Override
    public UserSessionDTO loginUserWithGoogle(TokenRequestDTO tokenRequestDTO) throws Exception {

        GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance())
                .setAudience(Collections.singletonList(CLIENT_ID)).build();
        GoogleIdToken idToken = verifier.verify(tokenRequestDTO.getTokenId());

        if (idToken != null) {
            GoogleIdToken.Payload payload = idToken.getPayload();

            String userEmail = payload.getEmail();

            Optional<User> userRes = userRepo.findByEmail(userEmail);

            if (userRes.isEmpty()) {
                return signupUserWithGoogle(tokenRequestDTO);
            }

            User existingUser = userRes.get();

            Optional<Profile> profileRes = profileRepo.findByUserId(existingUser.getUserId());
            if(profileRes.isEmpty()){
                throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "No Profile with this user id");
            }
            Profile profile = profileRes.get();


            Optional<UserSession> userSessionRes = sessionRepo.findByUserId(existingUser.getUserId());
            if (userSessionRes.isPresent()) {
                UserSession userSession = userSessionRes.get();
                if (userSession.getSessionEndTime().before(new Date())) {
                    sessionRepo.delete(userSession);
                } else {
                    System.out.println("User already logged in");
                    return new UserSessionDTO(profile, userSession.getToken());
                }
            } else {
                String jwtToken = jwtService.generateToken(existingUser.getEmail(), Long.toString(existingUser.getUserId()));
                int newSessionId = (int) (System.currentTimeMillis() / 100000);
                UserSession newUserSession = new UserSession(
                        existingUser.getUserId(),
                        jwtToken,
                        new Date(),
                        jwtService.extractExpiryDate(jwtToken),
                        newSessionId
                );
                UserSession userSession = sessionRepo.save(newUserSession);

                UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

                return userSessionDTO;

            }
        }

        return null;
    }

    //using token
    @Override
    public boolean authorizeUser(String jwtToken) throws Exception {



        return false;
    }


    //TODO - Making Util package for all these stuff
    private Long generateId() {
        Long time = System.currentTimeMillis();
        time = time % 1000000000;
        time = time * 1000;
        time = time + (long) (Math.random() * 1000);

        return time;
    }

}

package com.discwords.discwords.service;


import com.discwords.discwords.model.*;
import com.discwords.discwords.repository.ProfileRepo;
import com.discwords.discwords.repository.SessionRepo;
import com.discwords.discwords.repository.UserRepo;
import com.discwords.discwords.repository.UserSecretRepo;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ResponseStatusException;

import java.util.Collections;
import java.util.Date;
import java.util.Optional;

@Service
public class AuthorizationServiceImpl implements AuthorizationService {

    @Autowired
    private UserRepo userRepo;

    @Autowired
    private UserSecretRepo userSecretRepo;

    @Autowired
    private SessionRepo sessionRepo;


    @Autowired
    private ProfileRepo profileRepo;

    @Autowired
    JWTService jwtService;

    @Value("${google_client_id}")
    private String CLIENT_ID;


    @Override
    public UserSessionDTO loginUser(UserDTO user) {
        Optional<User> userRes = userRepo.findByEmail(user.getEmail());
        if (userRes.isEmpty()) {
            System.out.println("User not found");
            return null;
        }

        User existingUser = userRes.get();

        Optional<Profile> profileRes = profileRepo.findByUserId(existingUser.getUserId());
        if(profileRes.isEmpty()){
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "No Profile with this user id");
        }
        Profile profile = profileRes.get();

        Optional<UserSession> userSessionRes = sessionRepo.findByUserId(existingUser.getUserId());
        if (userSessionRes.isPresent()) {
            UserSession userSession = userSessionRes.get();
            if (userSession.getSessionEndTime().before(new Date())) {
                System.out.println("Deleting User session for new");
                sessionRepo.delete(userSession);
            } else {
                System.out.println("User already logged in");
                return new UserSessionDTO(profile, userSession.getToken());
            }
        }

        Optional<UserSecret> userSecretRes = userSecretRepo.findById(existingUser.getUserId());

        if (userSecretRes.isEmpty()) {
            System.out.println("User secret is empty");
            return null;
        }

        UserSecret userSecret = userSecretRes.get();

        if (BCrypt.checkpw(user.getPassword(), userSecret.getPassword())) {
            String jwtToken = jwtService.generateToken(existingUser.getEmail(), Long.toString(existingUser.getUserId()));
            int newSessionId = (int) (System.currentTimeMillis() / 100000);
            UserSession newUserSession = new UserSession(
                    existingUser.getUserId(),
                    jwtToken,
                    new Date(),
                    jwtService.extractExpiryDate(jwtToken),
                    newSessionId
            );

            UserSession userSession = sessionRepo.save(newUserSession);
            UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

            return userSessionDTO;

        }
        return null;
    }


    @Override
    public UserSessionDTO signupUser(UserDTO user) {

//        checking if email already exists
        Optional<User> userRes = userRepo.findByEmail(user.getEmail());
        if (!userRes.isEmpty()) {
            throw new ResponseStatusException(HttpStatus.CONFLICT, "User already exist");
        }

//       checking if username already exists
        Optional<User> tempUserRes = userRepo.findByUsername(user.getUsername());
        if (!tempUserRes.isEmpty()) {
            throw new ResponseStatusException(HttpStatus.CONFLICT, "Username exist");
        }


        String password = BCrypt.hashpw(user.getPassword(), BCrypt.gensalt());
        Long userId = generateId();

        User newUser = new User(userId, user.getEmail(), user.getUsername());
        userRepo.save(newUser);

        UserSecret newUserSecret = new UserSecret(userId, password);
        userSecretRepo.save(newUserSecret);


        //creating profile
        Profile profile = new Profile();
        profile.setUserId(newUser.getUserId());
        profile.setEmail(newUser.getEmail());
        System.out.println(newUser.getUsername());
        profile.setUsername(newUser.getUsername());
        profileRepo.save(profile);



        //token generation

        String jwtToken = jwtService.generateToken(newUser.getEmail(), Long.toString(newUser.getUserId()));

        int newSessionId = (int) (System.currentTimeMillis() / 100000);
        UserSession newUserSession = new UserSession(
                newUser.getUserId(),
                jwtToken,
                new Date(),
                jwtService.extractExpiryDate(jwtToken),
                newSessionId
        );
        UserSession userSession = sessionRepo.save(newUserSession);


        UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

        return userSessionDTO;
    }

    @Override
    public UserSessionDTO signupUserWithGoogle(TokenRequestDTO tokenRequestDTO) throws Exception {

        GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance())
                .setAudience(Collections.singletonList(CLIENT_ID)).build();
        GoogleIdToken idToken = verifier.verify(tokenRequestDTO.getTokenId());

        if (idToken != null) {
            GoogleIdToken.Payload payload = idToken.getPayload();

            String userEmail = payload.getEmail();

            Optional<User> userRes = userRepo.findByEmail(userEmail);

            if (userRes.isPresent()) {
                return loginUserWithGoogle(tokenRequestDTO);
            }

            long userId = generateId();
            String username = userEmail.split("@")[0];

            User newUser = new User(userId, userEmail, username);
            userRepo.save(newUser);

            Profile profile = new Profile();
            profile.setUserId(newUser.getUserId());
            profile.setEmail(newUser.getEmail());
            System.out.println(newUser.getUsername());
            profile.setUsername(newUser.getUsername());
            profileRepo.save(profile);


            String jwtToken = jwtService.generateToken(newUser.getEmail(), Long.toString(newUser.getUserId()));
            int newSessionId = (int) (System.currentTimeMillis() / 100000);
            UserSession newUserSession = new UserSession(
                    newUser.getUserId(),
                    jwtToken,
                    new Date(),
                    jwtService.extractExpiryDate(jwtToken),
                    newSessionId
            );

            UserSession userSession = sessionRepo.save(newUserSession);

            UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

            return userSessionDTO;
        }

        return null;
    }

    @Override
    public UserSessionDTO loginUserWithGoogle(TokenRequestDTO tokenRequestDTO) throws Exception {

        GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance())
                .setAudience(Collections.singletonList(CLIENT_ID)).build();
        GoogleIdToken idToken = verifier.verify(tokenRequestDTO.getTokenId());

        if (idToken != null) {
            GoogleIdToken.Payload payload = idToken.getPayload();

            String userEmail = payload.getEmail();

            Optional<User> userRes = userRepo.findByEmail(userEmail);

            if (userRes.isEmpty()) {
                return signupUserWithGoogle(tokenRequestDTO);
            }

            User existingUser = userRes.get();

            Optional<Profile> profileRes = profileRepo.findByUserId(existingUser.getUserId());
            if(profileRes.isEmpty()){
                throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "No Profile with this user id");
            }
            Profile profile = profileRes.get();


            Optional<UserSession> userSessionRes = sessionRepo.findByUserId(existingUser.getUserId());
            if (userSessionRes.isPresent()) {
                UserSession userSession = userSessionRes.get();
                if (userSession.getSessionEndTime().before(new Date())) {
                    sessionRepo.delete(userSession);
                } else {
                    System.out.println("User already logged in");
                    return new UserSessionDTO(profile, userSession.getToken());
                }
            } else {
                String jwtToken = jwtService.generateToken(existingUser.getEmail(), Long.toString(existingUser.getUserId()));
                int newSessionId = (int) (System.currentTimeMillis() / 100000);
                UserSession newUserSession = new UserSession(
                        existingUser.getUserId(),
                        jwtToken,
                        new Date(),
                        jwtService.extractExpiryDate(jwtToken),
                        newSessionId
                );
                UserSession userSession = sessionRepo.save(newUserSession);

                UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

                return userSessionDTO;

            }
        }

        return null;
    }

    //using token
    @Override
    public boolean authorizeUser(String jwtToken) throws Exception {

        long userId = (long) jwtService.extractUserId(jwtToken);
        Date tokenExpiryDate = (Date) jwtService.extractExpiryDate(jwtToken);
        Optional<UserSession> userSessionRes = sessionRepo.findByUserId(userId);

        if(userSessionRes.isEmpty()){
            return false;
        }

        UserSession userSession = userSessionRes.get();

        if(userSession.getSessionEndTime().before(new Date()) || tokenExpiryDate.before(new Date())){
            sessionRepo.delete(userSession);
            return false;
        }

        return true;
    }


    //TODO - Making Util package for all these stuff
    private Long generateId() {
        Long time = System.currentTimeMillis();
        time = time % 1000000000;
        time = time * 1000;
        time = time + (long) (Math.random() * 1000);

        return time;
    }

}

update wording, Make title describe what code does per site convention - see https://codereview.stackexchange.com/help/how-to-ask
Source Link

How much my code sucks? (Springboot Springboot - Authentication Functionality)Service

I am developing anda Web application using Spring boot (I am a fresherbeginner). So I want you guys to let me know how much my code sucks and howHow can I make it better? I want to level up but I am not getting any job where I can ask someone to review my code lol.better?

So thisThis code is from "AuthenticationService.java". I first made an interface for defining all methods, and then I implemented that interface in this AuthenticationService class.

How much my code sucks? (Springboot - Authentication Functionality)

I am developing and Web application using Spring boot (I am a fresher). So I want you guys to let me know how much my code sucks and how can I make it better? I want to level up but I am not getting any job where I can ask someone to review my code lol.

So this code is from "AuthenticationService.java". I first made interface for defining all methods, and then I implemented that interface in this AuthenticationService class.

Springboot - Authentication Service

I am developing a Web application using Spring boot (I am a beginner). How can I make my code better?

This code is from "AuthenticationService.java". I first made an interface for defining all methods, and then I implemented that interface in this AuthenticationService class.

Source Link

How much my code sucks? (Springboot - Authentication Functionality)

I am developing and Web application using Spring boot (I am a fresher). So I want you guys to let me know how much my code sucks and how can I make it better? I want to level up but I am not getting any job where I can ask someone to review my code lol.

So this code is from "AuthenticationService.java". I first made interface for defining all methods, and then I implemented that interface in this AuthenticationService class.

package com.discwords.discwords.service;


import com.discwords.discwords.model.*;
import com.discwords.discwords.repository.ProfileRepo;
import com.discwords.discwords.repository.SessionRepo;
import com.discwords.discwords.repository.UserRepo;
import com.discwords.discwords.repository.UserSecretRepo;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ResponseStatusException;

import java.util.Collections;
import java.util.Date;
import java.util.Optional;

@Service
public class AuthorizationServiceImpl implements AuthorizationService {

    @Autowired
    private UserRepo userRepo;

    @Autowired
    private UserSecretRepo userSecretRepo;

    @Autowired
    private SessionRepo sessionRepo;


    @Autowired
    private ProfileRepo profileRepo;

    @Autowired
    JWTService jwtService;

    @Value("${google_client_id}")
    private String CLIENT_ID;


    @Override
    public UserSessionDTO loginUser(UserDTO user) {
        Optional<User> userRes = userRepo.findByEmail(user.getEmail());
        if (userRes.isEmpty()) {
            System.out.println("User not found");
            return null;
        }

        User existingUser = userRes.get();

        Optional<Profile> profileRes = profileRepo.findByUserId(existingUser.getUserId());
        if(profileRes.isEmpty()){
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "No Profile with this user id");
        }
        Profile profile = profileRes.get();

        Optional<UserSession> userSessionRes = sessionRepo.findByUserId(existingUser.getUserId());
        if (userSessionRes.isPresent()) {
            UserSession userSession = userSessionRes.get();
            if (userSession.getSessionEndTime().before(new Date())) {
                System.out.println("Deleting User session for new");
                sessionRepo.delete(userSession);
            } else {
                System.out.println("User already logged in");
                return new UserSessionDTO(profile, userSession.getToken());
            }
        }

        Optional<UserSecret> userSecretRes = userSecretRepo.findById(existingUser.getUserId());

        if (userSecretRes.isEmpty()) {
            System.out.println("User secret is empty");
            return null;
        }

        UserSecret userSecret = userSecretRes.get();

        if (BCrypt.checkpw(user.getPassword(), userSecret.getPassword())) {
            String jwtToken = jwtService.generateToken(existingUser.getEmail(), Long.toString(existingUser.getUserId()));
            int newSessionId = (int) (System.currentTimeMillis() / 100000);
            UserSession newUserSession = new UserSession(
                    existingUser.getUserId(),
                    jwtToken,
                    new Date(),
                    jwtService.extractExpiryDate(jwtToken),
                    newSessionId
            );

            UserSession userSession = sessionRepo.save(newUserSession);
            UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

            return userSessionDTO;

        }
        return null;
    }


    @Override
    public UserSessionDTO signupUser(UserDTO user) {

//        checking if email already exists
        Optional<User> userRes = userRepo.findByEmail(user.getEmail());
        if (!userRes.isEmpty()) {
            throw new ResponseStatusException(HttpStatus.CONFLICT, "User already exist");
        }

//       checking if username already exists
        Optional<User> tempUserRes = userRepo.findByUsername(user.getUsername());
        if (!tempUserRes.isEmpty()) {
            throw new ResponseStatusException(HttpStatus.CONFLICT, "Username exist");
        }


        String password = BCrypt.hashpw(user.getPassword(), BCrypt.gensalt());
        Long userId = generateId();

        User newUser = new User(userId, user.getEmail(), user.getUsername());
        userRepo.save(newUser);

        UserSecret newUserSecret = new UserSecret(userId, password);
        userSecretRepo.save(newUserSecret);


        //creating profile
        Profile profile = new Profile();
        profile.setUserId(newUser.getUserId());
        profile.setEmail(newUser.getEmail());
        System.out.println(newUser.getUsername());
        profile.setUsername(newUser.getUsername());
        profileRepo.save(profile);



        //token generation

        String jwtToken = jwtService.generateToken(newUser.getEmail(), Long.toString(newUser.getUserId()));

        int newSessionId = (int) (System.currentTimeMillis() / 100000);
        UserSession newUserSession = new UserSession(
                newUser.getUserId(),
                jwtToken,
                new Date(),
                jwtService.extractExpiryDate(jwtToken),
                newSessionId
        );
        UserSession userSession = sessionRepo.save(newUserSession);


        UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

        return userSessionDTO;
    }

    @Override
    public UserSessionDTO signupUserWithGoogle(TokenRequestDTO tokenRequestDTO) throws Exception {

        GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance())
                .setAudience(Collections.singletonList(CLIENT_ID)).build();
        GoogleIdToken idToken = verifier.verify(tokenRequestDTO.getTokenId());

        if (idToken != null) {
            GoogleIdToken.Payload payload = idToken.getPayload();

            String userEmail = payload.getEmail();

            Optional<User> userRes = userRepo.findByEmail(userEmail);

            if (userRes.isPresent()) {
                return loginUserWithGoogle(tokenRequestDTO);
            }

            long userId = generateId();
            String username = userEmail.split("@")[0];

            User newUser = new User(userId, userEmail, username);
            userRepo.save(newUser);

            Profile profile = new Profile();
            profile.setUserId(newUser.getUserId());
            profile.setEmail(newUser.getEmail());
            System.out.println(newUser.getUsername());
            profile.setUsername(newUser.getUsername());
            profileRepo.save(profile);


            String jwtToken = jwtService.generateToken(newUser.getEmail(), Long.toString(newUser.getUserId()));
            int newSessionId = (int) (System.currentTimeMillis() / 100000);
            UserSession newUserSession = new UserSession(
                    newUser.getUserId(),
                    jwtToken,
                    new Date(),
                    jwtService.extractExpiryDate(jwtToken),
                    newSessionId
            );

            UserSession userSession = sessionRepo.save(newUserSession);

            UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

            return userSessionDTO;
        }

        return null;
    }

    @Override
    public UserSessionDTO loginUserWithGoogle(TokenRequestDTO tokenRequestDTO) throws Exception {

        GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance())
                .setAudience(Collections.singletonList(CLIENT_ID)).build();
        GoogleIdToken idToken = verifier.verify(tokenRequestDTO.getTokenId());

        if (idToken != null) {
            GoogleIdToken.Payload payload = idToken.getPayload();

            String userEmail = payload.getEmail();

            Optional<User> userRes = userRepo.findByEmail(userEmail);

            if (userRes.isEmpty()) {
                return signupUserWithGoogle(tokenRequestDTO);
            }

            User existingUser = userRes.get();

            Optional<Profile> profileRes = profileRepo.findByUserId(existingUser.getUserId());
            if(profileRes.isEmpty()){
                throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "No Profile with this user id");
            }
            Profile profile = profileRes.get();


            Optional<UserSession> userSessionRes = sessionRepo.findByUserId(existingUser.getUserId());
            if (userSessionRes.isPresent()) {
                UserSession userSession = userSessionRes.get();
                if (userSession.getSessionEndTime().before(new Date())) {
                    sessionRepo.delete(userSession);
                } else {
                    System.out.println("User already logged in");
                    return new UserSessionDTO(profile, userSession.getToken());
                }
            } else {
                String jwtToken = jwtService.generateToken(existingUser.getEmail(), Long.toString(existingUser.getUserId()));
                int newSessionId = (int) (System.currentTimeMillis() / 100000);
                UserSession newUserSession = new UserSession(
                        existingUser.getUserId(),
                        jwtToken,
                        new Date(),
                        jwtService.extractExpiryDate(jwtToken),
                        newSessionId
                );
                UserSession userSession = sessionRepo.save(newUserSession);

                UserSessionDTO userSessionDTO = new UserSessionDTO(profile, userSession.getToken());

                return userSessionDTO;

            }
        }

        return null;
    }

    //using token
    @Override
    public boolean authorizeUser(String jwtToken) throws Exception {



        return false;
    }


    //TODO - Making Util package for all these stuff
    private Long generateId() {
        Long time = System.currentTimeMillis();
        time = time % 1000000000;
        time = time * 1000;
        time = time + (long) (Math.random() * 1000);

        return time;
    }

}