diff --git a/package.json b/package.json index 1343ff6..9305898 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@sap/cds": ">=7" }, "devDependencies": { + "@cap-js/sqlite": "^1", "@cap-js/event-broker": "file:.", "@sap-cloud-sdk/resilience": "^4.0.0", "@sap/xssec": "^4.2.4" diff --git a/test/bookshop/db/data/my.bookshop-Books.csv b/test/bookshop/db/data/my.bookshop-Books.csv new file mode 100644 index 0000000..0210c09 --- /dev/null +++ b/test/bookshop/db/data/my.bookshop-Books.csv @@ -0,0 +1,3 @@ +ID,title,stock +1,Wuthering Heights,100 +2,Jane Eyre,500 diff --git a/test/bookshop/db/data/my.bookshop-Customers.csv b/test/bookshop/db/data/my.bookshop-Customers.csv new file mode 100644 index 0000000..4e014bf --- /dev/null +++ b/test/bookshop/db/data/my.bookshop-Customers.csv @@ -0,0 +1,2 @@ +ID,name,BusinessPartner,synchronized +1,John Doe,JD,true diff --git a/test/bookshop/db/schema.cds b/test/bookshop/db/schema.cds new file mode 100644 index 0000000..e867791 --- /dev/null +++ b/test/bookshop/db/schema.cds @@ -0,0 +1,14 @@ +namespace my.bookshop; + +entity Books { + key ID : Integer; + title : String; + stock : Integer; +} + +entity Customers { + key ID : Integer; + name : String; + BusinessPartner : String; + @readonly synchronized : Boolean; +} diff --git a/test/bookshop/package.json b/test/bookshop/package.json new file mode 100644 index 0000000..0e75deb --- /dev/null +++ b/test/bookshop/package.json @@ -0,0 +1,37 @@ +{ + "name": "bookshop", + "version": "1.0.0", + "description": "A simple CAP project.", + "repository": "", + "license": "UNLICENSED", + "private": true, + "dependencies": { + "@sap/cds": "^8", + "express": "^4", + "@cap-js/event-broker": "*", + "@cap-js/sqlite": "^1" + }, + "scripts": { + "start": "cds-serve" + }, + "cds": { + "requires": { + "auth": "mocked", + "db": { + "kind": "sqlite", + "credentials": { + "url": "sqlite.db", + "[development]": { + "url": ":memory:" + } + } + }, + "messaging": { + "kind": "event-broker", + "[development]": { + "kind": "local-messaging" + } + } + } + } +} diff --git a/test/bookshop/server.js b/test/bookshop/server.js new file mode 100644 index 0000000..6cb7f5f --- /dev/null +++ b/test/bookshop/server.js @@ -0,0 +1,5 @@ +const cds = require('@sap/cds') + +cds.on('served', async () => { + if (cds.env.requires.messaging.kind === 'event-broker') await cds.connect.to('ucl') +}) diff --git a/test/bookshop/sqlite.db b/test/bookshop/sqlite.db new file mode 100644 index 0000000..6398628 Binary files /dev/null and b/test/bookshop/sqlite.db differ diff --git a/test/bookshop/srv/cat-service.cds b/test/bookshop/srv/cat-service.cds new file mode 100644 index 0000000..dd8a434 --- /dev/null +++ b/test/bookshop/srv/cat-service.cds @@ -0,0 +1,5 @@ +using my.bookshop as my from '../db/schema'; + +service CatalogService { + @readonly entity Books as projection on my.Books; +} diff --git a/test/bookshop/srv/customers-service.cds b/test/bookshop/srv/customers-service.cds new file mode 100644 index 0000000..3068694 --- /dev/null +++ b/test/bookshop/srv/customers-service.cds @@ -0,0 +1,10 @@ +using my.bookshop as my from '../db/schema'; + +@requires: 'admin' +service CustomersService { + entity Customers as projection on my.Customers; + + event Customer.Changed @(topic: 'sap.s4.beh.businesspartner.v1.BusinessPartner.Changed.v1') { + BusinessPartner : String + } +} diff --git a/test/bookshop/srv/customers-service.js b/test/bookshop/srv/customers-service.js new file mode 100644 index 0000000..df2d392 --- /dev/null +++ b/test/bookshop/srv/customers-service.js @@ -0,0 +1,23 @@ +const cds = require('@sap/cds') + +module.exports = class CustomersService extends cds.ApplicationService { + async init() { + const messaging = await cds.connect.to('messaging') + + messaging.on('Customer.Changed', async function (msg) { + const { BusinessPartner } = msg.data + await UPDATE('my.bookshop.Customers').set({ synchronized: true }).where({ BusinessPartner }) + }) + + this.before('UPDATE', 'Customers', function (req) { + req.data.synchronized = false + }) + + this.after('UPDATE', 'Customers', async function (data, req) { + const { BusinessPartner } = await SELECT.one.from(req.subject) + await messaging.emit('Customer.Changed', { BusinessPartner }) + }) + + return super.init() + } +} diff --git a/test/bookshop/test.http b/test/bookshop/test.http new file mode 100644 index 0000000..f96a479 --- /dev/null +++ b/test/bookshop/test.http @@ -0,0 +1,12 @@ +GET http://localhost:4004/odata/v4/customers/Customers(1) +Authorization: Basic alice:wonderland + +### + +PATCH http://localhost:4004/odata/v4/customers/Customers(1) +Authorization: Basic alice:wonderland +Content-Type: application/json + +{ + "name": "Jane Doe" +}