1 package io.pactflow.example.sirenprovider.controllers;
3 import io.pactflow.example.sirenprovider.models.Order;
4 import org.springframework.hateoas.CollectionModel;
5 import org.springframework.hateoas.EntityModel;
6 import org.springframework.hateoas.Link;
7 import org.springframework.hateoas.RepresentationModel;
8 import org.springframework.hateoas.server.ExposesResourceFor;
9 import org.springframework.http.ResponseEntity;
10 import org.springframework.web.bind.annotation.DeleteMapping;
11 import org.springframework.web.bind.annotation.GetMapping;
12 import org.springframework.web.bind.annotation.PathVariable;
13 import org.springframework.web.bind.annotation.PutMapping;
14 import org.springframework.web.bind.annotation.RequestMapping;
15 import org.springframework.web.bind.annotation.RestController;
17 import java.util.Random;
19 import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.afford;
20 import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
21 import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
24 @ExposesResourceFor(Order.class)
25 @RequestMapping(value = "/orders")
26 public class OrderController {
29 public ResponseEntity<RepresentationModel<?>> orders() {
30 Order order = new Order(new Random().nextLong());
31 Link selfLink = linkTo(methodOn(OrderController.class).order(order.getId())).withSelfRel()
32 .andAffordance(afford(methodOn(OrderController.class).update(order.getId(), null)))
33 .andAffordance(afford(methodOn(OrderController.class).delete(order.getId())));
34 EntityModel<Order> model = EntityModel.of(order, selfLink);
35 RepresentationModel<?> orders = CollectionModel.of(model);
36 orders.add(linkTo(methodOn(OrderController.class).orders()).withSelfRel());
37 return ResponseEntity.ok(orders);
40 @GetMapping(value = "/{id}")
41 public ResponseEntity<EntityModel<Order>> order(@PathVariable(value = "id", required = true) Long id) {
42 Order order = new Order(id);
43 Link selfLink = linkTo(methodOn(OrderController.class).order(order.getId())).withSelfRel()
44 .andAffordance(afford(methodOn(OrderController.class).update(order.getId(), null)))
45 .andAffordance(afford(methodOn(OrderController.class).delete(order.getId())));
46 EntityModel<Order> model = EntityModel.of(order, selfLink);
47 return ResponseEntity.ok(model);
51 public EntityModel<Order> update(@PathVariable(value = "id", required = true) Long id, Order order) {
52 Link selfLink = linkTo(methodOn(OrderController.class).order(order.getId())).withSelfRel()
53 .andAffordance(afford(methodOn(OrderController.class).update(order.getId(), null)))
54 .andAffordance(afford(methodOn(OrderController.class).delete(order.getId())));
55 EntityModel<Order> model = EntityModel.of(order, selfLink);
59 @DeleteMapping("/{id}")
60 public ResponseEntity<Void> delete(@PathVariable(value = "id", required = true) Long id) {
61 return ResponseEntity.ok().build();