package br.com.caelum.vraptor.restbucks.web; import static br.com.caelum.vraptor.view.Results.representation; import static br.com.caelum.vraptor.view.Results.xml; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import br.com.caelum.vraptor.Consumes; import br.com.caelum.vraptor.Delete; import br.com.caelum.vraptor.Get; import br.com.caelum.vraptor.Path; import br.com.caelum.vraptor.Post; import br.com.caelum.vraptor.Put; import br.com.caelum.vraptor.Resource; import br.com.caelum.vraptor.Result; import br.com.caelum.vraptor.core.Routes; import br.com.caelum.vraptor.restbucks.Item; import br.com.caelum.vraptor.restbucks.Order; import br.com.caelum.vraptor.restbucks.OrderDatabase; import br.com.caelum.vraptor.restbucks.Payment; import br.com.caelum.vraptor.restfulie.hypermedia.Transition; import br.com.caelum.vraptor.serialization.Serializer; import br.com.caelum.vraptor.view.Status; /** * Ordering system provides two services: order retrieval and insertion. * * @author guilherme silveira */ @Resource public class OrderingController { private final Result result; private final Status status; private final OrderDatabase database; private final Routes routes; public OrderingController(Result result, Status status, OrderDatabase database, Routes routes) { this.result = result; this.status = status; this.database = database; this.routes = routes; } @Get @Path("/orders/{order.id}") public void get(Order order) { order = database.getOrder(order.getId()); if (order != null) { Serializer serializer = result.use(representation()).from(order); serializer.include("items").include("location"); serializer.include("payment").serialize(); } else { status.notFound(); } } @Post @Path("/orders") @Consumes public void add(Order order) { int id = 0; for(Item i : order.getItems()) { i.use(order, ++id); } database.save(order); routes.uriFor(OrderingController.class).get(order); status.created(routes.getUri()); } @Delete @Path("/orders/{order.id}") @Transition public void cancel(Order order) { order = database.getOrder(order.getId()); if(order.getStatus().equals("ready")) { order.finish(); } else { order.cancel(); database.delete(order); } status.ok(); } @Get @Path("/orders") public List<Order> index() throws IOException { return new ArrayList<Order>(database.all()); } @Post @Path("/orders/{order.id}/pay") @Consumes @Transition public void pay(Order order, Payment payment) { order = database.getOrder(order.getId()); if(order.pay(payment)) { result.use(xml()).from(order.getReceipt()).serialize(); } else { status.badRequest("Invalid payment value, order costs " + order.getCost()); } } @Get @Path("/orders/{order.id}/checkPaymentInfo") public void checkPayment(Order order) { order = database.getOrder(order.getId()); if (order != null) { result.use(xml()).from(order.getPayment()).serialize(); } else { status.notFound(); } } @Put @Path("/orders/{order.id}") @Transition @Consumes public void update(Order order) { order.setStatus("unpaid"); database.update(order); // we could status.ok() or return the representation get(order); } }