From d631b5106e6ba56cb46c0eb8f9add862145bf3c6 Mon Sep 17 00:00:00 2001 From: Marc Becker Date: Wed, 18 Sep 2019 07:19:22 +0000 Subject: [PATCH] CAA160 final state --- bookstore/manifest.yml | 7 ++ bookstore/package.json | 4 +- bookstore/srv/pom.xml | 10 ++ .../cap/bookstore/handlers/OrdersService.java | 101 ++++++++++++++++++ 4 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 bookstore/manifest.yml create mode 100644 bookstore/srv/src/main/java/com/sap/teched/cap/bookstore/handlers/OrdersService.java diff --git a/bookstore/manifest.yml b/bookstore/manifest.yml new file mode 100644 index 00000000..d1fd861f --- /dev/null +++ b/bookstore/manifest.yml @@ -0,0 +1,7 @@ +--- +applications: +- name: bookstore- + path: srv/target/bookstore-1.0-SNAPSHOT.jar + random-route: true + services: + - bookstore-hana- diff --git a/bookstore/package.json b/bookstore/package.json index f3f95de0..d066d69c 100644 --- a/bookstore/package.json +++ b/bookstore/package.json @@ -11,9 +11,11 @@ }, "dependencies": { "@sap/cds": "^3.0.0", - "@sap/capire-products": "file:sap-capire-products-1.0.0.tgz" + "@sap/capire-products": "file:sap-capire-products-1.0.0.tgz", + "hdb": "^0.17.1" }, "devDependencies": { + "@sap/hdi-deploy": "3.7.0", "sqlite3": "^4.1.0" }, "cds": { diff --git a/bookstore/srv/pom.xml b/bookstore/srv/pom.xml index 1aa7b94a..b63ccc78 100644 --- a/bookstore/srv/pom.xml +++ b/bookstore/srv/pom.xml @@ -21,6 +21,16 @@ cds-starter-spring-boot-odata + + com.sap.cds + cds-feature-hana + + + + com.sap.cds + cds-feature-cloudfoundry + + org.xerial sqlite-jdbc diff --git a/bookstore/srv/src/main/java/com/sap/teched/cap/bookstore/handlers/OrdersService.java b/bookstore/srv/src/main/java/com/sap/teched/cap/bookstore/handlers/OrdersService.java new file mode 100644 index 00000000..ee059b68 --- /dev/null +++ b/bookstore/srv/src/main/java/com/sap/teched/cap/bookstore/handlers/OrdersService.java @@ -0,0 +1,101 @@ +package com.sap.teched.cap.bookstore.handlers; + +import java.math.BigDecimal; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.sap.cds.ql.Select; +import com.sap.cds.ql.Update; +import com.sap.cds.ql.cqn.CqnSelect; +import com.sap.cds.ql.cqn.CqnUpdate; +import com.sap.cds.services.ErrorStatuses; +import com.sap.cds.services.ServiceException; +import com.sap.cds.services.cds.CdsService; +import com.sap.cds.services.handler.EventHandler; +import com.sap.cds.services.handler.annotations.After; +import com.sap.cds.services.handler.annotations.Before; +import com.sap.cds.services.handler.annotations.ServiceName; +import com.sap.cds.services.persistence.PersistenceService; + +import ordersservice.OrderItems; +import ordersservice.Orders; +import sap.capire.bookstore.Books; +import sap.capire.bookstore.Books_; +import sap.capire.bookstore.OrderItems_; + +@Component +@ServiceName("OrdersService") +public class OrdersService implements EventHandler { + + @Autowired + PersistenceService db; + + @Before(event = CdsService.EVENT_CREATE, entity = "OrdersService.OrderItems") + public void validateBookAndDecreaseStock(List items) { + for (OrderItems item : items) { + String bookId = item.getBookId(); + Integer amount = item.getAmount(); + + // check if the book that should be ordered is existing + CqnSelect sel = Select.from(Books_.class).columns(b -> b.stock()).where(b -> b.ID().eq(bookId)); + Books book = db.run(sel).first(Books.class).orElseThrow(() -> new ServiceException(ErrorStatuses.NOT_FOUND, "Book does not exist")); + + // check if order could be fulfilled + int stock = book.getStock(); + if (stock < amount) { + throw new ServiceException(ErrorStatuses.BAD_REQUEST, "Not enough books on stock"); + } + + // update the book with the new stock, means minus the order amount + book.setStock(stock - amount); + CqnUpdate update = Update.entity(Books_.class).data(book).where(b -> b.ID().eq(bookId)); + db.run(update); + } + } + + @Before(event = CdsService.EVENT_CREATE, entity = "OrdersService.Orders") + public void validateBookAndDecreaseStockViaOrders(List orders) { + for(Orders order : orders) { + validateBookAndDecreaseStock(order.getItems()); + } + } + + @After(event = { CdsService.EVENT_READ, CdsService.EVENT_CREATE }, entity = "OrdersService.OrderItems") + public void calculateNetAmount(List items) { + for (OrderItems item : items) { + String bookId = item.getBookId(); + + // get the book that was ordered + CqnSelect sel = Select.from(Books_.class).where(b -> b.ID().eq(bookId)); + Books book = db.run(sel).single(Books.class); + + // calculate and set net amount + item.setNetAmount(book.getPrice().multiply(new BigDecimal(item.getAmount()))); + } + } + + @After(event = { CdsService.EVENT_READ, CdsService.EVENT_CREATE }, entity = "OrdersService.Orders") + public void calculateTotal(List orders) { + for (Orders order : orders) { + // calculate net amount for expanded items + calculateNetAmount(order.getItems()); + + // get all items of the order + CqnSelect selItems = Select.from(OrderItems_.class).where(i -> i.parent().ID().eq(order.getId())); + List allItems = db.run(selItems).listOf(OrderItems.class); + + // calculate net amount of all items + calculateNetAmount(allItems); + + // calculate and set the orders total + BigDecimal total = new BigDecimal(0); + for(OrderItems item : allItems) { + total = total.add(item.getNetAmount()); + } + order.setTotal(total); + } + } + +}