How to insert values from two forms (spring boo)t into same row in SQL database row

36 Views Asked by At

So i have a User entity with the following fields, when the user sign up he fills the 4 first ones after that he login in and and its time to registration form where he fill the rest of infos; the problem is that in the database those infos aren't saved in the same row, even tho it's the same user account and the fields are in the same entity etc. Pls help me this is my first spring boot project and im kinda lost


@Controller
public class UserController {

    @Autowired
    UserRepository userRepository;

    @Autowired
    private UserService userService;

    @Autowired
    private UserDetailsService userDetailsService;

    @GetMapping("/sign-up")
    public String getRegistrationPage(@ModelAttribute("user") UserDto userDto) {
        return "signup";
    }

    @GetMapping("/login")
    public String login(){
        return "login";
    }

    @GetMapping("/registration")
    public String getRegPage(@ModelAttribute("user") User user){
        return "register";
    }

    @PostMapping("/registration")
    public String saveUserForm(@ModelAttribute("user") UserDto userDto, Model model) {
        // Fetch existing user entity from the database
        User existingUser = userRepository.findByEmail(userDto.getEmail());
        if (existingUser == null) {
            model.addAttribute("error", "User not found");
            return "register"; // Or redirect to an error page
        }
        existingUser.setUsername(userDto.getUsername());
        existingUser.setNumero(userDto.getNumero());
        existingUser.setWeight(userDto.getWeight());
        existingUser.setHeight(userDto.getHeight());
        existingUser.setAge(userDto.getAge());
        existingUser.setGender(userDto.getGender());
        existingUser.setHealthState(userDto.getHealthState());
        existingUser.setMealsPerDay(userDto.getMealsPerDay());
        existingUser.setWorkoutSessionPerWeek(userDto.getWorkoutSessionPerWeek());
        existingUser.setCardio(userDto.getCardio());

        userRepository.save(existingUser);

        model.addAttribute("msg", "Submitted Successfully!");
        return "register";
    }


    private User mapToUserEntity(UserDto userDto) {
            User user = new User();
            user.setEmail(userDto.getEmail());
            user.setPassword(userDto.getPassword());
            user.setRole(userDto.getRole());
            user.setNomComplet(userDto.getNomComplet());

            user.setUsername(userDto.getUsername());
            user.setNumero(userDto.getNumero());
            user.setWeight(userDto.getWeight());
            user.setHeight(userDto.getHeight());
            user.setAge(userDto.getAge());
            user.setGender(userDto.getGender());
            user.setHealthState(userDto.getHealthState());
            user.setMealsPerDay(userDto.getMealsPerDay());
            user.setWorkoutSessionPerWeek(userDto.getWorkoutSessionPerWeek());
            user.setCardio(userDto.getCardio());

            return user;
        }



    @PostMapping("/sign-up")
    public String signUp(@ModelAttribute("user") UserDto userDto, Model model) {
        User user = userService.save(userDto);
        userService.assignRolesOnRegistration(userDto.getEmail());

        UserDetails userDetails = userDetailsService.loadUserByUsername(userDto.getEmail());
        if (userDetails.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
            return "redirect:/admin-page";
        } else {
            return "redirect:/user-page";
        }
    }


    @GetMapping("user-page")
    public String userPage (Model model, Principal principal) {
        UserDetails userDetails = userDetailsService.loadUserByUsername(principal.getName());
        model.addAttribute("user", userDetails);
        return "user";
    }

    @GetMapping("admin-page")
    public String adminPage (Model model, Principal principal) {
        UserDetails userDetails = userDetailsService.loadUserByUsername(principal.getName());
        model.addAttribute("user", userDetails);
        return "admin";
    }


}

This is the controller

@Controller
public class UserController {

    @Autowired
    UserRepository userRepository;

    @Autowired
    private UserService userService;

    @Autowired
    private UserDetailsService userDetailsService;

    @GetMapping("/sign-up")
    public String getRegistrationPage(@ModelAttribute("user") UserDto userDto) {
        return "signup";
    }

    @GetMapping("/login")
    public String login(){
        return "login";
    }

    @GetMapping("/registration")
    public String getRegPage(@ModelAttribute("user") User user){
        return "register";
    }

