diff --git a/clientui/pom.xml b/clientui/pom.xml index 220cfae..65155ba 100644 --- a/clientui/pom.xml +++ b/clientui/pom.xml @@ -22,6 +22,7 @@ UTF-8 UTF-8 1.8 + Finchley.M8 @@ -40,6 +41,11 @@ 4.0.0-2 + + org.springframework.cloud + spring-cloud-starter-openfeign + + org.springframework.boot @@ -48,6 +54,18 @@ + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + @@ -57,5 +75,16 @@ + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + diff --git a/clientui/src/main/java/com/clientui/ClientUiApplication.java b/clientui/src/main/java/com/clientui/ClientUiApplication.java index 7137e51..1b322c4 100644 --- a/clientui/src/main/java/com/clientui/ClientUiApplication.java +++ b/clientui/src/main/java/com/clientui/ClientUiApplication.java @@ -2,8 +2,10 @@ package com.clientui; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication +@EnableFeignClients("com.clientui") public class ClientUiApplication { public static void main(String[] args) { diff --git a/clientui/src/main/java/com/clientui/beans/CommandeBean.java b/clientui/src/main/java/com/clientui/beans/CommandeBean.java new file mode 100644 index 0000000..bc3dfb1 --- /dev/null +++ b/clientui/src/main/java/com/clientui/beans/CommandeBean.java @@ -0,0 +1,71 @@ +package com.clientui.beans; + +import java.util.Date; + + +public class CommandeBean { + + private int id; + + private Integer productId; + + private Date dateCommande; + + private Integer quantite; + + private Boolean commandePayee; + + public CommandeBean() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Integer getProductId() { + return productId; + } + + public void setProductId(Integer productId) { + this.productId = productId; + } + + public Date getDateCommande() { + return dateCommande; + } + + public void setDateCommande(Date dateCommande) { + this.dateCommande = dateCommande; + } + + public Integer getQuantite() { + return quantite; + } + + public void setQuantite(Integer quantite) { + this.quantite = quantite; + } + + public Boolean getCommandePayee() { + return commandePayee; + } + + public void setCommandePayee(Boolean commandePayee) { + this.commandePayee = commandePayee; + } + + @Override + public String toString() { + return "CommandeBean{" + + "id=" + id + + ", productId=" + productId + + ", dateCommande=" + dateCommande + + ", quantite=" + quantite + + ", commandePayee=" + commandePayee + + '}'; + } +} diff --git a/clientui/src/main/java/com/clientui/beans/PaiementBean.java b/clientui/src/main/java/com/clientui/beans/PaiementBean.java new file mode 100644 index 0000000..e4fe177 --- /dev/null +++ b/clientui/src/main/java/com/clientui/beans/PaiementBean.java @@ -0,0 +1,58 @@ +package com.clientui.beans; + + +public class PaiementBean { + + private int id; + + private Integer idCommande; + + private Double montant; + + private Long numeroCarte; + + public PaiementBean() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Integer getIdCommande() { + return idCommande; + } + + public void setIdCommande(Integer idCommande) { + this.idCommande = idCommande; + } + + public Double getMontant() { + return montant; + } + + public void setMontant(Double montant) { + this.montant = montant; + } + + public Long getNumeroCarte() { + return numeroCarte; + } + + public void setNumeroCarte(Long numeroCarte) { + this.numeroCarte = numeroCarte; + } + + @Override + public String toString() { + return "PaiementBean{" + + "id=" + id + + ", idCommande=" + idCommande + + ", montant=" + montant + + ", numeroCarte=" + numeroCarte + + '}'; + } +} diff --git a/clientui/src/main/java/com/clientui/beans/ProductBean.java b/clientui/src/main/java/com/clientui/beans/ProductBean.java new file mode 100644 index 0000000..381f995 --- /dev/null +++ b/clientui/src/main/java/com/clientui/beans/ProductBean.java @@ -0,0 +1,69 @@ +package com.clientui.beans; + + +public class ProductBean { + + private int id; + + private String titre; + + private String description; + + private String image; + + private Double prix; + + public ProductBean() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitre() { + return titre; + } + + public void setTitre(String titre) { + this.titre = titre; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public Double getPrix() { + return prix; + } + + public void setPrix(Double prix) { + this.prix = prix; + } + + @Override + public String toString() { + return "ProductBean{" + + "id=" + id + + ", titre='" + titre + '\'' + + ", description='" + description + '\'' + + ", image='" + image + '\'' + + ", prix=" + prix + + '}'; + } +} diff --git a/clientui/src/main/java/com/clientui/controller/ClientController.java b/clientui/src/main/java/com/clientui/controller/ClientController.java index 93c7997..f427d0f 100644 --- a/clientui/src/main/java/com/clientui/controller/ClientController.java +++ b/clientui/src/main/java/com/clientui/controller/ClientController.java @@ -1,18 +1,124 @@ package com.clientui.controller; +import com.clientui.beans.CommandeBean; +import com.clientui.beans.PaiementBean; +import com.clientui.beans.ProductBean; +import com.clientui.proxies.MicroserviceCommandeProxy; +import com.clientui.proxies.MicroservicePaiementProxy; +import com.clientui.proxies.MicroserviceProduitsProxy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.client.RestTemplate; +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + @Controller public class ClientController { + @Autowired + private MicroserviceProduitsProxy ProduitsProxy; + + @Autowired + private MicroserviceCommandeProxy CommandesProxy; + + @Autowired + private MicroservicePaiementProxy paiementProxy; + + + /* + * Étape (1) + * Opération qui récupère la liste des produits et on les affichent dans la page d'accueil. + * Les produits sont récupérés grâce à ProduitsProxy + * On fini par rentourner la page Accueil.html à laquelle on passe la liste d'objets "produits" récupérés. + * */ @RequestMapping("/") public String accueil(Model model){ + List produits = ProduitsProxy.listeDesProduits(); + + model.addAttribute("produits", produits); + return "Accueil"; } + /* + * Étape (2) + * Opération qui récupère les détails d'un produit + * On passe l'objet "produit" récupéré et qui contient les détails en question à FicheProduit.html + * */ + @RequestMapping("/details-produit/{id}") + public String ficheProduit(@PathVariable int id, Model model){ + + ProductBean produit = ProduitsProxy.recupererUnProduit(id); + + model.addAttribute("produit", produit); + + return "FicheProduit"; + } + + /* + * Étape (3) et (4) + * Opération qui fait appel au microservice de commande pour placer une commande et récupérer les détails de la commande créée + * */ + @RequestMapping(value = "/commander-produit/{idProduit}/{montant}") + public String passerCommande(@PathVariable int idProduit, @PathVariable Double montant, Model model){ + + + CommandeBean commande = new CommandeBean(); + + //On renseigne les propriétés de l'objet de type CommandeBean que nous avons crée + commande.setProductId(idProduit); + commande.setQuantite(1); + commande.setDateCommande(new Date()); + + //appel du microservice commandes grâce à Feign et on récupère en retour les détails de la commande créée, notamment son ID (étape 4). + CommandeBean commandeAjoutee = CommandesProxy.ajouterCommande(commande); + + //on passe à la vue l'objet commande et le montant de celle-ci afin d'avoir les informations nécessaire pour le paiement + model.addAttribute("commande", commandeAjoutee); + model.addAttribute("montant", montant); + + return "Paiement"; + } + + /* + * Étape (5) + * Opération qui fait appel au microservice de paiement pour traiter un paiement + * */ + @RequestMapping(value = "/payer-commande/{idCommande}/{montantCommande}") + public String payerCommande(@PathVariable int idCommande, @PathVariable Double montantCommande, Model model){ + + PaiementBean paiementAExcecuter = new PaiementBean(); + + //on reseigne les détails du produit + paiementAExcecuter.setIdCommande(idCommande); + paiementAExcecuter.setMontant(montantCommande); + paiementAExcecuter.setNumeroCarte(numcarte()); // on génère un numéro au hasard pour simuler une CB + + // On appel le microservice et (étape 7) on récupère le résultat qui est sous forme ResponseEntity ce qui va nous permettre de vérifier le code retour. + ResponseEntity paiement = paiementProxy.payerUneCommande(paiementAExcecuter); + + Boolean paiementAccepte = false; + //si le code est autre que 201 CREATED, c'est que le paiement n'a pas pu aboutir. + if(paiement.getStatusCode() == HttpStatus.CREATED) + paiementAccepte = true; + + model.addAttribute("paiementOk", paiementAccepte); // on envoi un Boolean paiementOk à la vue + + return "confirmation"; + } + + //Génére une serie de 16 chiffres au hasard pour simuler vaguement une CB + private Long numcarte() { + + return ThreadLocalRandom.current().nextLong(1000000000000000L,9000000000000000L ); + } } diff --git a/clientui/src/main/java/com/clientui/proxies/MicroserviceCommandeProxy.java b/clientui/src/main/java/com/clientui/proxies/MicroserviceCommandeProxy.java new file mode 100644 index 0000000..85dbfc8 --- /dev/null +++ b/clientui/src/main/java/com/clientui/proxies/MicroserviceCommandeProxy.java @@ -0,0 +1,14 @@ +package com.clientui.proxies; + +import com.clientui.beans.CommandeBean; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(name = "microservice-commandes", url = "localhost:9002") +public interface MicroserviceCommandeProxy { + + @PostMapping(value = "/commandes") + CommandeBean ajouterCommande(@RequestBody CommandeBean commande); +} diff --git a/clientui/src/main/java/com/clientui/proxies/MicroservicePaiementProxy.java b/clientui/src/main/java/com/clientui/proxies/MicroservicePaiementProxy.java new file mode 100644 index 0000000..1b77082 --- /dev/null +++ b/clientui/src/main/java/com/clientui/proxies/MicroservicePaiementProxy.java @@ -0,0 +1,15 @@ +package com.clientui.proxies; + +import com.clientui.beans.PaiementBean; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(name = "microservice-paiement", url = "localhost:9003") +public interface MicroservicePaiementProxy { + + @PostMapping(value = "/paiement") + ResponseEntity payerUneCommande(@RequestBody PaiementBean paiement); + +} diff --git a/clientui/src/main/java/com/clientui/proxies/MicroserviceProduitsProxy.java b/clientui/src/main/java/com/clientui/proxies/MicroserviceProduitsProxy.java new file mode 100644 index 0000000..94c1dda --- /dev/null +++ b/clientui/src/main/java/com/clientui/proxies/MicroserviceProduitsProxy.java @@ -0,0 +1,25 @@ +package com.clientui.proxies; + +import com.clientui.beans.ProductBean; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.List; +import java.util.Optional; + +@FeignClient(name = "microservice-produits", url = "localhost:9001") +public interface MicroserviceProduitsProxy { + + @GetMapping(value = "/Produits") + List listeDesProduits(); + + /* + * Notez ici la notation @PathVariable("id") qui est différente de celle qu'on utlise dans le contrôleur + **/ + @GetMapping( value = "/Produits/{id}") + ProductBean recupererUnProduit(@PathVariable("id") int id); + + + +} diff --git a/clientui/src/main/resources/templates/Accueil.html b/clientui/src/main/resources/templates/Accueil.html index 3daabfa..be2d91e 100644 --- a/clientui/src/main/resources/templates/Accueil.html +++ b/clientui/src/main/resources/templates/Accueil.html @@ -11,7 +11,20 @@
-

Application Mcommerce

+

Application Mcommerce

+ +
+ + + +
diff --git a/clientui/src/main/resources/templates/Confirmation.html b/clientui/src/main/resources/templates/Confirmation.html new file mode 100644 index 0000000..e754988 --- /dev/null +++ b/clientui/src/main/resources/templates/Confirmation.html @@ -0,0 +1,39 @@ + + + + Mcommerce + + + + + + + +
+ +

Application Mcommerce

+ +
+
+ +

+ Paiement Accepté +

+ +

+ Le paiement n'a pas abouti +

+ + + +
+
+ +
+ + + + + + \ No newline at end of file diff --git a/clientui/src/main/resources/templates/FicheProduit.html b/clientui/src/main/resources/templates/FicheProduit.html new file mode 100644 index 0000000..3e2692e --- /dev/null +++ b/clientui/src/main/resources/templates/FicheProduit.html @@ -0,0 +1,39 @@ + + + + Mcommerce + + + + + + + +
+ +

Application Mcommerce

+ +
+
+ + + +

+ +

+ +

+ COMMANDER +

+ +
+
+ +
+ + + + + + \ No newline at end of file diff --git a/clientui/src/main/resources/templates/Paiement.html b/clientui/src/main/resources/templates/Paiement.html new file mode 100644 index 0000000..7fbb89c --- /dev/null +++ b/clientui/src/main/resources/templates/Paiement.html @@ -0,0 +1,43 @@ + + + + Mcommerce + + + + + + + +
+ +

Application Mcommerce

+ +
+
+ +

+ Ici l'utilisateur sélectionne en temps normal un moyen de paiement et entre les informations de sa carte bancaire.
+ Nous allons éviter d'ajouter les formulaires nécessaireS afin de garder l'application la plus basique et simple possible pour la suite.
+ Si vous vous sentez à l'aise, vous pouvez créer un formulaire pour accepter le numéro de la CB, que vous traiterez dans le contrôleur grâce à + un PostMapping. +

+ + +

+ Payer Ma Commande +

+ + + +
+
+ +
+ + + + + + \ No newline at end of file diff --git a/microservice-commandes/src/main/java/com/mcommandes/web/controller/CommandeController.java b/microservice-commandes/src/main/java/com/mcommandes/web/controller/CommandeController.java index a578723..7a5dbd8 100644 --- a/microservice-commandes/src/main/java/com/mcommandes/web/controller/CommandeController.java +++ b/microservice-commandes/src/main/java/com/mcommandes/web/controller/CommandeController.java @@ -37,4 +37,15 @@ public class CommandeController { return commande; } + + /* + * Permet de mettre à jour une commande existante. + * save() mettra à jours uniquement les champs renseignés dans l'objet commande reçu. Ainsi dans ce cas, comme le champs date dans "commande" n'est + * pas renseigné, la date précédemment enregistrée restera en place + **/ + @PutMapping(value = "/commandes") + public void updateCommande(@RequestBody Commande commande) { + + commandesDao.save(commande); + } } diff --git a/microservice-commandes/src/main/resources/application.properties b/microservice-commandes/src/main/resources/application.properties index 3d785cf..76d2a9f 100644 --- a/microservice-commandes/src/main/resources/application.properties +++ b/microservice-commandes/src/main/resources/application.properties @@ -1,3 +1,4 @@ +spring.application.name=microservice-commandes server.port 9002 diff --git a/microservice-paiement/pom.xml b/microservice-paiement/pom.xml index 22dad47..5090803 100644 --- a/microservice-paiement/pom.xml +++ b/microservice-paiement/pom.xml @@ -22,6 +22,7 @@ UTF-8 UTF-8 1.8 + Finchley.M8 @@ -42,6 +43,11 @@ runtime + + org.springframework.cloud + spring-cloud-starter-openfeign + + org.springframework.boot spring-boot-starter-test @@ -49,6 +55,18 @@ + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + @@ -58,5 +76,15 @@ + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + diff --git a/microservice-paiement/src/main/java/com/mpaiement/MpaiementApplication.java b/microservice-paiement/src/main/java/com/mpaiement/MpaiementApplication.java index cdfe616..14c9421 100644 --- a/microservice-paiement/src/main/java/com/mpaiement/MpaiementApplication.java +++ b/microservice-paiement/src/main/java/com/mpaiement/MpaiementApplication.java @@ -2,8 +2,10 @@ package com.mpaiement; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication +@EnableFeignClients("com.mpaiement") public class MpaiementApplication { public static void main(String[] args) { diff --git a/microservice-paiement/src/main/java/com/mpaiement/beans/CommandeBean.java b/microservice-paiement/src/main/java/com/mpaiement/beans/CommandeBean.java new file mode 100644 index 0000000..bafd55f --- /dev/null +++ b/microservice-paiement/src/main/java/com/mpaiement/beans/CommandeBean.java @@ -0,0 +1,70 @@ +package com.mpaiement.beans; + +import java.util.Date; + +public class CommandeBean { + + private int id; + + private Integer productId; + + private Date dateCommande; + + private Integer quantite; + + private Boolean commandePayee; + + public CommandeBean() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Integer getProductId() { + return productId; + } + + public void setProductId(Integer productId) { + this.productId = productId; + } + + public Date getDateCommande() { + return dateCommande; + } + + public void setDateCommande(Date dateCommande) { + this.dateCommande = dateCommande; + } + + public Integer getQuantite() { + return quantite; + } + + public void setQuantite(Integer quantite) { + this.quantite = quantite; + } + + public Boolean getCommandePayee() { + return commandePayee; + } + + public void setCommandePayee(Boolean commandePayee) { + this.commandePayee = commandePayee; + } + + @Override + public String toString() { + return "CommandeBean{" + + "id=" + id + + ", productId=" + productId + + ", dateCommande=" + dateCommande + + ", quantite=" + quantite + + ", commandePayee=" + commandePayee + + '}'; + } +} \ No newline at end of file diff --git a/microservice-paiement/src/main/java/com/mpaiement/model/Paiement.java b/microservice-paiement/src/main/java/com/mpaiement/model/Paiement.java index 70e799c..0a1cc23 100644 --- a/microservice-paiement/src/main/java/com/mpaiement/model/Paiement.java +++ b/microservice-paiement/src/main/java/com/mpaiement/model/Paiement.java @@ -15,14 +15,14 @@ public class Paiement { @Column(unique = true) private Integer idCommande; - private Integer montant; + private Double montant; private Long numeroCarte; public Paiement() { } - public Paiement(int id, Integer idCommande, Integer montant, Long numeroCarte) { + public Paiement(int id, Integer idCommande, Double montant, Long numeroCarte) { this.id = id; this.idCommande = idCommande; this.montant = montant; @@ -45,11 +45,11 @@ public class Paiement { this.idCommande = idCommande; } - public Integer getMontant() { + public Double getMontant() { return montant; } - public void setMontant(Integer montant) { + public void setMontant(Double montant) { this.montant = montant; } diff --git a/microservice-paiement/src/main/java/com/mpaiement/proxies/MicroserviceCommandeProxy.java b/microservice-paiement/src/main/java/com/mpaiement/proxies/MicroserviceCommandeProxy.java new file mode 100644 index 0000000..31fd860 --- /dev/null +++ b/microservice-paiement/src/main/java/com/mpaiement/proxies/MicroserviceCommandeProxy.java @@ -0,0 +1,20 @@ +package com.mpaiement.proxies; + +import com.mpaiement.beans.CommandeBean; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Optional; + +@FeignClient(name = "microservice-commandes", url = "localhost:9002") +public interface MicroserviceCommandeProxy { + + @GetMapping(value = "/commandes/{id}") + Optional recupererUneCommande(@PathVariable("id") int id); + + @PutMapping(value = "/commandes") + void updateCommande(@RequestBody CommandeBean commande); +} diff --git a/microservice-paiement/src/main/java/com/mpaiement/web/controller/PaiementController.java b/microservice-paiement/src/main/java/com/mpaiement/web/controller/PaiementController.java index 6a126bd..736a60c 100644 --- a/microservice-paiement/src/main/java/com/mpaiement/web/controller/PaiementController.java +++ b/microservice-paiement/src/main/java/com/mpaiement/web/controller/PaiementController.java @@ -1,7 +1,9 @@ package com.mpaiement.web.controller; +import com.mpaiement.beans.CommandeBean; import com.mpaiement.dao.PaiementDao; import com.mpaiement.model.Paiement; +import com.mpaiement.proxies.MicroserviceCommandeProxy; import com.mpaiement.web.exceptions.PaiementExistantException; import com.mpaiement.web.exceptions.PaiementImpossibleException; import org.springframework.beans.factory.annotation.Autowired; @@ -9,12 +11,20 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.Optional; + @RestController public class PaiementController { @Autowired PaiementDao paiementDao; + @Autowired + MicroserviceCommandeProxy microserviceCommandeProxy; + + /* + * Opération pour enregistrer un paiement et notifier le microservice commandes pour mettre à jour le statut de la commande en question + **/ @PostMapping(value = "/paiement") public ResponseEntity payerUneCommande(@RequestBody Paiement paiement){ @@ -26,13 +36,22 @@ public class PaiementController { //Enregistrer le paiement Paiement nouveauPaiement = paiementDao.save(paiement); - + // si le DAO nous retourne null c'est que il ya eu un problème lors de l'enregistrement if(nouveauPaiement == null) throw new PaiementImpossibleException("Erreur, impossible d'établir le paiement, réessayez plus tard"); + //On récupère la commande correspondant à ce paiement en faisant appel au Microservice commandes + Optional commandeReq = microserviceCommandeProxy.recupererUneCommande(paiement.getIdCommande()); + //commandeReq.get() permet d'extraire l'objet de type CommandeBean de Optional + CommandeBean commande = commandeReq.get(); - //TODO Nous allons appeler le Microservice Commandes ici pour lui signifier que le paiement est accepté + //on met à jour l'objet pour marquer la commande comme étant payée + commande.setCommandePayee(true); + //on envoi l'objet commande mis à jour au microservice commande afin de mettre à jour le status de la commande. + microserviceCommandeProxy.updateCommande(commande); + + //on renvoi 201 CREATED pour notifier le client au le paiement à été enregistré return new ResponseEntity(nouveauPaiement, HttpStatus.CREATED); } diff --git a/microservice-paiement/src/main/resources/application.properties b/microservice-paiement/src/main/resources/application.properties index bc316dd..fae79e5 100644 --- a/microservice-paiement/src/main/resources/application.properties +++ b/microservice-paiement/src/main/resources/application.properties @@ -1,3 +1,4 @@ +spring.application.name=microservice-paiement server.port 9003 diff --git a/microservice-produits/src/main/resources/application.properties b/microservice-produits/src/main/resources/application.properties index 4d87d83..03aadee 100644 --- a/microservice-produits/src/main/resources/application.properties +++ b/microservice-produits/src/main/resources/application.properties @@ -1,3 +1,4 @@ +spring.application.name=microservice-produits server.port 9001