Skip to content
Open
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
@@ -1,21 +1,23 @@
package br.edu.utfpr.servicebook.controller;

import br.edu.utfpr.servicebook.model.dto.*;
import br.edu.utfpr.servicebook.model.entity.City;
import br.edu.utfpr.servicebook.model.entity.Individual;
import br.edu.utfpr.servicebook.model.entity.User;
import br.edu.utfpr.servicebook.model.entity.UserCode;
import br.edu.utfpr.servicebook.model.entity.*;
import br.edu.utfpr.servicebook.model.mapper.*;
import br.edu.utfpr.servicebook.security.IAuthentication;
import br.edu.utfpr.servicebook.security.RoleType;
import br.edu.utfpr.servicebook.service.*;
import br.edu.utfpr.servicebook.util.UserTemplateInfo;
import br.edu.utfpr.servicebook.util.TemplateUtil;
import br.edu.utfpr.servicebook.util.UserWizardUtil;
import org.apache.coyote.Response;
import org.cloudinary.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
Expand All @@ -26,8 +28,11 @@
import javax.annotation.security.RolesAllowed;
import javax.persistence.EntityNotFoundException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@RequestMapping("/minha-conta")
@Controller
Expand Down Expand Up @@ -72,6 +77,16 @@ public class MyAccountController {
@Autowired
private TemplateUtil templateUtil;

@Autowired
private UserWizardUtil userWizardUtil;

@Autowired
private AddressMapper addressMapper;
@Autowired
private StateService stateService;
@Autowired
private StateMapper stateMapper;

@GetMapping
public String home(HttpServletRequest request) {
return "redirect:/minha-conta/cliente";
Expand Down Expand Up @@ -186,8 +201,139 @@ public ModelAndView showMyEmail(@PathVariable Long id) throws IOException {
return mv;
}

//edita endereço

/**
* Apresenta a tela de endereço do usuário.
* @param id
* @return
* @throws IOException
*/
@GetMapping("/meu-endereco/{id}")
@RolesAllowed({RoleType.USER, RoleType.COMPANY})
public String showMyAddress(@PathVariable Long id, Model model) throws IOException {

Optional<User> oUser = this.userService.findById(id);

if (!oUser.isPresent()) {
throw new EntityNotFoundException("Usuário não encontrado pelo id informado.");
}

Optional<User> oUserAuthenticated = this.userService.findByEmail(authentication.getEmail());
if(!oUserAuthenticated.isPresent()){
throw new AuthenticationCredentialsNotFoundException("Usuário não autenticado! Por favor, realize sua autenticação no sistema.");
}

User userAuthenticated = oUserAuthenticated.get();

//verifica se o usuario autenticado é o mesmo que está tentando atualizar as informações
if (id != userAuthenticated.getId()) {
throw new AuthenticationCredentialsNotFoundException("Você não tem permissão para atualizar essas informações");
}

Address address = userAuthenticated.getAddress();
City city = address.getCity();
State state = city.getState();

UserDTO userDTO = userMapper.toDto(oUser.get());

List<City> cities = this.cityService.findAll();
List<State> states = this.stateService.findAll();

model.addAttribute("professional", userDTO);
model.addAttribute("cities", cities);
model.addAttribute("states", states);

return "professional/account/my-address";
}


/**
* @param id
* @param redirectAttributes
* @return
* @throws IOException
*/
@PatchMapping("/meu-endereco/{id}")
@RolesAllowed({RoleType.USER, RoleType.COMPANY})
public String saveAddress(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

É preciso receber um DTO como parâmetro para persistência

@PathVariable Long id,
@Validated AddressUpdateDTO dto,
BindingResult errors,
RedirectAttributes redirectAttributes)
throws IOException {

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Faltou usar o errors para mandar os erros de validação ao cliente, quando houver

Optional<User> oUser = this.userService.findById(id);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verificar se o id recebido por parâmetro é o mesmo do usuário logado.


if (!oUser.isPresent()) {
throw new EntityNotFoundException("Usuário não encontrado pelo id informado.");
}

Optional<User> oUserAuthenticated = this.userService.findByEmail(authentication.getEmail());
if(!oUserAuthenticated.isPresent()){
throw new AuthenticationCredentialsNotFoundException("Usuário não autenticado! Por favor, realize sua autenticação no sistema.");
}

User userAuthenticated = oUserAuthenticated.get();

//verifica se o usuario autenticado é o mesmo que está tentando atualizar as informações
if (id != userAuthenticated.getId()) {
throw new AuthenticationCredentialsNotFoundException("Você não tem permissão para atualizar essas informações");
}

//verifica se o estado está cadastrado
if(!stateService.findById(dto.getState()).isPresent()){
errors.rejectValue("state", "error.dto", "Estado não cadastrado! Por favor, insira um estado cadastrado.");
redirectAttributes.addFlashAttribute("errors", errors.getAllErrors());
return "redirect:/minha-conta/meu-endereco/{id}";
}

//verifica se a cidade existe para o estado informado
if(!cityService.findByIdAndState_Id(dto.getCity(), dto.getState()).isPresent()){
errors.rejectValue("city", "error.dto", "Cidade não cadastrada para o estado informado! Por favor, insira uma cidade cadastrada.");
redirectAttributes.addFlashAttribute("errors", errors.getAllErrors());
return "redirect:/minha-conta/meu-endereco/{id}";
}

try {
//atualiza o endereço do usuário
Address address = userAuthenticated.getAddress();
address.setCity(cityService.findById(dto.getCity()).get());
address.setStreet(dto.getStreet().trim());
address.setNumber(dto.getNumber().trim());
address.setPostalCode(dto.getPostalCode().trim());
address.setNeighborhood(dto.getNeighborhood().trim());

userAuthenticated.setAddress(address);

this.userService.save(userAuthenticated);
redirectAttributes.addFlashAttribute("msg", "Endereço editado com sucesso");
} catch (Exception exception) {
errors.rejectValue(null, "not-found", "Erro ao editar endereço: " + exception.getMessage());
redirectAttributes.addFlashAttribute("errors", errors.getAllErrors());
return "redirect:/minha-conta/meu-endereco/{id}";
}

return "redirect:/minha-conta/meu-endereco/{id}";
}

@PostMapping("/meu-endereco/{id}")
@RolesAllowed({RoleType.USER, RoleType.ADMIN})
@ResponseBody
public ResponseEntity<?> getExpertiseData(@PathVariable("id") Long userId, @RequestBody String data,BindingResult errors,
RedirectAttributes redirectAttributes) {
Response response = new Response();
Optional<User> oUser = this.userService.findById(userId);
JSONObject jsonObject = new JSONObject(data);
if(!cityService.findByName(jsonObject.getString("localidade")).isPresent()){
response.setMessage("Cidade não cadastrada! Por favor, insira uma cidade cadastrada.");
return ResponseEntity.status(401).body(response.getMessage());
}
response.setMessage("Cidade cadastrada no sistema!!");
return ResponseEntity.status(200).body(response.getMessage());
}

/**
* FIXME Ao mudar o email, fazer logout para o usuário logar novamente, aí com o novo email
* @param id
* @param request
* @param redirectAttributes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -604,7 +604,7 @@ public String saveUserNameAndCNPJ(
@PermitAll
public String saveUserAddress(
HttpSession httpSession,
@Validated(AddressDTO.RequestUserAddressInfoGroupValidation.class) AddressDTO dto,
@Validated AddressDTO dto,
BindingResult errors,
RedirectAttributes redirectAttributes,
Model model
Expand Down Expand Up @@ -686,8 +686,7 @@ public String saveUser(
IndividualDTO.RequestUserEmailInfoGroupValidation.class,
IndividualDTO.RequestUserPasswordInfoGroupValidation.class,
IndividualDTO.RequestUserPhoneInfoGroupValidation.class,
IndividualDTO.RequestUserNameAndCNPJInfoGroupValidation.class,
AddressDTO.RequestUserAddressInfoGroupValidation.class
IndividualDTO.RequestUserNameAndCNPJInfoGroupValidation.class
});

if (errors.hasErrors()) {
Expand All @@ -705,8 +704,7 @@ public String saveUser(
IndividualDTO.RequestUserEmailInfoGroupValidation.class,
IndividualDTO.RequestUserPasswordInfoGroupValidation.class,
IndividualDTO.RequestUserPhoneInfoGroupValidation.class,
IndividualDTO.RequestUserNameAndCPFInfoGroupValidation.class,
AddressDTO.RequestUserAddressInfoGroupValidation.class
IndividualDTO.RequestUserNameAndCPFInfoGroupValidation.class
});

if (errors.hasErrors()) {
Expand Down
14 changes: 5 additions & 9 deletions src/main/java/br/edu/utfpr/servicebook/model/dto/AddressDTO.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,22 @@
@AllArgsConstructor
public class AddressDTO implements Serializable {

@NotBlank(message = "Rua inválida! Por favor, insira a rua do endereço.", groups = AddressDTO.RequestUserAddressInfoGroupValidation.class)
@NotBlank(message = "Rua inválida! Por favor, insira a rua do endereço.")
private String street;

@NotBlank(message = "Número inválido! Por favor, insira o número do endereço.", groups = AddressDTO.RequestUserAddressInfoGroupValidation.class)
private String number;

@NotBlank(message = "CEP inválido! Por favor, insira o CEP do endereço.", groups = AddressDTO.RequestUserAddressInfoGroupValidation.class)
@NotBlank(message = "CEP inválido! Por favor, insira o CEP do endereço.")
private String postalCode;

@NotBlank(message = "Bairro inválido! Por favor, insira o bairro do endereço.", groups = AddressDTO.RequestUserAddressInfoGroupValidation.class)
@NotBlank(message = "Bairro inválido! Por favor, insira o bairro do endereço.")
private String neighborhood;

@NotBlank(message = "Cidade Inválida! Por favor, insira a cidade do endereço.", groups = AddressDTO.RequestUserAddressInfoGroupValidation.class)
@NotBlank(message = "Cidade Inválida! Por favor, insira a cidade do endereço.")
private String city;

@NotBlank(message = "Estado inválido! Por favor, insira o estado do endereço.", groups = AddressDTO.RequestUserAddressInfoGroupValidation.class)
@NotBlank(message = "Estado inválido! Por favor, insira o estado do endereço.")
private String state;

public interface RequestUserAddressInfoGroupValidation {

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,21 @@
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class AddressFullDTO implements Serializable {

@NotBlank(message = "Por favor, insira o nome da rua.")
private String street;
private String number;
@NotBlank(message = "Por favor, insira o CEP.")
private String postalCode;
private String neighborhood;
@NotNull(message = "Por favor, selecione uma cidade.")
private CityMidDTO city;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package br.edu.utfpr.servicebook.model.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class AddressUpdateDTO implements Serializable {

@NotBlank(message = "Rua inválida! Por favor, insira a rua do endereço.")
private String street;

private String number;

@NotBlank(message = "CEP inválido! Por favor, insira o CEP do endereço.")
private String postalCode;

@NotBlank(message = "Bairro inválido! Por favor, insira o bairro do endereço.")
private String neighborhood;

@NotNull(message = "Cidade Inválida! Por favor, insira a cidade do endereço.")
private Long city;

@NotNull(message = "Estado inválido! Por favor, insira o estado do endereço.")
private Long state;


}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
@AllArgsConstructor
public class StateMinDTO implements Serializable {

private Long id;
private String uf;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package br.edu.utfpr.servicebook.model.mapper;

import br.edu.utfpr.servicebook.model.dto.AddressDTO;
import br.edu.utfpr.servicebook.model.dto.UserDTO;
import br.edu.utfpr.servicebook.model.entity.Address;
import br.edu.utfpr.servicebook.model.entity.City;
import br.edu.utfpr.servicebook.model.entity.User;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class AddressMapper {

@Autowired
private ModelMapper mapper;

public AddressDTO toDto(Address entity) {
AddressDTO dto = mapper.map(entity, AddressDTO.class);
return dto;
}

public Address toEntity(AddressDTO dto) {
Address entity = mapper.map(dto, Address.class);
return entity;
}

public Address toUpdate(AddressDTO dto, Long id, City city) {
Address entity = mapper.map(dto, Address.class);
entity.setId(id);
entity.setCity(city);
return entity;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,7 @@ public interface CityRepository extends JpaRepository<City, Long> {

Optional<City> findByName(String name);

Optional<City> findByIdAndState(Long id, State state);
Optional<City> findByIdAndState_Id(Long cityId, Long stateId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,14 @@ public Optional<City> findByNameAndState(String name, State state){
return this.cityRepository.findByNameAndState(name, state);
}

public Optional<City> findByIdAndState(Long id, State state){
return this.cityRepository.findByIdAndState(id, state);
}

public Optional<City> findByIdAndState_Id(Long cityId, Long stateId){
return this.cityRepository.findByIdAndState_Id(cityId, stateId);
}

public Optional<City> findByName(String name){
return this.cityRepository.findByName(name);
}
Expand Down
Loading