Compare commits

..

1 Commits

Author SHA1 Message Date
Daniel
2ddaf45c5f OData Containment switched on 2020-11-20 19:04:33 +01:00
8 changed files with 29 additions and 17 deletions

View File

@@ -19,7 +19,7 @@ extend Books with {
// Extend Orders with Books as Products // Extend Orders with Books as Products
// //
using { sap.capire.orders.Orders_Items } from '@capire/orders'; using { sap.capire.orders.OrderItems } from '@capire/orders';
extend Orders_Items with { extend OrderItems with {
book : Association to Books on product.ID = book.ID book : Association to Books on product.ID = book.ID
} }

View File

@@ -68,7 +68,7 @@ annotate OrdersService.Orders with @(
annotate OrdersService.Orders_Items with @( annotate OrdersService.OrderItems with @(
UI: { UI: {
LineItem: [ LineItem: [
{Value: product_ID, Label:'Product ID'}, {Value: product_ID, Label:'Product ID'},

View File

@@ -121,7 +121,7 @@
"name": "sap.fe.templates.ObjectPage", "name": "sap.fe.templates.ObjectPage",
"options": { "options": {
"settings" : { "settings" : {
"entitySet": "Orders_Items" "entitySet": "OrderItems"
} }
} }
}, },

View File

@@ -1,4 +1,4 @@
ID;up__ID;amount;product_ID;title;price ID;order_ID;amount;product_ID;title;price
58040e66-1dcd-4ffb-ab10-fdce32028b79;7e2f2640-6866-4dcf-8f4d-3027aa831cad;1;201;Wuthering Heights;11.11 58040e66-1dcd-4ffb-ab10-fdce32028b79;7e2f2640-6866-4dcf-8f4d-3027aa831cad;1;201;Wuthering Heights;11.11
64e718c9-ff99-47f1-8ca3-950c850777d4;7e2f2640-6866-4dcf-8f4d-3027aa831cad;1;271;Catweazle;15 64e718c9-ff99-47f1-8ca3-950c850777d4;7e2f2640-6866-4dcf-8f4d-3027aa831cad;1;271;Catweazle;15
e9641166-e050-4261-bfee-d1e797e6cb7f;64e718c9-ff99-47f1-8ca3-950c850777d4;2;252;Eleonora;28 e9641166-e050-4261-bfee-d1e797e6cb7f;64e718c9-ff99-47f1-8ca3-950c850777d4;2;252;Eleonora;28
1 ID up__ID order_ID amount product_ID title price
2 58040e66-1dcd-4ffb-ab10-fdce32028b79 7e2f2640-6866-4dcf-8f4d-3027aa831cad 7e2f2640-6866-4dcf-8f4d-3027aa831cad 1 201 Wuthering Heights 11.11
3 64e718c9-ff99-47f1-8ca3-950c850777d4 7e2f2640-6866-4dcf-8f4d-3027aa831cad 7e2f2640-6866-4dcf-8f4d-3027aa831cad 1 271 Catweazle 15
4 e9641166-e050-4261-bfee-d1e797e6cb7f 64e718c9-ff99-47f1-8ca3-950c850777d4 64e718c9-ff99-47f1-8ca3-950c850777d4 2 252 Eleonora 28

View File

@@ -1,26 +1,26 @@
using { Currency, User, managed, cuid } from '@sap/cds/common'; using { Currency, User, managed, cuid } from '@sap/cds/common';
using from '@capire/common';
namespace sap.capire.orders; namespace sap.capire.orders;
entity Orders : cuid, managed { entity Orders : cuid, managed {
OrderNo : String @title:'Order Number'; //> readable key OrderNo : String @title:'Order Number'; //> readable key
Items : Composition of many Orders_Items on Items.up_ = $self; Items : Composition of many OrderItems on Items.order = $self;
buyer : User; buyer : User;
currency : Currency; currency : Currency;
} }
entity Orders_Items { entity OrderItems {
key ID : UUID; key ID : UUID;
up_ : Association to Orders; order : Association to Orders;
product : Association to Products @assert.integrity:false; // REVISIT: this is a temporary workaround for a glitch in cds-runtime @assert.integrity:false // REVISIT: this is a temporary workaround for a glitch in cds-runtime
product : Association to Products;
amount : Integer; amount : Integer;
title : String; title : String;
price : Double; price : Double;
} }
/** This is a stand-in for arbitrary ordered Products */ /** This is a stand-in for arbitrary ordered Products */
entity Products @(cds.persistence.skip:'always') { @cds.persistence.skip:'always'
entity Products {
key ID : String; key ID : String;
} }
// Activate extension package
using from '@capire/common';

View File

@@ -4,5 +4,10 @@
"dependencies": { "dependencies": {
"@capire/common": "*", "@capire/common": "*",
"@sap/cds": "^4.3.0" "@sap/cds": "^4.3.0"
},
"cds": {
"odata": {
"containment": true
}
} }
} }

View File

@@ -3,13 +3,13 @@ class OrdersService extends cds.ApplicationService {
/** register custom handlers */ /** register custom handlers */
init(){ init(){
const { Orders_Items:OrderItems } = this.entities const { OrderItems } = this.entities
this.before ('UPDATE', 'Orders', async function(req) { this.before ('UPDATE', 'Orders', async function(req) {
const { ID, Items } = req.data const { ID, Items } = req.data
if (Items) for (let { product_ID, amount } of Items) { if (Items) for (let { product_ID, amount } of Items) {
const { amount:before } = await cds.tx(req).run ( const { amount:before } = await cds.tx(req).run (
SELECT.one.from (OrderItems, oi => oi.amount) .where ({up__ID:ID, product_ID}) SELECT.one.from (OrderItems, oi => oi.amount) .where ({order_ID:ID, product_ID})
) )
if (amount != before) this.orderChanged (product_ID, amount-before) if (amount != before) this.orderChanged (product_ID, amount-before)
} }
@@ -18,7 +18,7 @@ class OrdersService extends cds.ApplicationService {
this.before ('DELETE', 'Orders', async function(req) { this.before ('DELETE', 'Orders', async function(req) {
const { ID } = req.data const { ID } = req.data
const Items = await cds.tx(req).run ( const Items = await cds.tx(req).run (
SELECT.from (OrderItems, oi => { oi.product_ID, oi.amount }) .where ({up__ID:ID}) SELECT.from (OrderItems, oi => { oi.product_ID, oi.amount }) .where ({order_ID:ID})
) )
if (Items) for (let it of Items) this.orderChanged (it.product_ID, -it.amount) if (Items) for (let it of Items) this.orderChanged (it.product_ID, -it.amount)
}) })

View File

@@ -27,7 +27,14 @@ service ReviewsService {
annotate ReviewsService.Reviews with @restrict:[ annotate ReviewsService.Reviews with @restrict:[
{ grant:'READ', to:'any' }, // everybody can read reviews { grant:'READ', to:'any' }, // everybody can read reviews
{ grant:'CREATE', to:'authenticated-user' }, // users must login to add reviews { grant:'CREATE', to:'authenticated-user' }, // users must login to add reviews
{ grant:'UPDATE', to:'authenticated-user', where:'reviewer=$user' }, /////////////////////////////////////////////////
//
// Temporarily disabling this due to glitch in CAP Node.js runtime:
// { grant:'UPDATE', to:'authenticated-user', where:'reviewer=$user' },
// -> reenable it when the issue is fixed
{ grant:'UPDATE', to:'authenticated-user' },
//
////////////////////////////////////////////////////
{ grant:'DELETE', to:'admin' }, { grant:'DELETE', to:'admin' },
]; ];