Fibinger Ádám
2019-02-27 37e2b6c7cb1fde8b9e7bf8cb38f01eee8157324f
commit | author | age
9b7a17 1 package hu.unr.fiber.cardapi;
2
ca2732 3 import java.net.URI;
9b7a17 4 import java.util.List;
5 import java.util.Optional;
6
7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory;
9 import org.springframework.http.HttpStatus;
10 import org.springframework.http.ResponseEntity;
11 import org.springframework.web.bind.annotation.*;
12 import org.springframework.web.util.UriComponentsBuilder;
13
14 @RestController
15 public class CardController {
16     Logger logger = LoggerFactory.getLogger(CardController.class);
17
37e2b6 18     CardController(CardRepository cR)
19     {
20         this.cardRepository = cR;
9b7a17 21     }
37e2b6 22
23     CardRepository cardRepository;
9b7a17 24
25     @GetMapping("/")
26     public String index() {
ca2732 27         logger.info("GET /index called.");
28         return "Hateoas helyett: (/cards GET /card/{id} POST /card/{id} PUT /card/{id} DELETE /card/{id} )";
9b7a17 29     }
30
31     @GetMapping("/cards")
32     public List<Card> cards() {
37e2b6 33         logger.info("GET /cards called, responded with items.");
34         return cardRepository.findAll();
9b7a17 35     }
36
37     @GetMapping(value = "/card/{id}")
ca2732 38     public ResponseEntity<Card> getCard(@PathVariable("id") long id) {
39         logger.info("GET /card/" + id + " called.");
37e2b6 40
41         if (!this.cardRepository.existsById(id)) {
42             return ResponseEntity.notFound().build();
43         }
44
45         Card card = this.cardRepository.getOne(id);
46
47         return ResponseEntity.ok().body(card);
ca2732 48     }
49
50     @DeleteMapping(value = "/card/{id}")
51     public ResponseEntity<String> deleteCard(@PathVariable("id") long id) {
52         logger.info("DELETE /card/" + id + " called");
53
54         return Optional
37e2b6 55                 .ofNullable(this.cardRepository.getOne(id))
ca2732 56                 .map(
57                         card -> {
37e2b6 58                             this.cardRepository.delete(card);
59                             this.cardRepository.flush();
ca2732 60                             return ResponseEntity.ok().body("OK");
61                         }
62                 )
63                 .orElseGet(() -> ResponseEntity.status(HttpStatus.NOT_FOUND).body("No card available with id: "+ id));
64     }
65
66     @PostMapping(value = "/card/{id}")
67     public ResponseEntity<String> updateCard(@PathVariable("id") long id, @RequestBody Card updatedCard, UriComponentsBuilder ucBuilder) {
68
69         logger.info("POST /card/"+ id + " called, card update.");
70
71         if (updatedCard.validId() && (updatedCard.getId() != id))
72         {
73             return ResponseEntity
74                     .badRequest()
75                     .body("Id field cannot be modified.");
76         }
77
37e2b6 78         Card originalCard = this.cardRepository.getOne(id);
ca2732 79
80         if (originalCard.equals(updatedCard)) {
81             return ResponseEntity.accepted().body("Update has no changes.");
82         }
83
84         //card number updated, we have to check if its already exists
85         if (!originalCard.getNumber().equals(updatedCard.getNumber()) && this.getCardByNumber(updatedCard.getNumber()) != null) {
86             logger.error("Unable to update card with id {}. A different Card with number {} already exist", originalCard.getId(), updatedCard.getNumber());
87             return ResponseEntity.status(HttpStatus.CONFLICT).body("Card with number " + updatedCard.getNumber() + " already exists.");
88         }
89
90         originalCard.update(updatedCard);
37e2b6 91         this.cardRepository.flush();
ca2732 92
93         return ResponseEntity.accepted().body("OK");
9b7a17 94     }
95
96     private Card getCardByNumber(String number) {
37e2b6 97
98         Long id = cardRepository.findIdByNumber(number);
99
100         if (id == null) {
101             return null;
9b7a17 102         }
103
37e2b6 104         return cardRepository.getOne(id);
9b7a17 105     }
106
107     @PostMapping(value = "/card")
108     public ResponseEntity<String> createCard(@RequestBody Card card, UriComponentsBuilder ucBuilder) {
ca2732 109         logger.info("Creating Card : {}", card.getNumber());
9b7a17 110
111         if (this.getCardByNumber(card.getNumber()) != null) {
112             logger.error("Unable to create. A Card with number {} already exist", card.getNumber());
ca2732 113             return ResponseEntity.status(HttpStatus.CONFLICT).body("Card with number "+ card.getNumber() + " already exists.");
9b7a17 114         }
115
37e2b6 116         this.cardRepository.saveAndFlush(card);
9b7a17 117
ca2732 118         URI newCardURI = ucBuilder.path("/card/{id}").buildAndExpand(card.getId()).toUri();
119
120         return ResponseEntity
121                 .created(newCardURI)
122                 .body(newCardURI.toString());
9b7a17 123     }
124
125 }