    @PostMapping("/registration")
    public String saveUserForm(@ModelAttribute("user") UserDto userDto, Model model) {
        userRepository.save(mapToUserEntity(userDto)); // Save the user entity
        model.addAttribute("msg", "Submitted Successfully!");
        return "register";
    }

        private User mapToUserEntity(UserDto userDto) {
            User user = new User();
            user.setEmail(userDto.getEmail());
            user.setPassword(userDto.getPassword());
            user.setRole(userDto.getRole());
            user.setNomComplet(userDto.getNomComplet());

            user.setUsername(userDto.getUsername());
            user.setNumero(userDto.getNumero());
            user.setWeight(userDto.getWeight());
            user.setHeight(userDto.getHeight());
            user.setAge(userDto.getAge());
            user.setGender(userDto.getGender());
            user.setHealthState(userDto.getHealthState());
            user.setMealsPerDay(userDto.getMealsPerDay());
            user.setWorkoutSessionPerWeek(userDto.getWorkoutSessionPerWeek());
            user.setCardio(userDto.getCardio());

            return user;
        }



    @PostMapping("/sign-up")
    public String signUp(@ModelAttribute("user") UserDto userDto, Model model) {
        User user = userService.save(userDto);

        userService.assignRolesOnRegistration(userDto.getEmail());

        UserDetails userDetails = userDetailsService.loadUserByUsername(userDto.getEmail());
        if (userDetails.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
            return "redirect:/admin-page";
        } else {
            return "redirect:/user-page";
        }
    }


    @GetMapping("user-page")
    public String userPage (Model model, Principal principal) {
        UserDetails userDetails = userDetailsService.loadUserByUsername(principal.getName());
        model.addAttribute("user", userDetails);
        return "user";
    }

    @GetMapping("admin-page")
    public String adminPage (Model model, Principal principal) {
        UserDetails userDetails = userDetailsService.loadUserByUsername(principal.getName());
        model.addAttribute("user", userDetails);
        return "admin";
    }


}

and this is userDto


@Getter
@Setter
@NoArgsConstructor
public class UserDto {
    private String email;
    private String password;
    private String role;
    private String nomComplet;

    private String username;
    private Integer numero;
    private Float weight;
    private Float height;
    private Integer age;
    private String gender;
    private String healthState;
    private Integer mealsPerDay;
    private Integer workoutSessionPerWeek;
    private String cardio;


    public UserDto(String email, String password, String role, String nomComplet, String username, Integer numero, Float weight, Float height, Integer age, String gender, String healthState, Integer mealsPerDay, Integer workoutSessionPerWeek, String cardio) {
        super();
        this.email = email;
        this.password = password;
        this.role = role;
        this.nomComplet = nomComplet;
        this.username = username;
        this.numero = numero;
        this.weight = weight;
        this.height = height;
        this.age = age;
        this.gender = gender;
        this.healthState = healthState;
        this.mealsPerDay = mealsPerDay;
        this.workoutSessionPerWeek = workoutSessionPerWeek;
        this.cardio = cardio;
    }
}
@Service
public class UserServiceImpl implements UserService {

    private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Autowired
    private UserRepository userRepository;

    @Override
    public User save(UserDto userDto) {
        logger.info("Saving user: {}", userDto.getEmail());
        User user = new User(
                userDto.getEmail(),
                passwordEncoder.encode(userDto.getPassword()),
                userDto.getRole(),
                userDto.getNomComplet(),
                userDto.getUsername(),
                userDto.getNumero(),
                userDto.getWeight(),
                userDto.getHeight(),
                userDto.getAge(),
                userDto.getGender(),
                userDto.getHealthState(),
                userDto.getMealsPerDay(),
                userDto.getWorkoutSessionPerWeek(),
                userDto.getCardio()
        );
        return userRepository.save(user);
    }

    @Override
    public void assignRolesOnRegistration(String email) {
        logger.info("Assigning roles for user with email: {}", email);
        User user = userRepository.findByEmail(email);
        if (user == null) {
            throw new IllegalArgumentException("User not found with email: " + email);
        }

        if (user.getRole() == null) {
            user.setRole("USER");
        } else if (user.getRole().equals("ADMIN")) {
        } else {
            throw new IllegalArgumentException("Invalid role value: " + user.getRole());
        }

        userRepository.save(user);
    }

I tried to make the result of the sign up and register form to be in the same databse, but they ended up being in separate rows.

0

There are 0 best solutions below