Skip to content

Commit

Permalink
Associate to PAYPAL wallet
Browse files Browse the repository at this point in the history
  • Loading branch information
gabcamilo committed May 31, 2021
1 parent 10998e4 commit 610d59d
Show file tree
Hide file tree
Showing 9 changed files with 223 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package br.com.zupacademy.gabriela.proposal.creditCard.wallet;

import br.com.zupacademy.gabriela.proposal.creditCard.CreditCard;
import com.fasterxml.jackson.annotation.JsonProperty;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;

public class AssociateWalletRequest {
private final String email;

@NotBlank
@Email
public AssociateWalletRequest(@JsonProperty("email") String email) {
this.email = email;
}

public CreditCardWallet convert(CreditCard creditCard, Wallets wallets){
return new CreditCardWallet(creditCard, wallets, email);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package br.com.zupacademy.gabriela.proposal.creditCard.wallet;

public class AssociateWalletResponse {

private final Long id;
private final Wallets wallet;
private final String email;
private final String creditCardNumber;
private final Long creditCardId;


public AssociateWalletResponse(CreditCardWallet creditCardWallet) {
this.id = creditCardWallet.getId();
this.wallet = creditCardWallet.getWallet();
this.email = creditCardWallet.getEmailObfuscated();
this.creditCardNumber = creditCardWallet.getCreditCardNumberObfuscated();
this.creditCardId = creditCardWallet.getCreditCardId();
}

public Long getId() {
return id;
}

public Wallets getWallet() {
return wallet;
}

public String getEmail() {
return email;
}

public String getCreditCardNumber() {
return creditCardNumber;
}

public Long getCreditCardId() {
return creditCardId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package br.com.zupacademy.gabriela.proposal.creditCard.wallet;

import br.com.zupacademy.gabriela.proposal.creditCard.CreditCard;

import javax.persistence.*;

import static javax.persistence.GenerationType.SEQUENCE;

@Entity
public class CreditCardWallet {
@Id
@SequenceGenerator(
name = "credit_card_wallet_id_sequence",
sequenceName = "credit_card_wallet_id_sequence",
allocationSize = 1
)
@GeneratedValue(strategy = SEQUENCE, generator = "credit_card_wallet_id_sequence")
private Long id;

@OneToOne
@JoinColumn(
foreignKey = @ForeignKey(name = "credit_card_wallet_fk")
)
private CreditCard creditCard;

private Wallets wallet;

private String email;

public CreditCardWallet(CreditCard creditCard, Wallets wallet, String email) {
this.creditCard = creditCard;
this.wallet = wallet;
this.email = email;
}

@Deprecated
protected CreditCardWallet() {
}

public Long getId() {
return id;
}

public Wallets getWallet() {
return wallet;
}

public String getEmail() {
return email;
}

public String getEmailObfuscated() {
return email;
}

public String getCreditCardNumberObfuscated() {
return creditCard.getNumberObfuscated();
}

public Long getCreditCardId() {
return creditCard.getId();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package br.com.zupacademy.gabriela.proposal.creditCard.wallet;

import br.com.zupacademy.gabriela.proposal.creditCard.CreditCard;
import br.com.zupacademy.gabriela.proposal.creditCard.CreditCardService;
import br.com.zupacademy.gabriela.proposal.services.CreditCardService.AssociateWalletExternalApiRequest;
import br.com.zupacademy.gabriela.proposal.services.CreditCardService.CreditCardApiClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
@RequestMapping("/api/credit-cards/{creditCardId}/wallet/{wallet}")
public class CreditCardWalletController {

private final CreditCardService creditCardService;
private final CreditCardApiClient creditCardApiClient;
private final CreditCardWalletRepository cardWalletRepository;

@Autowired
public CreditCardWalletController(CreditCardService creditCardService, CreditCardApiClient creditCardApiClient, CreditCardWalletRepository cardWalletRepository) {
this.creditCardService = creditCardService;
this.creditCardApiClient = creditCardApiClient;
this.cardWalletRepository = cardWalletRepository;
}

@PostMapping
ResponseEntity<AssociateWalletResponse> associateWallet(
@PathVariable Long creditCardId,
@PathVariable Wallets wallet,
@Valid @RequestBody AssociateWalletRequest request) throws Exception {

CreditCard creditCard = creditCardService.obtainCreditCard(creditCardId);

CreditCardWallet creditCardWallet = request.convert(creditCard, wallet);
AssociateWalletExternalApiRequest associateWalletExternalApiRequest = new AssociateWalletExternalApiRequest(creditCardWallet.getEmail(), wallet);

String number = creditCard.getNumber();

creditCardApiClient.associateWallet(number, associateWalletExternalApiRequest);

cardWalletRepository.save(creditCardWallet);

return ResponseEntity.ok(new AssociateWalletResponse(creditCardWallet));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package br.com.zupacademy.gabriela.proposal.creditCard.wallet;

import org.springframework.data.repository.CrudRepository;

public interface CreditCardWalletRepository extends CrudRepository<CreditCardWallet, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package br.com.zupacademy.gabriela.proposal.creditCard.wallet;

public enum Wallets {
PAYPAL
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package br.com.zupacademy.gabriela.proposal.services.CreditCardService;

import br.com.zupacademy.gabriela.proposal.creditCard.wallet.Wallets;
import com.fasterxml.jackson.annotation.JsonProperty;

public class AssociateWalletExternalApiRequest {
private final String email;
private final String carteira;

public AssociateWalletExternalApiRequest(@JsonProperty("email") String email, Wallets carteira) {
this.email = email;
this.carteira = carteira.toString();
}

public String getEmail() {
return email;
}

public String getCarteira() {
return carteira;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,6 @@ public interface CreditCardApiClient {
@PostMapping("/{id}/avisos")
void createCreditCardTravelAlert(@PathVariable("id") String id, CreditCardTravelAlertExternalApiRequest request);

@PostMapping("/{id}/carteiras")
void associateWallet(@PathVariable("id") String id, AssociateWalletExternalApiRequest request);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package br.com.zupacademy.gabriela.proposal.shared.exception;

import feign.FeignException;
import javassist.NotFoundException;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
Expand All @@ -11,11 +12,9 @@
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.NoSuchElementException;

@RestControllerAdvice
public class ApiExceptionHandlerAdvice {
Expand Down Expand Up @@ -63,6 +62,22 @@ public ResponseEntity<HttpErrorResponse> handle(HttpClientErrorException excepti
return ResponseEntity.status(exception.getStatusCode()).body(response);
}

@ExceptionHandler(MethodArgumentTypeMismatchException.class)
public ResponseEntity<?> handle(MethodArgumentTypeMismatchException exception) {

if(exception.getName().equals("walletEnum")){
return handle(new FieldErrorException("wallet", exception.getValue() + " wallet does not exist", HttpStatus.BAD_REQUEST));
}

// Defensive programming, but it must never get to this generic message return bellow
return handle(new FieldErrorException(exception.getName(), exception.getValue() + " is not a valid argument", HttpStatus.BAD_REQUEST));
}

@ExceptionHandler(FeignException.class)
public ResponseEntity<?> handle(FeignException exception) {
return ResponseEntity.unprocessableEntity().build();
}

private String getErrorMessage(ObjectError error) {
return messageSource.getMessage(error, LocaleContextHolder.getLocale());
}
Expand Down

0 comments on commit 610d59d

Please sign in to comment.