From 37e2b6c7cb1fde8b9e7bf8cb38f01eee8157324f Mon Sep 17 00:00:00 2001
From: Fibinger Ádám <adam.fibinger@wup.hu>
Date: Wed, 27 Feb 2019 14:47:00 +0100
Subject: [PATCH] JPA + Hibernate working version (H2 console enabled)

---
 src/main/java/hu/unr/fiber/cardapi/CardController.java |   70 +++++++++++++---------------------
 src/main/java/hu/unr/fiber/cardapi/CardRepository.java |    4 ++
 pom.xml                                                |    6 ++
 src/main/java/hu/unr/fiber/cardapi/Card.java           |   17 ++++++--
 4 files changed, 49 insertions(+), 48 deletions(-)

diff --git a/pom.xml b/pom.xml
index 188990e..5252096 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
 
     <groupId>hu.unr.fiber</groupId>
     <artifactId>cardapi</artifactId>
-    <version>0.1.1</version>
+    <version>0.1.2</version>
 
     <parent>
         <groupId>org.springframework.boot</groupId>
@@ -38,6 +38,10 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>com.jayway.jsonpath</groupId>
+            <artifactId>json-path</artifactId>
+        </dependency>
     </dependencies>
 
     <properties>
diff --git a/src/main/java/hu/unr/fiber/cardapi/Card.java b/src/main/java/hu/unr/fiber/cardapi/Card.java
index 8440e38..b5959be 100644
--- a/src/main/java/hu/unr/fiber/cardapi/Card.java
+++ b/src/main/java/hu/unr/fiber/cardapi/Card.java
@@ -1,19 +1,23 @@
 package hu.unr.fiber.cardapi;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+import javax.persistence.*;
 import java.util.Objects;
 
 @Entity
+@Table(name = "Card")
+@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
 public class Card {
     public static final long INVALID_ID = 0;
 
     @Id
-    @GeneratedValue
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id", updatable = false, nullable = false)
     private long id = INVALID_ID;
     private String name;
     //FIXME: @Pattern([0-9]+)
+    @Column(unique=true)
     private String number;
     private String cardHolder;
 
@@ -83,4 +87,9 @@
         this.setNumber(otherCard.getNumber());
         this.setCardHolder(otherCard.getCardHolder());
     }
+
+    @Override
+    public String toString() {
+        return "#" + this.number + " - " +  this.name + " @ " + this.cardHolder;
+    }
 }
diff --git a/src/main/java/hu/unr/fiber/cardapi/CardController.java b/src/main/java/hu/unr/fiber/cardapi/CardController.java
index d3eb21f..76aff0f 100644
--- a/src/main/java/hu/unr/fiber/cardapi/CardController.java
+++ b/src/main/java/hu/unr/fiber/cardapi/CardController.java
@@ -1,10 +1,8 @@
 package hu.unr.fiber.cardapi;
 
 import java.net.URI;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
-import java.util.Random;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -17,14 +15,12 @@
 public class CardController {
     Logger logger = LoggerFactory.getLogger(CardController.class);
 
-    protected List<Card> cardList = new ArrayList<>();
-
-    public CardController() {
-        cardList.add(new Card(1, "Első kártya", "1"));
-        cardList.add(new Card(2, "Második kártya", "2"));
-        cardList.add(new Card(5, "Harmadik kártya", "4"));
-        cardList.add(new Card(8, "Tízezer egyszázadik kártya", "10100"));
+    CardController(CardRepository cR)
+    {
+        this.cardRepository = cR;
     }
+
+    CardRepository cardRepository;
 
     @GetMapping("/")
     public String index() {
@@ -34,17 +30,21 @@
 
     @GetMapping("/cards")
     public List<Card> cards() {
-        logger.info("GET /cards called, responded with " + cardList.size() + " items.");
-        return cardList;
+        logger.info("GET /cards called, responded with items.");
+        return cardRepository.findAll();
     }
 
     @GetMapping(value = "/card/{id}")
     public ResponseEntity<Card> getCard(@PathVariable("id") long id) {
         logger.info("GET /card/" + id + " called.");
-        return Optional
-                .ofNullable(this.getCardByID(id))
-                .map(card -> ResponseEntity.ok().body(card))          //200 OK
-                .orElseGet(() -> ResponseEntity.notFound().build());  //404 Not found
+
+        if (!this.cardRepository.existsById(id)) {
+            return ResponseEntity.notFound().build();
+        }
+
+        Card card = this.cardRepository.getOne(id);
+
+        return ResponseEntity.ok().body(card);
     }
 
     @DeleteMapping(value = "/card/{id}")
@@ -52,10 +52,11 @@
         logger.info("DELETE /card/" + id + " called");
 
         return Optional
-                .ofNullable(this.getCardByID(id))
+                .ofNullable(this.cardRepository.getOne(id))
                 .map(
                         card -> {
-                            this.cardList.remove(card);
+                            this.cardRepository.delete(card);
+                            this.cardRepository.flush();
                             return ResponseEntity.ok().body("OK");
                         }
                 )
@@ -74,7 +75,7 @@
                     .body("Id field cannot be modified.");
         }
 
-        Card originalCard = this.getCardByID(id);
+        Card originalCard = this.cardRepository.getOne(id);
 
         if (originalCard.equals(updatedCard)) {
             return ResponseEntity.accepted().body("Update has no changes.");
@@ -87,30 +88,21 @@
         }
 
         originalCard.update(updatedCard);
+        this.cardRepository.flush();
 
         return ResponseEntity.accepted().body("OK");
     }
 
-    private Card getCardByID(long id) {
-        for (Card card : cardList) {
-            if (card.getId() == id) {
-                return card;
-            }
-        }
-
-        return null;
-    }
-
     private Card getCardByNumber(String number) {
-        for (Card card : cardList) {
-            if (card.getNumber().equals(number)) {
-                return card;
-            }
+
+        Long id = cardRepository.findIdByNumber(number);
+
+        if (id == null) {
+            return null;
         }
 
-        return null;
+        return cardRepository.getOne(id);
     }
-
 
     @PostMapping(value = "/card")
     public ResponseEntity<String> createCard(@RequestBody Card card, UriComponentsBuilder ucBuilder) {
@@ -121,15 +113,7 @@
             return ResponseEntity.status(HttpStatus.CONFLICT).body("Card with number "+ card.getNumber() + " already exists.");
         }
 
-        long nextId = 1;
-
-        while (this.getCardByID(nextId) != null) {
-            nextId++;
-        }
-
-        card.setId(nextId);
-
-        cardList.add(card);
+        this.cardRepository.saveAndFlush(card);
 
         URI newCardURI = ucBuilder.path("/card/{id}").buildAndExpand(card.getId()).toUri();
 
diff --git a/src/main/java/hu/unr/fiber/cardapi/CardRepository.java b/src/main/java/hu/unr/fiber/cardapi/CardRepository.java
index a5404d5..28c4fbe 100644
--- a/src/main/java/hu/unr/fiber/cardapi/CardRepository.java
+++ b/src/main/java/hu/unr/fiber/cardapi/CardRepository.java
@@ -1,6 +1,10 @@
 package hu.unr.fiber.cardapi;
 
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 
 public interface CardRepository extends JpaRepository<Card, Long> {
+    @Query("SELECT c.id FROM Card c where c.number = :number")
+    Long findIdByNumber(@Param("number") String number);
 }

--
Gitblit v1.8.0