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
6 changes: 5 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,8 @@ TWILIO_VERIFY_SERVICE_SID=valor-twilio

#Constantes para api de NSFW
X_RAPIDAPI_KEY=chave
X_RAPIDAPI_HOST=nsfw-image-classification1.p.rapidapi.com
X_RAPIDAPI_HOST=nsfw-image-classification1.p.rapidapi.com

#chaves API Mercado Pago
MP_PUBLIC_KEY=chave
MP_ACCESS_TOKEN=chave
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
Expand All @@ -34,6 +35,7 @@
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -104,6 +106,12 @@ public class ClientController {
@Autowired
private ProfessionalMapper professionalMapper;

@Autowired
private PaymentService paymentService;

@Autowired
private PaymentMapper paymentMapper;


/**
* Método que apresenta a tela inicial do cliente
Expand Down Expand Up @@ -786,4 +794,52 @@ public String markAsHided(@PathVariable Long jobId, @PathVariable Long individua

return "redirect:/minha-conta/cliente/meus-pedidos/"+jobId;
}

/**
* Responsável por realizar o pagamento via API Mercado Pago.
*/
@PostMapping("/pagamento")
@RolesAllowed({RoleType.USER})
public ResponseEntity<?> createPayment(@RequestBody Map<String, Object> paymentData){
ResponseDTO response = new ResponseDTO();

try {
if (paymentData == null || paymentData.isEmpty()) {
response.setMessage("Erro ao enviar dados. Verifique os campos e tente novamente!");
return ResponseEntity.status(400).body(response);
}

Optional<User> oUser = (userService.findByEmail(authentication.getEmail()));

if (!oUser.isPresent()) {
response.setMessage("Usuário não autenticado! Por favor, realize sua autenticação no sistema.");
return ResponseEntity.status(401).body(response);
}

ResponseEntity<?> paymentResponse = paymentService.pay(paymentData);

if(!paymentResponse.getStatusCode().is2xxSuccessful()){
response.setMessage("Erro ao processar pagamento. Tente novamente");
return ResponseEntity.status(paymentResponse.getStatusCode()).body(response);
}

Object responseBody = paymentResponse.getBody();

Map<?, ?> responseMap = (Map<?, ?>) responseBody;
Integer paymentId = (Integer) responseMap.get("id");
String status = (String) responseMap.get("status");

PaymentDTO paymentDTO = new PaymentDTO(paymentId, status);
Payment payment = paymentMapper.toEntity(paymentDTO);

paymentService.save(payment);

response.setData(paymentResponse.getBody());
return ResponseEntity.ok(response);

} catch (Exception e) {
response.setMessage("Erro ao fazer pagamento. Por favor, tente novamente.");
return ResponseEntity.status(400).body(response);
}
}
}
20 changes: 20 additions & 0 deletions src/main/java/br/edu/utfpr/servicebook/model/dto/PaymentDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package br.edu.utfpr.servicebook.model.dto;

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

import javax.validation.constraints.NotEmpty;

@Data
@NoArgsConstructor
@AllArgsConstructor

public class PaymentDTO {

@NotEmpty(message = "O identificador do pagamento é obrigatório")
private Integer paymentId;

@NotEmpty(message = "O status do pagamento é obrigatório")
private String status;
}
24 changes: 24 additions & 0 deletions src/main/java/br/edu/utfpr/servicebook/model/entity/Payment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package br.edu.utfpr.servicebook.model.entity;

import lombok.*;

import javax.persistence.*;

@Data
@NoArgsConstructor
@RequiredArgsConstructor
@Table(name = "payments")
@Entity
public class Payment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NonNull
@Column(unique = true)
private Integer paymentId;

@NonNull
@Column()
private String status;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package br.edu.utfpr.servicebook.model.mapper;


import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import br.edu.utfpr.servicebook.model.dto.PaymentDTO;
import br.edu.utfpr.servicebook.model.entity.Payment;

@Component
public class PaymentMapper {

@Autowired
private ModelMapper mapper;

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

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

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

import br.edu.utfpr.servicebook.model.entity.Payment;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface PaymentRepository extends JpaRepository<Payment, Long>{


}

50 changes: 50 additions & 0 deletions src/main/java/br/edu/utfpr/servicebook/service/PaymentService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package br.edu.utfpr.servicebook.service;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import br.edu.utfpr.servicebook.model.entity.Payment;
import br.edu.utfpr.servicebook.model.repository.PaymentRepository;


@Service
public class PaymentService {

private final Environment environment;

@Autowired
private PaymentRepository paymentRepository;

@Autowired
public PaymentService(Environment environment){
this.environment = environment;
}

public ResponseEntity<?> pay(Map<String, Object> paymentData){
RestTemplate restTemplate = new RestTemplate();
String apiUrl = "https://api.mercadopago.com/v1/payments";

try {
String accessToken = environment.getProperty("MP_ACCESS_TOKEN");

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setBearerAuth(accessToken);

HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(paymentData, headers);

ResponseEntity<?> response = restTemplate.exchange(apiUrl, HttpMethod.POST, requestEntity, Object.class);
return response;

} catch (Exception e) {
throw new RuntimeException("Algo deu errado! Tente novamente.");
}

}

public Payment save(Payment entity){ return paymentRepository.save(entity); }
}
Loading