Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: atualizacao dados cadastrais do usuario #58

Merged
merged 13 commits into from
Mar 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.mandacarubroker.controller;
import com.mandacarubroker.domain.profile.RequestProfileDTO;
import com.mandacarubroker.domain.profile.ResponseProfileDTO;
import com.mandacarubroker.domain.user.User;
import com.mandacarubroker.service.AuthService;
import com.mandacarubroker.service.ProfileService;
import com.mandacarubroker.service.UserService;
import jakarta.validation.Valid;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.Optional;

@RestController
@RequestMapping("/profile")
public class ProfileController {
private final ProfileService profileService;
private final UserService userService;

public ProfileController(final ProfileService receivedProfileService, final UserService receivedUserService) {
this.profileService = receivedProfileService;
this.userService = receivedUserService;
}

@PutMapping("/me")
public ResponseEntity<ResponseProfileDTO> updateUser(@Valid @RequestBody final RequestProfileDTO updatedUserDTO) {
User user = AuthService.getAuthenticatedUser();
String userName = user.getUsername();
Optional<ResponseProfileDTO> updatedProfile = profileService.updateProfile(userName, updatedUserDTO);

if (updatedProfile.isEmpty()) {
return ResponseEntity.notFound().build();
}

return ResponseEntity.ok(updatedProfile.get());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.mandacarubroker.domain.profile;

import com.mandacarubroker.domain.user.MinimumAge;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.Size;

import java.time.LocalDate;

public record RequestProfileDTO(
@Email(message = "The email format is invalid")
String email,
@Size(min = MINIMUM_PASSWORD_LENGTH, message = "Password must be at least 8 characters long")
String password,
String firstName,
String lastName,
@MinimumAge(value = MINIMUM_AGE)
LocalDate birthDate
) {
private static final int MINIMUM_PASSWORD_LENGTH = 8;
private static final int MINIMUM_AGE = 18;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.mandacarubroker.domain.profile;

import java.time.LocalDate;

public record ResponseProfileDTO(
String email,
String username,
String firstName,
String lastName,
LocalDate birthDate
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

import static com.mandacarubroker.domain.user.Permission.STOCKS_UPDATE;
import static com.mandacarubroker.domain.user.Permission.STOCKS_CREATE;
import static com.mandacarubroker.domain.user.Permission.STOCKS_DELETE;
import static com.mandacarubroker.domain.user.Permission.STOCKS_READ;
import static com.mandacarubroker.domain.user.Permission.STOCKS_UPDATE;
import static com.mandacarubroker.domain.user.Permission.USER_DELETE;
import static com.mandacarubroker.domain.user.Permission.STOCKS_DELETE;
import static com.mandacarubroker.domain.user.Permission.USER_CREATE;
import static com.mandacarubroker.domain.user.Permission.USER_READ;
import static com.mandacarubroker.domain.user.Permission.USER_UPDATE;

import static com.mandacarubroker.domain.user.Permission.USER_DELETE;
import static org.springframework.http.HttpMethod.GET;
import static org.springframework.http.HttpMethod.POST;
import static org.springframework.http.HttpMethod.PUT;
Expand Down Expand Up @@ -53,11 +53,11 @@ public SecurityFilterChain securityFilterChain(final HttpSecurity http) throws E
req.requestMatchers(POST, "/stocks").hasAuthority(STOCKS_CREATE.getPermission());
req.requestMatchers(PUT, "/stocks/**").hasAuthority(STOCKS_UPDATE.getPermission());
req.requestMatchers(DELETE, "/stocks/**").hasAuthority(STOCKS_DELETE.getPermission());
req.requestMatchers(POST, "/users").permitAll();
req.requestMatchers(GET, "/users").hasAuthority(USER_READ.getPermission());
req.requestMatchers(GET, "/users/**").hasAuthority(USER_READ.getPermission());
req.requestMatchers(PUT, "/users/**").hasAuthority(USER_UPDATE.getPermission());
req.requestMatchers(DELETE, "/users/**").hasAuthority(USER_DELETE.getPermission());
req.requestMatchers(POST, "/users").hasAuthority(USER_CREATE.getPermission());
req.requestMatchers(GET, "/auth/me").authenticated();
req.anyRequest().authenticated();
})
Expand Down
81 changes: 81 additions & 0 deletions src/main/java/com/mandacarubroker/service/ProfileService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.mandacarubroker.service;

import com.mandacarubroker.domain.profile.RequestProfileDTO;
import com.mandacarubroker.domain.profile.ResponseProfileDTO;
import com.mandacarubroker.domain.user.ResponseUserDTO;
import com.mandacarubroker.domain.user.User;
import com.mandacarubroker.domain.user.UserRepository;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import java.util.Optional;

import static com.mandacarubroker.validation.RecordValidation.validateRequestDTO;

@Service
public class ProfileService {
private final UserRepository userRepository;
private final PasswordHashingService passwordHashingService = new PasswordHashingService();

public ProfileService(final UserRepository receivedUserRepository) {
this.userRepository = receivedUserRepository;
}

private ResponseProfileDTO profileToResponseUserDTO(final User user) {
return new ResponseProfileDTO(
user.getEmail(),
user.getUsername(),
user.getFirstName(),
user.getLastName(),
user.getBirthDate()
);
}

private ResponseUserDTO userToResponseUserDTO(final User user) {
return new ResponseUserDTO(
user.getId(),
user.getEmail(),
user.getUsername(),
user.getFirstName(),
user.getLastName(),
user.getBirthDate(),
user.getBalance()
);
}

public Optional<ResponseUserDTO> findByUsername(final String username) {
Optional<User> user = Optional.ofNullable(userRepository.findByUsername(username));
return user.map(this::userToResponseUserDTO);
}

public Optional<ResponseProfileDTO> updateProfile(final String userName, final RequestProfileDTO requestProfileDTO) {
validateRequestDTO(requestProfileDTO);

final String rawPassword = requestProfileDTO.password();
final String hashedPassword = passwordHashingService.encode(rawPassword);
String userId = findByUsername(userName).get().id();

return userRepository.findById(userId)
.map(user -> {
user.setEmail(requestProfileDTO.email());
user.setFirstName(requestProfileDTO.firstName());
user.setLastName(requestProfileDTO.lastName());
user.setBirthDate(requestProfileDTO.birthDate());
user.setPassword(hashedPassword);
return profileToResponseUserDTO(userRepository.save(user));
});
}
public static User getAuthenticatedUser() {
SecurityContext securityContext = SecurityContextHolder.getContext();
Authentication authentication = securityContext.getAuthentication();

if (authentication == null || !authentication.isAuthenticated()) {
throw new IllegalStateException("User not authenticated");
}

Object principal = authentication.getPrincipal();
return (User) principal;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
ALTER TABLE users ALTER COLUMN first_name TYPE VARCHAR;
ALTER TABLE users ALTER COLUMN last_name TYPE VARCHAR;
ALTER TABLE users ALTER COLUMN balance SET DEFAULT 0.00;
Loading