Using cds.ql to consume external services

This commit is contained in:
Daniel
2020-12-30 18:48:59 +01:00
parent 9fe79b28d6
commit c3e35cd54c

View File

@@ -5,13 +5,17 @@
module.exports = async()=>{ // called by server.js module.exports = async()=>{ // called by server.js
const cds = require('@sap/cds') const cds = require('@sap/cds')
// Connect to services to mashup
const CatalogService = await cds.connect.to ('CatalogService') const CatalogService = await cds.connect.to ('CatalogService')
const ReviewsService = await cds.connect.to ('ReviewsService') const ReviewsService = await cds.connect.to ('ReviewsService')
const OrdersService = await cds.connect.to ('OrdersService') const OrdersService = await cds.connect.to ('OrdersService')
const db = await cds.connect.to ('db') const db = await cds.connect.to ('db')
// reflect entity definitions used below... // Reflect entity definitions used below...
const { Books } = db.entities ('sap.capire.bookshop') const { Books } = db.entities ('sap.capire.bookshop')
const { Orders } = OrdersService.entities
const { Reviews } = ReviewsService.entities
// //
// Delegate requests to read reviews to the ReviewsService // Delegate requests to read reviews to the ReviewsService
@@ -20,7 +24,7 @@ module.exports = async()=>{ // called by server.js
CatalogService.prepend (srv => srv.on ('READ', 'Books/reviews', (req) => { CatalogService.prepend (srv => srv.on ('READ', 'Books/reviews', (req) => {
console.debug ('> delegating request to ReviewsService') console.debug ('> delegating request to ReviewsService')
const [id] = req.params, { columns, limit } = req.query.SELECT const [id] = req.params, { columns, limit } = req.query.SELECT
return ReviewsService.read ('Reviews',columns).limit(limit).where({subject:String(id)}) return SELECT.from (Reviews,columns).limit(limit).where({subject:String(id)})
})) }))
// //
@@ -29,7 +33,8 @@ module.exports = async()=>{ // called by server.js
CatalogService.on ('OrderedBook', async (msg) => { CatalogService.on ('OrderedBook', async (msg) => {
const { book, amount, buyer } = msg.data const { book, amount, buyer } = msg.data
const { title, price } = await SELECT.from (Books, book, b => { b.title, b.price }) const { title, price } = await SELECT.from (Books, book, b => { b.title, b.price })
return OrdersService.create ('Orders').entries({ // FIXME: Fails due to Draft glitches when OrdersService is remote
return INSERT.into (Orders).entries({
OrderNo: 'Order at '+ (new Date).toLocaleString(), OrderNo: 'Order at '+ (new Date).toLocaleString(),
Items: [{ product:{ID:`${book}`}, title, price, amount }], Items: [{ product:{ID:`${book}`}, title, price, amount }],
buyer, createdBy: buyer buyer, createdBy: buyer
@@ -42,11 +47,11 @@ module.exports = async()=>{ // called by server.js
ReviewsService.on ('reviewed', (msg) => { ReviewsService.on ('reviewed', (msg) => {
console.debug ('> received:', msg.event, msg.data) console.debug ('> received:', msg.event, msg.data)
const { subject, rating } = msg.data const { subject, rating } = msg.data
return UPDATE(Books,subject).with({rating}) return UPDATE (Books,subject) .with ({rating})
}) })
// //
// Reduce stock of ordered books for orders are created from Orders admin UI // Reduce stock of ordered books when orders are modified in admin UI
// //
OrdersService.on ('OrderChanged', (msg) => { OrdersService.on ('OrderChanged', (msg) => {
console.debug ('> received:', msg.event, msg.data) console.debug ('> received:', msg.event, msg.data)
@@ -55,4 +60,5 @@ module.exports = async()=>{ // called by server.js
.and ('stock >=', deltaAmount) .and ('stock >=', deltaAmount)
.set ('stock -=', deltaAmount) .set ('stock -=', deltaAmount)
}) })
} }