Compare commits
6 Commits
cds.contex
...
managed-co
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f425a91c2d | ||
|
|
108e886b52 | ||
|
|
d9fb33a523 | ||
|
|
8429d14bfe | ||
|
|
67c95d9d48 | ||
|
|
7a776c53d2 |
@@ -21,7 +21,6 @@
|
||||
},
|
||||
"rules": {
|
||||
"no-console": "off",
|
||||
"require-atomic-updates": "off",
|
||||
"require-await":"warn"
|
||||
"require-atomic-updates": "off"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,6 @@ module.exports = cds.service.impl (function(){
|
||||
|
||||
/** Generate primary keys for target entity in request */
|
||||
async function genid (req) {
|
||||
const {ID} = await SELECT.one.from(req.target).columns('max(ID) as ID')
|
||||
const {ID} = await cds.tx(req).run (SELECT.one.from(req.target).columns('max(ID) as ID'))
|
||||
req.data.ID = ID - ID % 100 + 100 + 1
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ service CatalogService @(path:'/browse') {
|
||||
} excluding { createdBy, modifiedBy };
|
||||
|
||||
@readonly entity ListOfBooks as SELECT from Books
|
||||
excluding { descr };
|
||||
excluding { descr, stock };
|
||||
|
||||
@requires: 'authenticated-user'
|
||||
action submitOrder ( book: Books:ID, amount: Integer ) returns { stock: Integer };
|
||||
|
||||
@@ -1,30 +1,25 @@
|
||||
const cds = require('@sap/cds')
|
||||
|
||||
class CatalogService extends cds.ApplicationService { init(){
|
||||
|
||||
// Reflect entities from model
|
||||
const { Books } = cds.entities ('sap.capire.bookshop')
|
||||
|
||||
class CatalogService extends cds.ApplicationService { async init(){
|
||||
|
||||
// Reduce stock of ordered books if available stock suffices
|
||||
this.on ('submitOrder', async req => {
|
||||
const {book,amount} = req.data
|
||||
// Read stock from database
|
||||
let {stock} = await SELECT.from (Books, book, b => b.stock)
|
||||
const {book,amount} = req.data, tx = cds.tx(req)
|
||||
let {stock} = await tx.read('stock').from(Books,book)
|
||||
if (stock >= amount) {
|
||||
// Reduce stock by ordered amount
|
||||
await UPDATE (Books,book) .with ({ stock: stock -= amount })
|
||||
// Emit event to inform others
|
||||
await this.emit ('OrderedBook', { book, amount, buyer:req.user.id })
|
||||
// Return reduced stock to caller
|
||||
return req.reply ({ stock })
|
||||
await tx.update (Books,book).with ({ stock: stock -= amount })
|
||||
this.emit ('OrderedBook', { book, amount, buyer:req.user.id })
|
||||
return { stock }
|
||||
}
|
||||
// Return error about insufficient stock
|
||||
else return req.error (409,`${amount} exceeds stock for book #${book}`)
|
||||
})
|
||||
|
||||
// Add some discount for overstocked books
|
||||
this.after ('READ','Books', each => {
|
||||
if (each.stock > 111) each.title += ` -- 11% discount!`
|
||||
if (each.stock > 111) {
|
||||
each.title += ` -- 11% discount!`
|
||||
}
|
||||
})
|
||||
|
||||
return super.init()
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
{
|
||||
"name": "@capire/common",
|
||||
"description": "Provides a pre-built extension package for std @sap/cds/common",
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"@sap/cds": "latest"
|
||||
}
|
||||
"version": "1.0.0"
|
||||
}
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
# cds.requires.messaging.kind = file-based-messaging
|
||||
cds.cdsc.severities.extend-for-generated = info
|
||||
PORT = 4004
|
||||
@@ -5,17 +5,13 @@
|
||||
module.exports = async()=>{ // called by server.js
|
||||
|
||||
const cds = require('@sap/cds')
|
||||
|
||||
// Connect to services to mashup
|
||||
const CatalogService = await cds.connect.to ('CatalogService')
|
||||
const ReviewsService = await cds.connect.to ('ReviewsService')
|
||||
const OrdersService = await cds.connect.to ('OrdersService')
|
||||
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 { Orders } = OrdersService.entities
|
||||
const { Reviews } = ReviewsService.entities
|
||||
|
||||
//
|
||||
// Delegate requests to read reviews to the ReviewsService
|
||||
@@ -24,7 +20,7 @@ module.exports = async()=>{ // called by server.js
|
||||
CatalogService.prepend (srv => srv.on ('READ', 'Books/reviews', (req) => {
|
||||
console.debug ('> delegating request to ReviewsService')
|
||||
const [id] = req.params, { columns, limit } = req.query.SELECT
|
||||
return SELECT.from (Reviews,columns).limit(limit).where({subject:String(id)})
|
||||
return ReviewsService.tx(req).read ('Reviews',columns).limit(limit).where({subject:String(id)})
|
||||
}))
|
||||
|
||||
//
|
||||
@@ -32,9 +28,8 @@ module.exports = async()=>{ // called by server.js
|
||||
//
|
||||
CatalogService.on ('OrderedBook', async (msg) => {
|
||||
const { book, amount, buyer } = msg.data
|
||||
const { title, price } = await SELECT.from (Books, book, b => { b.title, b.price })
|
||||
// FIXME: Fails due to Draft glitches when OrdersService is remote
|
||||
return INSERT.into (Orders).entries({
|
||||
const { title, price } = await db.tx(msg).read (Books, book, b => { b.title, b.price })
|
||||
return OrdersService.tx(msg).create ('Orders').entries({
|
||||
OrderNo: 'Order at '+ (new Date).toLocaleString(),
|
||||
Items: [{ product:{ID:`${book}`}, title, price, amount }],
|
||||
buyer, createdBy: buyer
|
||||
@@ -48,17 +43,17 @@ module.exports = async()=>{ // called by server.js
|
||||
console.debug ('> received:', msg.event, msg.data)
|
||||
const { subject, rating } = msg.data
|
||||
return UPDATE(Books,subject).with({rating})
|
||||
// ^ Note: the framework will execute this and take care for db.tx
|
||||
})
|
||||
|
||||
//
|
||||
// Reduce stock of ordered books when orders are modified in admin UI
|
||||
// Reduce stock of ordered books for orders are created from Orders admin UI
|
||||
//
|
||||
OrdersService.on ('OrderChanged', (msg) => {
|
||||
OrdersService.on ('OrderChanged', async (msg) => {
|
||||
console.debug ('> received:', msg.event, msg.data)
|
||||
const { product, deltaAmount } = msg.data
|
||||
return UPDATE (Books) .where ('ID =', product)
|
||||
.and ('stock >=', deltaAmount)
|
||||
.set ('stock -=', deltaAmount)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
@@ -42,24 +42,7 @@ GET {{bookshop}}/browse/Books(201)?
|
||||
|
||||
#################################################
|
||||
#
|
||||
# Orders Service, incl. draft choreography
|
||||
# Orders Service
|
||||
#
|
||||
@newOrderID = e939604c-ab83-4d4f-bdb6-95fe30b3773e
|
||||
|
||||
GET {{bookshop}}/orders/Orders
|
||||
|
||||
### Create order, still inactive
|
||||
POST {{bookshop}}/orders/Orders
|
||||
Content-Type: application/json
|
||||
|
||||
{"ID": "{{newOrderID}}"}
|
||||
|
||||
### Get inactive order. We have to specify `IsActiveEntity`.
|
||||
GET {{bookshop}}/orders/Orders(ID={{newOrderID}},IsActiveEntity=false)
|
||||
|
||||
### Activate order using `.../<servicename>.draftActivate`
|
||||
POST {{bookshop}}/orders/Orders(ID={{newOrderID}},IsActiveEntity=false)/OrdersService.draftActivate
|
||||
Content-Type: application/json
|
||||
|
||||
### Get active order
|
||||
GET {{bookshop}}/orders/Orders(ID={{newOrderID}},IsActiveEntity=true)
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
"name": "sap.fe.templates.ObjectPage",
|
||||
"options": {
|
||||
"settings" : {
|
||||
"entitySet": "Orders_Items"
|
||||
"entitySet": "OrderItems"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1,26 +1,2 @@
|
||||
using { Currency, User, managed, cuid } from '@sap/cds/common';
|
||||
namespace sap.capire.orders;
|
||||
|
||||
entity Orders : cuid, managed {
|
||||
OrderNo : String @title:'Order Number'; //> readable key
|
||||
Items : Composition of many Orders_Items on Items.up_ = $self;
|
||||
buyer : User;
|
||||
currency : Currency;
|
||||
}
|
||||
|
||||
entity Orders_Items {
|
||||
key ID : UUID;
|
||||
up_ : Association to Orders;
|
||||
product : Association to Products @assert.integrity:false; // REVISIT: this is a temporary workaround for a glitch in cds-runtime
|
||||
amount : Integer;
|
||||
title : String;
|
||||
price : Double;
|
||||
}
|
||||
|
||||
/** This is a stand-in for arbitrary ordered Products */
|
||||
entity Products @(cds.persistence.skip:'always',cds.autoexpose) {
|
||||
key ID : String;
|
||||
}
|
||||
|
||||
// Activate extension package
|
||||
using from '@capire/common';
|
||||
// using from './without-managed-composition/schema';
|
||||
using from './with-managed-composition/schema';
|
||||
|
||||
23
orders/db/with-managed-composition/schema.cds
Normal file
23
orders/db/with-managed-composition/schema.cds
Normal file
@@ -0,0 +1,23 @@
|
||||
using { Currency, User, managed, cuid } from '@sap/cds/common';
|
||||
using from '@capire/common';
|
||||
namespace sap.capire.orders;
|
||||
|
||||
entity Orders : cuid, managed {
|
||||
OrderNo : String @title:'Order Number'; //> readable key
|
||||
Items : Composition of many {
|
||||
key ID : UUID;
|
||||
@assert.integrity:false // REVISIT: this is a temporary workaround for a glitch in cds-runtime
|
||||
product : Association to Products;
|
||||
amount : Integer;
|
||||
title : String;
|
||||
price : Double;
|
||||
};
|
||||
buyer : User;
|
||||
currency : Currency;
|
||||
}
|
||||
|
||||
/** This is a stand-in for arbitrary ordered Products */
|
||||
@cds.persistence.skip:'always'
|
||||
entity Products {
|
||||
key ID : String;
|
||||
}
|
||||
26
orders/db/without-managed-composition/schema.cds
Normal file
26
orders/db/without-managed-composition/schema.cds
Normal file
@@ -0,0 +1,26 @@
|
||||
using { Currency, User, managed, cuid } from '@sap/cds/common';
|
||||
using from '@capire/common';
|
||||
namespace sap.capire.orders;
|
||||
|
||||
entity Orders : cuid, managed {
|
||||
OrderNo : String @title:'Order Number'; //> readable key
|
||||
Items : Composition of many Orders_Items on Items.up_ = $self;
|
||||
buyer : User;
|
||||
currency : Currency;
|
||||
}
|
||||
|
||||
entity Orders_Items {
|
||||
up_ : Association to Orders not null; //> IMPORTANT for Draft: not key(!)
|
||||
key ID : UUID;
|
||||
@assert.integrity:false // REVISIT: this is a temporary workaround for a glitch in cds-runtime
|
||||
product : Association to Products;
|
||||
amount : Integer;
|
||||
title : String;
|
||||
price : Double;
|
||||
}
|
||||
|
||||
/** This is a stand-in for arbitrary ordered Products */
|
||||
@cds.persistence.skip:'always'
|
||||
entity Products {
|
||||
key ID : String;
|
||||
}
|
||||
465
orders/managed-comp.xml
Normal file
465
orders/managed-comp.xml
Normal file
@@ -0,0 +1,465 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
|
||||
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/Common.xml">
|
||||
<edmx:Include Alias="Common" Namespace="com.sap.vocabularies.Common.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Core.V1.xml">
|
||||
<edmx:Include Alias="Core" Namespace="Org.OData.Core.V1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/UI.xml">
|
||||
<edmx:Include Alias="UI" Namespace="com.sap.vocabularies.UI.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:DataServices>
|
||||
<Schema Namespace="OrdersService" xmlns="http://docs.oasis-open.org/odata/ns/edm">
|
||||
<EntityContainer Name="EntityContainer">
|
||||
<EntitySet Name="Currencies" EntityType="OrdersService.Currencies">
|
||||
<NavigationPropertyBinding Path="texts" Target="Currencies_texts"/>
|
||||
<NavigationPropertyBinding Path="localized" Target="Currencies_texts"/>
|
||||
</EntitySet>
|
||||
<EntitySet Name="Currencies_texts" EntityType="OrdersService.Currencies_texts"/>
|
||||
<EntitySet Name="Orders" EntityType="OrdersService.Orders">
|
||||
<NavigationPropertyBinding Path="Items" Target="Orders_Items"/>
|
||||
<NavigationPropertyBinding Path="currency" Target="Currencies"/>
|
||||
<NavigationPropertyBinding Path="SiblingEntity" Target="Orders"/>
|
||||
</EntitySet>
|
||||
<EntitySet Name="Orders_Items" EntityType="OrdersService.Orders_Items">
|
||||
<NavigationPropertyBinding Path="up_" Target="Orders"/>
|
||||
<NavigationPropertyBinding Path="SiblingEntity" Target="Orders_Items"/>
|
||||
</EntitySet>
|
||||
</EntityContainer>
|
||||
<EntityType Name="Currencies">
|
||||
<Key>
|
||||
<PropertyRef Name="code"/>
|
||||
</Key>
|
||||
<Property Name="name" Type="Edm.String" MaxLength="255"/>
|
||||
<Property Name="descr" Type="Edm.String" MaxLength="1000"/>
|
||||
<Property Name="code" Type="Edm.String" MaxLength="3" Nullable="false"/>
|
||||
<Property Name="symbol" Type="Edm.String" MaxLength="5"/>
|
||||
<Property Name="numcode" Type="Edm.Int32"/>
|
||||
<Property Name="exponent" Type="Edm.Int32"/>
|
||||
<Property Name="minor" Type="Edm.String"/>
|
||||
<NavigationProperty Name="texts" Type="Collection(OrdersService.Currencies_texts)">
|
||||
<OnDelete Action="Cascade"/>
|
||||
</NavigationProperty>
|
||||
<NavigationProperty Name="localized" Type="OrdersService.Currencies_texts">
|
||||
<ReferentialConstraint Property="code" ReferencedProperty="code"/>
|
||||
</NavigationProperty>
|
||||
</EntityType>
|
||||
<EntityType Name="Currencies_texts">
|
||||
<Key>
|
||||
<PropertyRef Name="locale"/>
|
||||
<PropertyRef Name="code"/>
|
||||
</Key>
|
||||
<Property Name="locale" Type="Edm.String" MaxLength="14" Nullable="false"/>
|
||||
<Property Name="name" Type="Edm.String" MaxLength="255"/>
|
||||
<Property Name="descr" Type="Edm.String" MaxLength="1000"/>
|
||||
<Property Name="code" Type="Edm.String" MaxLength="3" Nullable="false"/>
|
||||
</EntityType>
|
||||
<EntityType Name="DraftAdministrativeData">
|
||||
<Key>
|
||||
<PropertyRef Name="DraftUUID"/>
|
||||
</Key>
|
||||
<Property Name="DraftUUID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="CreationDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="CreatedByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="DraftIsCreatedByMe" Type="Edm.Boolean"/>
|
||||
<Property Name="LastChangeDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="LastChangedByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="InProcessByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="DraftIsProcessedByMe" Type="Edm.Boolean"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Orders">
|
||||
<Key>
|
||||
<PropertyRef Name="ID"/>
|
||||
<PropertyRef Name="IsActiveEntity"/>
|
||||
</Key>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="createdAt" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="createdBy" Type="Edm.String" MaxLength="255"/>
|
||||
<Property Name="modifiedAt" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="modifiedBy" Type="Edm.String" MaxLength="255"/>
|
||||
<Property Name="OrderNo" Type="Edm.String"/>
|
||||
<NavigationProperty Name="Items" Type="Collection(OrdersService.Orders_Items)" Partner="up_">
|
||||
<OnDelete Action="Cascade"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="buyer" Type="Edm.String" MaxLength="255"/>
|
||||
<NavigationProperty Name="currency" Type="OrdersService.Currencies">
|
||||
<ReferentialConstraint Property="currency_code" ReferencedProperty="code"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="currency_code" Type="Edm.String" MaxLength="3"/>
|
||||
<Property Name="IsActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasDraftEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<NavigationProperty Name="DraftAdministrativeData" Type="OrdersService.DraftAdministrativeData" ContainsTarget="true"/>
|
||||
<NavigationProperty Name="SiblingEntity" Type="OrdersService.Orders"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Orders_Items">
|
||||
<Key>
|
||||
<PropertyRef Name="up__ID"/>
|
||||
<PropertyRef Name="ID"/>
|
||||
<PropertyRef Name="IsActiveEntity"/>
|
||||
</Key>
|
||||
<Property Name="up__ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<NavigationProperty Name="up_" Type="OrdersService.Orders" Nullable="false" Partner="Items">
|
||||
<ReferentialConstraint Property="up__ID" ReferencedProperty="ID"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="amount" Type="Edm.Int32"/>
|
||||
<Property Name="title" Type="Edm.String"/>
|
||||
<Property Name="price" Type="Edm.Double"/>
|
||||
<Property Name="product_ID" Type="Edm.String"/>
|
||||
<Property Name="IsActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasDraftEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<NavigationProperty Name="DraftAdministrativeData" Type="OrdersService.DraftAdministrativeData" ContainsTarget="true"/>
|
||||
<NavigationProperty Name="SiblingEntity" Type="OrdersService.Orders_Items"/>
|
||||
</EntityType>
|
||||
<Action Name="draftPrepare" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="OrdersService.Orders"/>
|
||||
<Parameter Name="SideEffectsQualifier" Type="Edm.String"/>
|
||||
<ReturnType Type="OrdersService.Orders"/>
|
||||
</Action>
|
||||
<Action Name="draftPrepare" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="OrdersService.Orders_Items"/>
|
||||
<Parameter Name="SideEffectsQualifier" Type="Edm.String"/>
|
||||
<ReturnType Type="OrdersService.Orders_Items"/>
|
||||
</Action>
|
||||
<Action Name="draftActivate" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="OrdersService.Orders"/>
|
||||
<ReturnType Type="OrdersService.Orders"/>
|
||||
</Action>
|
||||
<Action Name="draftEdit" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="OrdersService.Orders"/>
|
||||
<Parameter Name="PreserveChanges" Type="Edm.Boolean"/>
|
||||
<ReturnType Type="OrdersService.Orders"/>
|
||||
</Action>
|
||||
<Annotations Target="OrdersService.Currencies">
|
||||
<Annotation Term="UI.Identification">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="name"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies/name">
|
||||
<Annotation Term="Common.Label" String="{i18n>Name}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies/descr">
|
||||
<Annotation Term="Common.Label" String="{i18n>Description}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies/code">
|
||||
<Annotation Term="Common.Label" String="{i18n>CurrencyCode}"/>
|
||||
<Annotation Term="Common.Text" Path="name"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies/symbol">
|
||||
<Annotation Term="Common.Label" String="{i18n>CurrencySymbol}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies_texts/name">
|
||||
<Annotation Term="Common.Label" String="{i18n>Name}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies_texts/descr">
|
||||
<Annotation Term="Common.Label" String="{i18n>Description}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies_texts/code">
|
||||
<Annotation Term="Common.Label" String="{i18n>CurrencyCode}"/>
|
||||
<Annotation Term="Common.Text" Path="name"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftAdministrativeData}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/DraftUUID">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftUUID}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/CreationDateTime">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_CreationDateTime}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/CreatedByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_CreatedByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/DraftIsCreatedByMe">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftIsCreatedByMe}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/LastChangeDateTime">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_LastChangeDateTime}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/LastChangedByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_LastChangedByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/InProcessByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_InProcessByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/DraftIsProcessedByMe">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftIsProcessedByMe}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders">
|
||||
<Annotation Term="UI.Facets">
|
||||
<Collection>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Label" String="{i18n>Details}"/>
|
||||
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Details"/>
|
||||
</Record>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Label" String="{i18n>OrderItems}"/>
|
||||
<PropertyValue Property="Target" AnnotationPath="Items/@UI.LineItem"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.FieldGroup" Qualifier="Created">
|
||||
<Record Type="UI.FieldGroupType">
|
||||
<PropertyValue Property="Data">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="createdBy"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="createdAt"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.FieldGroup" Qualifier="Details">
|
||||
<Record Type="UI.FieldGroupType">
|
||||
<PropertyValue Property="Data">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="currency/code"/>
|
||||
<PropertyValue Property="Label" String="Currency"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.FieldGroup" Qualifier="Modified">
|
||||
<Record Type="UI.FieldGroupType">
|
||||
<PropertyValue Property="Data">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="modifiedBy"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="modifiedAt"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.HeaderFacets">
|
||||
<Collection>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Label" String="{i18n>Created}"/>
|
||||
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Created"/>
|
||||
</Record>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Label" String="{i18n>Modified}"/>
|
||||
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Modified"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.HeaderInfo">
|
||||
<Record Type="UI.HeaderInfoType">
|
||||
<PropertyValue Property="Description">
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="createdBy"/>
|
||||
</Record>
|
||||
</PropertyValue>
|
||||
<PropertyValue Property="Title">
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Label" String="Order number "/>
|
||||
<PropertyValue Property="Value" Path="OrderNo"/>
|
||||
</Record>
|
||||
</PropertyValue>
|
||||
<PropertyValue Property="TypeName" String="Order"/>
|
||||
<PropertyValue Property="TypeNamePlural" String="Orders"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.Identification">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="createdBy"/>
|
||||
<PropertyValue Property="Label" String="Customer"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="createdAt"/>
|
||||
<PropertyValue Property="Label" String="Date"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="OrderNo"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.LineItem">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="OrderNo"/>
|
||||
<PropertyValue Property="Label" String="OrderNo"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="buyer"/>
|
||||
<PropertyValue Property="Label" String="Customer"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="createdAt"/>
|
||||
<PropertyValue Property="Label" String="Date"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.SelectionFields">
|
||||
<Collection>
|
||||
<PropertyPath>createdAt</PropertyPath>
|
||||
<PropertyPath>createdBy</PropertyPath>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.EntityContainer/Orders">
|
||||
<Annotation Term="Common.DraftRoot">
|
||||
<Record Type="Common.DraftRootType">
|
||||
<PropertyValue Property="ActivationAction" String="OrdersService.draftActivate"/>
|
||||
<PropertyValue Property="EditAction" String="OrdersService.draftEdit"/>
|
||||
<PropertyValue Property="PreparationAction" String="OrdersService.draftPrepare"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/createdAt">
|
||||
<Annotation Term="Common.Label" String="{i18n>CreatedAt}"/>
|
||||
<Annotation Term="Core.Computed" Bool="true"/>
|
||||
<Annotation Term="Core.Immutable" Bool="true"/>
|
||||
<Annotation Term="UI.HiddenFilter" Bool="false"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/createdBy">
|
||||
<Annotation Term="Common.Label" String="{i18n>CreatedBy}"/>
|
||||
<Annotation Term="Core.Computed" Bool="true"/>
|
||||
<Annotation Term="Core.Description" String="{i18n>UserID.Description}"/>
|
||||
<Annotation Term="Core.Immutable" Bool="true"/>
|
||||
<Annotation Term="UI.HiddenFilter" Bool="false"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/modifiedAt">
|
||||
<Annotation Term="Common.Label" String="{i18n>ChangedAt}"/>
|
||||
<Annotation Term="Core.Computed" Bool="true"/>
|
||||
<Annotation Term="UI.HiddenFilter" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/modifiedBy">
|
||||
<Annotation Term="Common.Label" String="{i18n>ChangedBy}"/>
|
||||
<Annotation Term="Core.Computed" Bool="true"/>
|
||||
<Annotation Term="Core.Description" String="{i18n>UserID.Description}"/>
|
||||
<Annotation Term="UI.HiddenFilter" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/OrderNo">
|
||||
<Annotation Term="Common.Label" String="Order Number"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/buyer">
|
||||
<Annotation Term="Common.Label" String="{i18n>UserID}"/>
|
||||
<Annotation Term="Core.Description" String="{i18n>UserID.Description}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/currency">
|
||||
<Annotation Term="Common.Label" String="{i18n>Currency}"/>
|
||||
<Annotation Term="Core.Description" String="{i18n>CurrencyCode.Description}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/currency_code">
|
||||
<Annotation Term="Common.Label" String="{i18n>Currency}"/>
|
||||
<Annotation Term="Common.ValueList">
|
||||
<Record Type="Common.ValueListType">
|
||||
<PropertyValue Property="Label" String="{i18n>Currency}"/>
|
||||
<PropertyValue Property="CollectionPath" String="Currencies"/>
|
||||
<PropertyValue Property="Parameters">
|
||||
<Collection>
|
||||
<Record Type="Common.ValueListParameterInOut">
|
||||
<PropertyValue Property="LocalDataProperty" PropertyPath="currency_code"/>
|
||||
<PropertyValue Property="ValueListProperty" String="code"/>
|
||||
</Record>
|
||||
<Record Type="Common.ValueListParameterDisplayOnly">
|
||||
<PropertyValue Property="ValueListProperty" String="name"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="Core.Description" String="{i18n>CurrencyCode.Description}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/IsActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/HasActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/HasDraftEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/DraftAdministrativeData">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders_Items">
|
||||
<Annotation Term="UI.Facets">
|
||||
<Collection>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Label" String="{i18n>OrderItems}"/>
|
||||
<PropertyValue Property="Target" AnnotationPath="@UI.Identification"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.Identification">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="amount"/>
|
||||
<PropertyValue Property="Label" String="Amount"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="title"/>
|
||||
<PropertyValue Property="Label" String="Product"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="price"/>
|
||||
<PropertyValue Property="Label" String="Unit Price"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.LineItem">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="product_ID"/>
|
||||
<PropertyValue Property="Label" String="Product ID"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="title"/>
|
||||
<PropertyValue Property="Label" String="Product Title"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="price"/>
|
||||
<PropertyValue Property="Label" String="Unit Price"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="amount"/>
|
||||
<PropertyValue Property="Label" String="Quantity"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.EntityContainer/Orders_Items">
|
||||
<Annotation Term="Common.DraftNode">
|
||||
<Record Type="Common.DraftNodeType">
|
||||
<PropertyValue Property="PreparationAction" String="OrdersService.draftPrepare"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders_Items/amount">
|
||||
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/Mandatory"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders_Items/IsActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders_Items/HasActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders_Items/HasDraftEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders_Items/DraftAdministrativeData">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
</Schema>
|
||||
</edmx:DataServices>
|
||||
</edmx:Edmx>
|
||||
464
orders/metadata.xml
Normal file
464
orders/metadata.xml
Normal file
@@ -0,0 +1,464 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
|
||||
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/Common.xml">
|
||||
<edmx:Include Alias="Common" Namespace="com.sap.vocabularies.Common.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Core.V1.xml">
|
||||
<edmx:Include Alias="Core" Namespace="Org.OData.Core.V1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/UI.xml">
|
||||
<edmx:Include Alias="UI" Namespace="com.sap.vocabularies.UI.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:DataServices>
|
||||
<Schema Namespace="OrdersService" xmlns="http://docs.oasis-open.org/odata/ns/edm">
|
||||
<EntityContainer Name="EntityContainer">
|
||||
<EntitySet Name="Currencies" EntityType="OrdersService.Currencies">
|
||||
<NavigationPropertyBinding Path="texts" Target="Currencies_texts"/>
|
||||
<NavigationPropertyBinding Path="localized" Target="Currencies_texts"/>
|
||||
</EntitySet>
|
||||
<EntitySet Name="Currencies_texts" EntityType="OrdersService.Currencies_texts"/>
|
||||
<EntitySet Name="Orders" EntityType="OrdersService.Orders">
|
||||
<NavigationPropertyBinding Path="Items" Target="Orders_Items"/>
|
||||
<NavigationPropertyBinding Path="currency" Target="Currencies"/>
|
||||
<NavigationPropertyBinding Path="SiblingEntity" Target="Orders"/>
|
||||
</EntitySet>
|
||||
<EntitySet Name="Orders_Items" EntityType="OrdersService.Orders_Items">
|
||||
<NavigationPropertyBinding Path="up_" Target="Orders"/>
|
||||
<NavigationPropertyBinding Path="SiblingEntity" Target="Orders_Items"/>
|
||||
</EntitySet>
|
||||
</EntityContainer>
|
||||
<EntityType Name="Currencies">
|
||||
<Key>
|
||||
<PropertyRef Name="code"/>
|
||||
</Key>
|
||||
<Property Name="name" Type="Edm.String" MaxLength="255"/>
|
||||
<Property Name="descr" Type="Edm.String" MaxLength="1000"/>
|
||||
<Property Name="code" Type="Edm.String" MaxLength="3" Nullable="false"/>
|
||||
<Property Name="symbol" Type="Edm.String" MaxLength="5"/>
|
||||
<Property Name="numcode" Type="Edm.Int32"/>
|
||||
<Property Name="exponent" Type="Edm.Int32"/>
|
||||
<Property Name="minor" Type="Edm.String"/>
|
||||
<NavigationProperty Name="texts" Type="Collection(OrdersService.Currencies_texts)">
|
||||
<OnDelete Action="Cascade"/>
|
||||
</NavigationProperty>
|
||||
<NavigationProperty Name="localized" Type="OrdersService.Currencies_texts">
|
||||
<ReferentialConstraint Property="code" ReferencedProperty="code"/>
|
||||
</NavigationProperty>
|
||||
</EntityType>
|
||||
<EntityType Name="Currencies_texts">
|
||||
<Key>
|
||||
<PropertyRef Name="locale"/>
|
||||
<PropertyRef Name="code"/>
|
||||
</Key>
|
||||
<Property Name="locale" Type="Edm.String" MaxLength="14" Nullable="false"/>
|
||||
<Property Name="name" Type="Edm.String" MaxLength="255"/>
|
||||
<Property Name="descr" Type="Edm.String" MaxLength="1000"/>
|
||||
<Property Name="code" Type="Edm.String" MaxLength="3" Nullable="false"/>
|
||||
</EntityType>
|
||||
<EntityType Name="DraftAdministrativeData">
|
||||
<Key>
|
||||
<PropertyRef Name="DraftUUID"/>
|
||||
</Key>
|
||||
<Property Name="DraftUUID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="CreationDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="CreatedByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="DraftIsCreatedByMe" Type="Edm.Boolean"/>
|
||||
<Property Name="LastChangeDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="LastChangedByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="InProcessByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="DraftIsProcessedByMe" Type="Edm.Boolean"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Orders">
|
||||
<Key>
|
||||
<PropertyRef Name="ID"/>
|
||||
<PropertyRef Name="IsActiveEntity"/>
|
||||
</Key>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="createdAt" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="createdBy" Type="Edm.String" MaxLength="255"/>
|
||||
<Property Name="modifiedAt" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="modifiedBy" Type="Edm.String" MaxLength="255"/>
|
||||
<Property Name="OrderNo" Type="Edm.String"/>
|
||||
<NavigationProperty Name="Items" Type="Collection(OrdersService.Orders_Items)" Partner="up_">
|
||||
<OnDelete Action="Cascade"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="buyer" Type="Edm.String" MaxLength="255"/>
|
||||
<NavigationProperty Name="currency" Type="OrdersService.Currencies">
|
||||
<ReferentialConstraint Property="currency_code" ReferencedProperty="code"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="currency_code" Type="Edm.String" MaxLength="3"/>
|
||||
<Property Name="IsActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasDraftEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<NavigationProperty Name="DraftAdministrativeData" Type="OrdersService.DraftAdministrativeData" ContainsTarget="true"/>
|
||||
<NavigationProperty Name="SiblingEntity" Type="OrdersService.Orders"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Orders_Items">
|
||||
<Key>
|
||||
<PropertyRef Name="ID"/>
|
||||
<PropertyRef Name="IsActiveEntity"/>
|
||||
</Key>
|
||||
<Property Name="up__ID" Type="Edm.Guid"/>
|
||||
<NavigationProperty Name="up_" Type="OrdersService.Orders" Partner="Items">
|
||||
<ReferentialConstraint Property="up__ID" ReferencedProperty="ID"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="amount" Type="Edm.Int32"/>
|
||||
<Property Name="title" Type="Edm.String"/>
|
||||
<Property Name="price" Type="Edm.Double"/>
|
||||
<Property Name="product_ID" Type="Edm.String"/>
|
||||
<Property Name="IsActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasDraftEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<NavigationProperty Name="DraftAdministrativeData" Type="OrdersService.DraftAdministrativeData" ContainsTarget="true"/>
|
||||
<NavigationProperty Name="SiblingEntity" Type="OrdersService.Orders_Items"/>
|
||||
</EntityType>
|
||||
<Action Name="draftPrepare" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="OrdersService.Orders"/>
|
||||
<Parameter Name="SideEffectsQualifier" Type="Edm.String"/>
|
||||
<ReturnType Type="OrdersService.Orders"/>
|
||||
</Action>
|
||||
<Action Name="draftPrepare" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="OrdersService.Orders_Items"/>
|
||||
<Parameter Name="SideEffectsQualifier" Type="Edm.String"/>
|
||||
<ReturnType Type="OrdersService.Orders_Items"/>
|
||||
</Action>
|
||||
<Action Name="draftActivate" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="OrdersService.Orders"/>
|
||||
<ReturnType Type="OrdersService.Orders"/>
|
||||
</Action>
|
||||
<Action Name="draftEdit" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="OrdersService.Orders"/>
|
||||
<Parameter Name="PreserveChanges" Type="Edm.Boolean"/>
|
||||
<ReturnType Type="OrdersService.Orders"/>
|
||||
</Action>
|
||||
<Annotations Target="OrdersService.Currencies">
|
||||
<Annotation Term="UI.Identification">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="name"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies/name">
|
||||
<Annotation Term="Common.Label" String="{i18n>Name}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies/descr">
|
||||
<Annotation Term="Common.Label" String="{i18n>Description}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies/code">
|
||||
<Annotation Term="Common.Label" String="{i18n>CurrencyCode}"/>
|
||||
<Annotation Term="Common.Text" Path="name"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies/symbol">
|
||||
<Annotation Term="Common.Label" String="{i18n>CurrencySymbol}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies_texts/name">
|
||||
<Annotation Term="Common.Label" String="{i18n>Name}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies_texts/descr">
|
||||
<Annotation Term="Common.Label" String="{i18n>Description}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Currencies_texts/code">
|
||||
<Annotation Term="Common.Label" String="{i18n>CurrencyCode}"/>
|
||||
<Annotation Term="Common.Text" Path="name"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftAdministrativeData}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/DraftUUID">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftUUID}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/CreationDateTime">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_CreationDateTime}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/CreatedByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_CreatedByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/DraftIsCreatedByMe">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftIsCreatedByMe}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/LastChangeDateTime">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_LastChangeDateTime}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/LastChangedByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_LastChangedByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/InProcessByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_InProcessByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.DraftAdministrativeData/DraftIsProcessedByMe">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftIsProcessedByMe}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders">
|
||||
<Annotation Term="UI.Facets">
|
||||
<Collection>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Label" String="{i18n>Details}"/>
|
||||
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Details"/>
|
||||
</Record>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Label" String="{i18n>OrderItems}"/>
|
||||
<PropertyValue Property="Target" AnnotationPath="Items/@UI.LineItem"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.FieldGroup" Qualifier="Created">
|
||||
<Record Type="UI.FieldGroupType">
|
||||
<PropertyValue Property="Data">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="createdBy"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="createdAt"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.FieldGroup" Qualifier="Details">
|
||||
<Record Type="UI.FieldGroupType">
|
||||
<PropertyValue Property="Data">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="currency/code"/>
|
||||
<PropertyValue Property="Label" String="Currency"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.FieldGroup" Qualifier="Modified">
|
||||
<Record Type="UI.FieldGroupType">
|
||||
<PropertyValue Property="Data">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="modifiedBy"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="modifiedAt"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.HeaderFacets">
|
||||
<Collection>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Label" String="{i18n>Created}"/>
|
||||
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Created"/>
|
||||
</Record>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Label" String="{i18n>Modified}"/>
|
||||
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Modified"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.HeaderInfo">
|
||||
<Record Type="UI.HeaderInfoType">
|
||||
<PropertyValue Property="Description">
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="createdBy"/>
|
||||
</Record>
|
||||
</PropertyValue>
|
||||
<PropertyValue Property="Title">
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Label" String="Order number "/>
|
||||
<PropertyValue Property="Value" Path="OrderNo"/>
|
||||
</Record>
|
||||
</PropertyValue>
|
||||
<PropertyValue Property="TypeName" String="Order"/>
|
||||
<PropertyValue Property="TypeNamePlural" String="Orders"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.Identification">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="createdBy"/>
|
||||
<PropertyValue Property="Label" String="Customer"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="createdAt"/>
|
||||
<PropertyValue Property="Label" String="Date"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="OrderNo"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.LineItem">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="OrderNo"/>
|
||||
<PropertyValue Property="Label" String="OrderNo"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="buyer"/>
|
||||
<PropertyValue Property="Label" String="Customer"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="createdAt"/>
|
||||
<PropertyValue Property="Label" String="Date"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.SelectionFields">
|
||||
<Collection>
|
||||
<PropertyPath>createdAt</PropertyPath>
|
||||
<PropertyPath>createdBy</PropertyPath>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.EntityContainer/Orders">
|
||||
<Annotation Term="Common.DraftRoot">
|
||||
<Record Type="Common.DraftRootType">
|
||||
<PropertyValue Property="ActivationAction" String="OrdersService.draftActivate"/>
|
||||
<PropertyValue Property="EditAction" String="OrdersService.draftEdit"/>
|
||||
<PropertyValue Property="PreparationAction" String="OrdersService.draftPrepare"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/createdAt">
|
||||
<Annotation Term="Common.Label" String="{i18n>CreatedAt}"/>
|
||||
<Annotation Term="Core.Computed" Bool="true"/>
|
||||
<Annotation Term="Core.Immutable" Bool="true"/>
|
||||
<Annotation Term="UI.HiddenFilter" Bool="false"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/createdBy">
|
||||
<Annotation Term="Common.Label" String="{i18n>CreatedBy}"/>
|
||||
<Annotation Term="Core.Computed" Bool="true"/>
|
||||
<Annotation Term="Core.Description" String="{i18n>UserID.Description}"/>
|
||||
<Annotation Term="Core.Immutable" Bool="true"/>
|
||||
<Annotation Term="UI.HiddenFilter" Bool="false"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/modifiedAt">
|
||||
<Annotation Term="Common.Label" String="{i18n>ChangedAt}"/>
|
||||
<Annotation Term="Core.Computed" Bool="true"/>
|
||||
<Annotation Term="UI.HiddenFilter" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/modifiedBy">
|
||||
<Annotation Term="Common.Label" String="{i18n>ChangedBy}"/>
|
||||
<Annotation Term="Core.Computed" Bool="true"/>
|
||||
<Annotation Term="Core.Description" String="{i18n>UserID.Description}"/>
|
||||
<Annotation Term="UI.HiddenFilter" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/OrderNo">
|
||||
<Annotation Term="Common.Label" String="Order Number"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/buyer">
|
||||
<Annotation Term="Common.Label" String="{i18n>UserID}"/>
|
||||
<Annotation Term="Core.Description" String="{i18n>UserID.Description}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/currency">
|
||||
<Annotation Term="Common.Label" String="{i18n>Currency}"/>
|
||||
<Annotation Term="Core.Description" String="{i18n>CurrencyCode.Description}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/currency_code">
|
||||
<Annotation Term="Common.Label" String="{i18n>Currency}"/>
|
||||
<Annotation Term="Common.ValueList">
|
||||
<Record Type="Common.ValueListType">
|
||||
<PropertyValue Property="Label" String="{i18n>Currency}"/>
|
||||
<PropertyValue Property="CollectionPath" String="Currencies"/>
|
||||
<PropertyValue Property="Parameters">
|
||||
<Collection>
|
||||
<Record Type="Common.ValueListParameterInOut">
|
||||
<PropertyValue Property="LocalDataProperty" PropertyPath="currency_code"/>
|
||||
<PropertyValue Property="ValueListProperty" String="code"/>
|
||||
</Record>
|
||||
<Record Type="Common.ValueListParameterDisplayOnly">
|
||||
<PropertyValue Property="ValueListProperty" String="name"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="Core.Description" String="{i18n>CurrencyCode.Description}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/IsActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/HasActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/HasDraftEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders/DraftAdministrativeData">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders_Items">
|
||||
<Annotation Term="UI.Facets">
|
||||
<Collection>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Label" String="{i18n>OrderItems}"/>
|
||||
<PropertyValue Property="Target" AnnotationPath="@UI.Identification"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.Identification">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="amount"/>
|
||||
<PropertyValue Property="Label" String="Amount"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="title"/>
|
||||
<PropertyValue Property="Label" String="Product"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="price"/>
|
||||
<PropertyValue Property="Label" String="Unit Price"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.LineItem">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="product_ID"/>
|
||||
<PropertyValue Property="Label" String="Product ID"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="title"/>
|
||||
<PropertyValue Property="Label" String="Product Title"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="price"/>
|
||||
<PropertyValue Property="Label" String="Unit Price"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="amount"/>
|
||||
<PropertyValue Property="Label" String="Quantity"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.EntityContainer/Orders_Items">
|
||||
<Annotation Term="Common.DraftNode">
|
||||
<Record Type="Common.DraftNodeType">
|
||||
<PropertyValue Property="PreparationAction" String="OrdersService.draftPrepare"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders_Items/amount">
|
||||
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/Mandatory"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders_Items/IsActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders_Items/HasActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders_Items/HasDraftEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="OrdersService.Orders_Items/DraftAdministrativeData">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
</Schema>
|
||||
</edmx:DataServices>
|
||||
</edmx:Edmx>
|
||||
@@ -4,5 +4,10 @@
|
||||
"dependencies": {
|
||||
"@capire/common": "*",
|
||||
"@sap/cds": "^4.3.0"
|
||||
},
|
||||
"cds": {
|
||||
"odata": {
|
||||
"--containment": true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,15 +8,19 @@ class OrdersService extends cds.ApplicationService {
|
||||
this.before ('UPDATE', 'Orders', async function(req) {
|
||||
const { ID, Items } = req.data
|
||||
if (Items) for (let { product_ID, amount } of Items) {
|
||||
const { amount:before } = await SELECT.one.from (OrderItems, oi => oi.amount) .where ({up__ID:ID, product_ID})
|
||||
if (amount != before) await this.orderChanged (product_ID, amount-before)
|
||||
const { amount:before } = await cds.tx(req).run (
|
||||
SELECT.one.from (OrderItems, oi => oi.amount) .where ({up__ID:ID, product_ID})
|
||||
)
|
||||
if (amount != before) this.orderChanged (product_ID, amount-before)
|
||||
}
|
||||
})
|
||||
|
||||
this.before ('DELETE', 'Orders', async function(req) {
|
||||
const { ID } = req.data
|
||||
const Items = await SELECT.from (OrderItems, oi => { oi.product_ID, oi.amount }) .where ({up__ID:ID})
|
||||
if (Items) await Promise.all (Items.map(it => this.orderChanged (it.product_ID, -it.amount)))
|
||||
const Items = await cds.tx(req).run (
|
||||
SELECT.from (OrderItems, oi => { oi.product_ID, oi.amount }) .where ({up__ID:ID})
|
||||
)
|
||||
if (Items) for (let it of Items) this.orderChanged (it.product_ID, -it.amount)
|
||||
})
|
||||
|
||||
return super.init()
|
||||
|
||||
14
orders/test/model.cds
Normal file
14
orders/test/model.cds
Normal file
@@ -0,0 +1,14 @@
|
||||
service WithDraft {
|
||||
@odata.draft.enabled
|
||||
entity Boo as projection on Foo;
|
||||
}
|
||||
service WithoutDraft {
|
||||
entity Boo as projection on Foo;
|
||||
}
|
||||
|
||||
entity Foo {
|
||||
key ID : UUID;
|
||||
bar : Composition of many {
|
||||
key pos : Integer; //> meant to be a local key only
|
||||
}
|
||||
}
|
||||
142
orders/test/with-containment/WithDraft.xml
Normal file
142
orders/test/with-containment/WithDraft.xml
Normal file
@@ -0,0 +1,142 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
|
||||
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/Common.xml">
|
||||
<edmx:Include Alias="Common" Namespace="com.sap.vocabularies.Common.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Core.V1.xml">
|
||||
<edmx:Include Alias="Core" Namespace="Org.OData.Core.V1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/UI.xml">
|
||||
<edmx:Include Alias="UI" Namespace="com.sap.vocabularies.UI.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:DataServices>
|
||||
<Schema Namespace="WithDraft" xmlns="http://docs.oasis-open.org/odata/ns/edm">
|
||||
<EntityContainer Name="EntityContainer">
|
||||
<EntitySet Name="Boo" EntityType="WithDraft.Boo">
|
||||
<NavigationPropertyBinding Path="SiblingEntity" Target="Boo"/>
|
||||
</EntitySet>
|
||||
</EntityContainer>
|
||||
<EntityType Name="Boo">
|
||||
<Key>
|
||||
<PropertyRef Name="ID"/>
|
||||
<PropertyRef Name="IsActiveEntity"/>
|
||||
</Key>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<NavigationProperty Name="bar" Type="Collection(WithDraft.Foo_bar)" Partner="up_" ContainsTarget="true"/>
|
||||
<Property Name="IsActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasDraftEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<NavigationProperty Name="DraftAdministrativeData" Type="WithDraft.DraftAdministrativeData" ContainsTarget="true"/>
|
||||
<NavigationProperty Name="SiblingEntity" Type="WithDraft.Boo"/>
|
||||
</EntityType>
|
||||
<EntityType Name="DraftAdministrativeData">
|
||||
<Key>
|
||||
<PropertyRef Name="DraftUUID"/>
|
||||
</Key>
|
||||
<Property Name="DraftUUID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="CreationDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="CreatedByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="DraftIsCreatedByMe" Type="Edm.Boolean"/>
|
||||
<Property Name="LastChangeDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="LastChangedByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="InProcessByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="DraftIsProcessedByMe" Type="Edm.Boolean"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Foo_bar">
|
||||
<Key>
|
||||
<PropertyRef Name="pos"/>
|
||||
<PropertyRef Name="IsActiveEntity"/>
|
||||
</Key>
|
||||
<NavigationProperty Name="up_" Type="WithDraft.Boo" Nullable="false" Partner="bar"/>
|
||||
<Property Name="pos" Type="Edm.Int32" Nullable="false"/>
|
||||
<Property Name="IsActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasDraftEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<NavigationProperty Name="DraftAdministrativeData" Type="WithDraft.DraftAdministrativeData" ContainsTarget="true"/>
|
||||
<NavigationProperty Name="SiblingEntity" Type="WithDraft.Foo_bar"/>
|
||||
</EntityType>
|
||||
<Action Name="draftPrepare" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="WithDraft.Boo"/>
|
||||
<Parameter Name="SideEffectsQualifier" Type="Edm.String"/>
|
||||
<ReturnType Type="WithDraft.Boo"/>
|
||||
</Action>
|
||||
<Action Name="draftPrepare" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="WithDraft.Foo_bar"/>
|
||||
<Parameter Name="SideEffectsQualifier" Type="Edm.String"/>
|
||||
<ReturnType Type="WithDraft.Foo_bar"/>
|
||||
</Action>
|
||||
<Action Name="draftActivate" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="WithDraft.Boo"/>
|
||||
<ReturnType Type="WithDraft.Boo"/>
|
||||
</Action>
|
||||
<Action Name="draftEdit" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="WithDraft.Boo"/>
|
||||
<Parameter Name="PreserveChanges" Type="Edm.Boolean"/>
|
||||
<ReturnType Type="WithDraft.Boo"/>
|
||||
</Action>
|
||||
<Annotations Target="WithDraft.EntityContainer/Boo">
|
||||
<Annotation Term="Common.DraftRoot">
|
||||
<Record Type="Common.DraftRootType">
|
||||
<PropertyValue Property="ActivationAction" String="WithDraft.draftActivate"/>
|
||||
<PropertyValue Property="EditAction" String="WithDraft.draftEdit"/>
|
||||
<PropertyValue Property="PreparationAction" String="WithDraft.draftPrepare"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Boo/IsActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Boo/HasActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Boo/HasDraftEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Boo/DraftAdministrativeData">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftAdministrativeData}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/DraftUUID">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftUUID}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/CreationDateTime">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_CreationDateTime}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/CreatedByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_CreatedByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/DraftIsCreatedByMe">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftIsCreatedByMe}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/LastChangeDateTime">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_LastChangeDateTime}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/LastChangedByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_LastChangedByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/InProcessByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_InProcessByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/DraftIsProcessedByMe">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftIsProcessedByMe}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Foo_bar/IsActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Foo_bar/HasActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Foo_bar/HasDraftEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Foo_bar/DraftAdministrativeData">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
</Schema>
|
||||
</edmx:DataServices>
|
||||
</edmx:Edmx>
|
||||
24
orders/test/with-containment/WithoutDraft.xml
Normal file
24
orders/test/with-containment/WithoutDraft.xml
Normal file
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
|
||||
<edmx:DataServices>
|
||||
<Schema Namespace="WithoutDraft" xmlns="http://docs.oasis-open.org/odata/ns/edm">
|
||||
<EntityContainer Name="EntityContainer">
|
||||
<EntitySet Name="Boo" EntityType="WithoutDraft.Boo"/>
|
||||
</EntityContainer>
|
||||
<EntityType Name="Boo">
|
||||
<Key>
|
||||
<PropertyRef Name="ID"/>
|
||||
</Key>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<NavigationProperty Name="bar" Type="Collection(WithoutDraft.Foo_bar)" Partner="up_" ContainsTarget="true"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Foo_bar">
|
||||
<Key>
|
||||
<PropertyRef Name="pos"/>
|
||||
</Key>
|
||||
<NavigationProperty Name="up_" Type="WithoutDraft.Boo" Nullable="false" Partner="bar"/>
|
||||
<Property Name="pos" Type="Edm.Int32" Nullable="false"/>
|
||||
</EntityType>
|
||||
</Schema>
|
||||
</edmx:DataServices>
|
||||
</edmx:Edmx>
|
||||
159
orders/test/without-containment-fixed/WithDraft.xml
Normal file
159
orders/test/without-containment-fixed/WithDraft.xml
Normal file
@@ -0,0 +1,159 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
|
||||
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/Common.xml">
|
||||
<edmx:Include Alias="Common" Namespace="com.sap.vocabularies.Common.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Core.V1.xml">
|
||||
<edmx:Include Alias="Core" Namespace="Org.OData.Core.V1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/UI.xml">
|
||||
<edmx:Include Alias="UI" Namespace="com.sap.vocabularies.UI.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:DataServices>
|
||||
<Schema Namespace="WithDraft" xmlns="http://docs.oasis-open.org/odata/ns/edm">
|
||||
<EntityContainer Name="EntityContainer">
|
||||
<EntitySet Name="Boo" EntityType="WithDraft.Boo">
|
||||
<NavigationPropertyBinding Path="bar" Target="Foo_bar"/>
|
||||
<NavigationPropertyBinding Path="SiblingEntity" Target="Boo"/>
|
||||
</EntitySet>
|
||||
<EntitySet Name="Foo_bar" EntityType="WithDraft.Foo_bar">
|
||||
<NavigationPropertyBinding Path="up_" Target="Boo"/>
|
||||
<NavigationPropertyBinding Path="SiblingEntity" Target="Foo_bar"/>
|
||||
</EntitySet>
|
||||
</EntityContainer>
|
||||
<EntityType Name="Boo">
|
||||
<Key>
|
||||
<PropertyRef Name="ID"/>
|
||||
<PropertyRef Name="IsActiveEntity"/>
|
||||
</Key>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<NavigationProperty Name="bar" Type="Collection(WithDraft.Foo_bar)" Partner="up_">
|
||||
<OnDelete Action="Cascade"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="IsActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasDraftEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<NavigationProperty Name="DraftAdministrativeData" Type="WithDraft.DraftAdministrativeData" ContainsTarget="true"/>
|
||||
<NavigationProperty Name="SiblingEntity" Type="WithDraft.Boo"/>
|
||||
</EntityType>
|
||||
<EntityType Name="DraftAdministrativeData">
|
||||
<Key>
|
||||
<PropertyRef Name="DraftUUID"/>
|
||||
</Key>
|
||||
<Property Name="DraftUUID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="CreationDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="CreatedByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="DraftIsCreatedByMe" Type="Edm.Boolean"/>
|
||||
<Property Name="LastChangeDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="LastChangedByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="InProcessByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="DraftIsProcessedByMe" Type="Edm.Boolean"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Foo_bar">
|
||||
<Key>
|
||||
<PropertyRef Name="pos"/>
|
||||
<PropertyRef Name="IsActiveEntity"/>
|
||||
</Key>
|
||||
<Property Name="up__ID" Type="Edm.Guid"/>
|
||||
<NavigationProperty Name="up_" Type="WithDraft.Boo" Nullable="false" Partner="bar">
|
||||
<ReferentialConstraint Property="up__ID" ReferencedProperty="ID"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="pos" Type="Edm.Int32" Nullable="false"/>
|
||||
<Property Name="IsActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasDraftEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<NavigationProperty Name="DraftAdministrativeData" Type="WithDraft.DraftAdministrativeData" ContainsTarget="true"/>
|
||||
<NavigationProperty Name="SiblingEntity" Type="WithDraft.Foo_bar"/>
|
||||
</EntityType>
|
||||
<Action Name="draftPrepare" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="WithDraft.Boo"/>
|
||||
<Parameter Name="SideEffectsQualifier" Type="Edm.String"/>
|
||||
<ReturnType Type="WithDraft.Boo"/>
|
||||
</Action>
|
||||
<Action Name="draftPrepare" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="WithDraft.Foo_bar"/>
|
||||
<Parameter Name="SideEffectsQualifier" Type="Edm.String"/>
|
||||
<ReturnType Type="WithDraft.Foo_bar"/>
|
||||
</Action>
|
||||
<Action Name="draftActivate" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="WithDraft.Boo"/>
|
||||
<ReturnType Type="WithDraft.Boo"/>
|
||||
</Action>
|
||||
<Action Name="draftEdit" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="WithDraft.Boo"/>
|
||||
<Parameter Name="PreserveChanges" Type="Edm.Boolean"/>
|
||||
<ReturnType Type="WithDraft.Boo"/>
|
||||
</Action>
|
||||
<Annotations Target="WithDraft.EntityContainer/Boo">
|
||||
<Annotation Term="Common.DraftRoot">
|
||||
<Record Type="Common.DraftRootType">
|
||||
<PropertyValue Property="ActivationAction" String="WithDraft.draftActivate"/>
|
||||
<PropertyValue Property="EditAction" String="WithDraft.draftEdit"/>
|
||||
<PropertyValue Property="PreparationAction" String="WithDraft.draftPrepare"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Boo/IsActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Boo/HasActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Boo/HasDraftEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Boo/DraftAdministrativeData">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftAdministrativeData}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/DraftUUID">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftUUID}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/CreationDateTime">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_CreationDateTime}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/CreatedByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_CreatedByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/DraftIsCreatedByMe">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftIsCreatedByMe}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/LastChangeDateTime">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_LastChangeDateTime}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/LastChangedByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_LastChangedByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/InProcessByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_InProcessByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/DraftIsProcessedByMe">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftIsProcessedByMe}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.EntityContainer/Foo_bar">
|
||||
<Annotation Term="Common.DraftNode">
|
||||
<Record Type="Common.DraftNodeType">
|
||||
<PropertyValue Property="PreparationAction" String="WithDraft.draftPrepare"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Foo_bar/IsActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Foo_bar/HasActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Foo_bar/HasDraftEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Foo_bar/DraftAdministrativeData">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
</Schema>
|
||||
</edmx:DataServices>
|
||||
</edmx:Edmx>
|
||||
35
orders/test/without-containment-fixed/WithoutDraft.xml
Normal file
35
orders/test/without-containment-fixed/WithoutDraft.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
|
||||
<edmx:DataServices>
|
||||
<Schema Namespace="WithoutDraft" xmlns="http://docs.oasis-open.org/odata/ns/edm">
|
||||
<EntityContainer Name="EntityContainer">
|
||||
<EntitySet Name="Boo" EntityType="WithoutDraft.Boo">
|
||||
<NavigationPropertyBinding Path="bar" Target="Foo_bar"/>
|
||||
</EntitySet>
|
||||
<EntitySet Name="Foo_bar" EntityType="WithoutDraft.Foo_bar">
|
||||
<NavigationPropertyBinding Path="up_" Target="Boo"/>
|
||||
</EntitySet>
|
||||
</EntityContainer>
|
||||
<EntityType Name="Boo">
|
||||
<Key>
|
||||
<PropertyRef Name="ID"/>
|
||||
</Key>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<NavigationProperty Name="bar" Type="Collection(WithoutDraft.Foo_bar)" Partner="up_">
|
||||
<OnDelete Action="Cascade"/>
|
||||
</NavigationProperty>
|
||||
</EntityType>
|
||||
<EntityType Name="Foo_bar">
|
||||
<Key>
|
||||
<PropertyRef Name="up__ID"/>
|
||||
<PropertyRef Name="pos"/>
|
||||
</Key>
|
||||
<Property Name="up__ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<NavigationProperty Name="up_" Type="WithoutDraft.Boo" Nullable="false" Partner="bar">
|
||||
<ReferentialConstraint Property="up__ID" ReferencedProperty="ID"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="pos" Type="Edm.Int32" Nullable="false"/>
|
||||
</EntityType>
|
||||
</Schema>
|
||||
</edmx:DataServices>
|
||||
</edmx:Edmx>
|
||||
160
orders/test/without-containment/WithDraft.xml
Normal file
160
orders/test/without-containment/WithDraft.xml
Normal file
@@ -0,0 +1,160 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
|
||||
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/Common.xml">
|
||||
<edmx:Include Alias="Common" Namespace="com.sap.vocabularies.Common.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Core.V1.xml">
|
||||
<edmx:Include Alias="Core" Namespace="Org.OData.Core.V1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/UI.xml">
|
||||
<edmx:Include Alias="UI" Namespace="com.sap.vocabularies.UI.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:DataServices>
|
||||
<Schema Namespace="WithDraft" xmlns="http://docs.oasis-open.org/odata/ns/edm">
|
||||
<EntityContainer Name="EntityContainer">
|
||||
<EntitySet Name="Boo" EntityType="WithDraft.Boo">
|
||||
<NavigationPropertyBinding Path="bar" Target="Foo_bar"/>
|
||||
<NavigationPropertyBinding Path="SiblingEntity" Target="Boo"/>
|
||||
</EntitySet>
|
||||
<EntitySet Name="Foo_bar" EntityType="WithDraft.Foo_bar">
|
||||
<NavigationPropertyBinding Path="up_" Target="Boo"/>
|
||||
<NavigationPropertyBinding Path="SiblingEntity" Target="Foo_bar"/>
|
||||
</EntitySet>
|
||||
</EntityContainer>
|
||||
<EntityType Name="Boo">
|
||||
<Key>
|
||||
<PropertyRef Name="ID"/>
|
||||
<PropertyRef Name="IsActiveEntity"/>
|
||||
</Key>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<NavigationProperty Name="bar" Type="Collection(WithDraft.Foo_bar)" Partner="up_">
|
||||
<OnDelete Action="Cascade"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="IsActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasDraftEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<NavigationProperty Name="DraftAdministrativeData" Type="WithDraft.DraftAdministrativeData" ContainsTarget="true"/>
|
||||
<NavigationProperty Name="SiblingEntity" Type="WithDraft.Boo"/>
|
||||
</EntityType>
|
||||
<EntityType Name="DraftAdministrativeData">
|
||||
<Key>
|
||||
<PropertyRef Name="DraftUUID"/>
|
||||
</Key>
|
||||
<Property Name="DraftUUID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="CreationDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="CreatedByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="DraftIsCreatedByMe" Type="Edm.Boolean"/>
|
||||
<Property Name="LastChangeDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
|
||||
<Property Name="LastChangedByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="InProcessByUser" Type="Edm.String" MaxLength="256"/>
|
||||
<Property Name="DraftIsProcessedByMe" Type="Edm.Boolean"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Foo_bar">
|
||||
<Key>
|
||||
<PropertyRef Name="up__ID"/>
|
||||
<PropertyRef Name="pos"/>
|
||||
<PropertyRef Name="IsActiveEntity"/>
|
||||
</Key>
|
||||
<Property Name="up__ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<NavigationProperty Name="up_" Type="WithDraft.Boo" Nullable="false" Partner="bar">
|
||||
<ReferentialConstraint Property="up__ID" ReferencedProperty="ID"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="pos" Type="Edm.Int32" Nullable="false"/>
|
||||
<Property Name="IsActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasActiveEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<Property Name="HasDraftEntity" Type="Edm.Boolean" Nullable="false"/>
|
||||
<NavigationProperty Name="DraftAdministrativeData" Type="WithDraft.DraftAdministrativeData" ContainsTarget="true"/>
|
||||
<NavigationProperty Name="SiblingEntity" Type="WithDraft.Foo_bar"/>
|
||||
</EntityType>
|
||||
<Action Name="draftPrepare" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="WithDraft.Boo"/>
|
||||
<Parameter Name="SideEffectsQualifier" Type="Edm.String"/>
|
||||
<ReturnType Type="WithDraft.Boo"/>
|
||||
</Action>
|
||||
<Action Name="draftPrepare" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="WithDraft.Foo_bar"/>
|
||||
<Parameter Name="SideEffectsQualifier" Type="Edm.String"/>
|
||||
<ReturnType Type="WithDraft.Foo_bar"/>
|
||||
</Action>
|
||||
<Action Name="draftActivate" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="WithDraft.Boo"/>
|
||||
<ReturnType Type="WithDraft.Boo"/>
|
||||
</Action>
|
||||
<Action Name="draftEdit" IsBound="true" EntitySetPath="in">
|
||||
<Parameter Name="in" Type="WithDraft.Boo"/>
|
||||
<Parameter Name="PreserveChanges" Type="Edm.Boolean"/>
|
||||
<ReturnType Type="WithDraft.Boo"/>
|
||||
</Action>
|
||||
<Annotations Target="WithDraft.EntityContainer/Boo">
|
||||
<Annotation Term="Common.DraftRoot">
|
||||
<Record Type="Common.DraftRootType">
|
||||
<PropertyValue Property="ActivationAction" String="WithDraft.draftActivate"/>
|
||||
<PropertyValue Property="EditAction" String="WithDraft.draftEdit"/>
|
||||
<PropertyValue Property="PreparationAction" String="WithDraft.draftPrepare"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Boo/IsActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Boo/HasActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Boo/HasDraftEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Boo/DraftAdministrativeData">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftAdministrativeData}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/DraftUUID">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftUUID}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/CreationDateTime">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_CreationDateTime}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/CreatedByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_CreatedByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/DraftIsCreatedByMe">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftIsCreatedByMe}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/LastChangeDateTime">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_LastChangeDateTime}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/LastChangedByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_LastChangedByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/InProcessByUser">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_InProcessByUser}"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.DraftAdministrativeData/DraftIsProcessedByMe">
|
||||
<Annotation Term="Common.Label" String="{i18n>Draft_DraftIsProcessedByMe}"/>
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.EntityContainer/Foo_bar">
|
||||
<Annotation Term="Common.DraftNode">
|
||||
<Record Type="Common.DraftNodeType">
|
||||
<PropertyValue Property="PreparationAction" String="WithDraft.draftPrepare"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Foo_bar/IsActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Foo_bar/HasActiveEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Foo_bar/HasDraftEntity">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="WithDraft.Foo_bar/DraftAdministrativeData">
|
||||
<Annotation Term="UI.Hidden" Bool="true"/>
|
||||
</Annotations>
|
||||
</Schema>
|
||||
</edmx:DataServices>
|
||||
</edmx:Edmx>
|
||||
35
orders/test/without-containment/WithoutDraft.xml
Normal file
35
orders/test/without-containment/WithoutDraft.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
|
||||
<edmx:DataServices>
|
||||
<Schema Namespace="WithoutDraft" xmlns="http://docs.oasis-open.org/odata/ns/edm">
|
||||
<EntityContainer Name="EntityContainer">
|
||||
<EntitySet Name="Boo" EntityType="WithoutDraft.Boo">
|
||||
<NavigationPropertyBinding Path="bar" Target="Foo_bar"/>
|
||||
</EntitySet>
|
||||
<EntitySet Name="Foo_bar" EntityType="WithoutDraft.Foo_bar">
|
||||
<NavigationPropertyBinding Path="up_" Target="Boo"/>
|
||||
</EntitySet>
|
||||
</EntityContainer>
|
||||
<EntityType Name="Boo">
|
||||
<Key>
|
||||
<PropertyRef Name="ID"/>
|
||||
</Key>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<NavigationProperty Name="bar" Type="Collection(WithoutDraft.Foo_bar)" Partner="up_">
|
||||
<OnDelete Action="Cascade"/>
|
||||
</NavigationProperty>
|
||||
</EntityType>
|
||||
<EntityType Name="Foo_bar">
|
||||
<Key>
|
||||
<PropertyRef Name="up__ID"/>
|
||||
<PropertyRef Name="pos"/>
|
||||
</Key>
|
||||
<Property Name="up__ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<NavigationProperty Name="up_" Type="WithoutDraft.Boo" Nullable="false" Partner="bar">
|
||||
<ReferentialConstraint Property="up__ID" ReferencedProperty="ID"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="pos" Type="Edm.Int32" Nullable="false"/>
|
||||
</EntityType>
|
||||
</Schema>
|
||||
</edmx:DataServices>
|
||||
</edmx:Edmx>
|
||||
@@ -31,9 +31,6 @@
|
||||
"mocha": {
|
||||
"parallel": true
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 12.18"
|
||||
},
|
||||
"jest": {
|
||||
"testEnvironment": "node"
|
||||
},
|
||||
|
||||
@@ -37,7 +37,7 @@ const reviews = new Vue ({
|
||||
reviews.message = {}
|
||||
},
|
||||
|
||||
newReview () {
|
||||
async newReview () {
|
||||
reviews.review = {}
|
||||
reviews.message = {}
|
||||
setTimeout (()=> $('form > input').focus(), 111)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
const cds = require ('@sap/cds')
|
||||
module.exports = cds.service.impl (function(){
|
||||
module.exports = cds.service.impl (async function(){
|
||||
|
||||
// Get the CSN definition for Reviews from the db schema for sub-sequent queries
|
||||
// ( Note: we explicitly specify the namespace to support embedded reuse )
|
||||
@@ -12,16 +12,19 @@ module.exports = cds.service.impl (function(){
|
||||
// Emit an event to inform subscribers about new avg ratings for reviewed subjects
|
||||
this.after (['CREATE','UPDATE','DELETE'], 'Reviews', async function(_,req) {
|
||||
const {subject} = req.data
|
||||
const {rating} = await SELECT.one (['round(avg(rating),2) as rating']) .from (Reviews) .where ({subject})
|
||||
const {rating} = await cds.tx(req) .run (
|
||||
SELECT.one (['round(avg(rating),2) as rating']) .from (Reviews) .where ({subject})
|
||||
)
|
||||
global.it || console.log ('< emitting:', 'reviewed', { subject, rating })
|
||||
await this.emit ('reviewed', { subject, rating })
|
||||
this.emit ('reviewed', { subject, rating })
|
||||
})
|
||||
|
||||
// Increment counter for reviews considered helpful
|
||||
this.on ('like', (req) => {
|
||||
if (!req.user) return req.reject(400, 'You must be identified to like a review')
|
||||
const {review} = req.data, {user} = req
|
||||
return cds.run ([
|
||||
const tx = cds.tx(req)
|
||||
return tx.run ([
|
||||
INSERT.into (Likes) .entries ({review_ID: review, user: user.id}),
|
||||
UPDATE (Reviews) .set({liked: {'+=': 1}}) .where({ID:review})
|
||||
]).catch(() => req.reject(400, 'You already liked that review'))
|
||||
@@ -31,8 +34,9 @@ module.exports = cds.service.impl (function(){
|
||||
this.on ('unlike', async (req) => {
|
||||
if (!req.user) return req.reject(400, 'You must be identified to remove a former like of yours')
|
||||
const {review} = req.data, {user} = req
|
||||
const affectedRows = await DELETE.from (Likes) .where ({review_ID: review,user: user.id})
|
||||
if (affectedRows === 1) return UPDATE (Reviews) .set ({liked: {'-=': 1}}) .where ({ID:review})
|
||||
const tx = cds.tx(req)
|
||||
const affectedRows = await tx.run (DELETE.from (Likes) .where ({review_ID: review,user: user.id}))
|
||||
if (affectedRows === 1) return tx.run (UPDATE (Reviews) .set ({liked: {'-=': 1}}) .where ({ID:review}))
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
const { expect } = require('../test')
|
||||
const cds = require('@sap/cds/lib')
|
||||
const { expect } = cds.test
|
||||
const CQL = ([cql]) => cds.parse.cql(cql)
|
||||
const Foo = { name: 'Foo' }
|
||||
const Books = { name: 'capire.bookshop.Books' }
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
const { expect } = require('../test') .run (
|
||||
'serve', 'AdminService', '--from', '@capire/bookshop,@capire/common', '--in-memory'
|
||||
)
|
||||
const cds = require('@sap/cds/lib')
|
||||
const { expect } = cds.test (
|
||||
'serve', 'AdminService', '--from', '@capire/bookshop,@capire/common', '--in-memory'
|
||||
).in(__dirname)
|
||||
|
||||
describe('Consuming Services locally', () => {
|
||||
//
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
const { GET, POST, expect } = require('../test') .run ('bookshop')
|
||||
const cds = require('@sap/cds/lib')
|
||||
if (cds.User.default) cds.User.default = cds.User.Privileged // hard core monkey patch
|
||||
else cds.User = cds.User.Privileged // hard core monkey patch for older cds releases
|
||||
const cds = require('@sap/cds/lib'); cds.User = cds.User.Privileged // skip auth
|
||||
const { GET, POST, expect } = cds.test('bookshop').in(__dirname,'..')
|
||||
|
||||
describe('Custom Handlers', () => {
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
const { GET, expect } = require('../test') .run ('serve','hello/world.cds')
|
||||
const cds = require('@sap/cds/lib')
|
||||
const { GET, expect } = cds.test('serve','hello/world.cds').in(__dirname,'..')
|
||||
|
||||
describe('Hello world!', () => {
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
const {expect} = require('../test')
|
||||
const cwd = process.cwd(); process.chdir (__dirname) //> only for internal CI/CD@SAP
|
||||
const cds = require('@sap/cds/lib')
|
||||
const {expect} = cds.test
|
||||
|
||||
// monkey patching older releases:
|
||||
if (!cds.compile.cdl) cds.compile.cdl = cds.parse
|
||||
@@ -24,6 +25,8 @@ describe('Hierarchical Data', ()=>{
|
||||
expect (cds.db.model) .to.exist
|
||||
})
|
||||
|
||||
after(()=> process.chdir(cwd))
|
||||
|
||||
it ('supports deeply nested inserts', ()=> INSERT.into (Cats,
|
||||
{ ID:100, name:'Some Cats...', children:[
|
||||
{ ID:101, name:'Cat', children:[
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
|
||||
const test = require('@sap/cds/lib/utils/tests').in(__dirname,'..')
|
||||
module.exports = Object.assign(test,{run:test})
|
||||
|
||||
// REVISIT: With upcoming release of @sap/cds this should become:
|
||||
// module.exports = require('@sap/cds/tests').in(__dirname,'..')
|
||||
@@ -1,7 +1,5 @@
|
||||
const { GET, expect } = require('../test') .run ('serve', 'test/localized-data.cds', '--in-memory')
|
||||
const cds = require('@sap/cds/lib')
|
||||
if (cds.User.default) cds.User.default = cds.User.Privileged // hard core monkey patch
|
||||
else cds.User = cds.User.Privileged // hard core monkey patch for older cds releases
|
||||
const cds = require('@sap/cds/lib'); cds.User = cds.User.Privileged // skip auth
|
||||
const { GET, expect } = cds.test ('serve', __dirname+'/localized-data.cds', '--in-memory')
|
||||
|
||||
describe('Localized Data', () => {
|
||||
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
const { expect } = require('../test')
|
||||
const cds = require('@sap/cds/lib')
|
||||
const cwd = process.cwd(); process.chdir (__dirname) //> only for internal CI/CD@SAP
|
||||
const {expect} = cds.test
|
||||
const _model = '@capire/reviews'
|
||||
if (cds.User.default) cds.User.default = cds.User.Privileged // hard core monkey patch
|
||||
else cds.User = cds.User.Privileged // hard core monkey patch for older cds releases
|
||||
cds.User = cds.User.Privileged // hard core monkey patch
|
||||
|
||||
describe('Messaging', ()=>{
|
||||
|
||||
after(()=> process.chdir(cwd))
|
||||
|
||||
it ('should bootstrap sqlite in-memory db', async()=>{
|
||||
const db = await cds.deploy (_model) .to ('sqlite::memory:')
|
||||
await db.delete('Reviews')
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
const { GET, expect } = require('../test') .run ('bookshop')
|
||||
const cds = require('@sap/cds/lib')
|
||||
if (cds.User.default) cds.User.default = cds.User.Privileged // hard core monkey patch
|
||||
else cds.User = cds.User.Privileged // hard core monkey patch for older cds releases
|
||||
const cds = require('@sap/cds/lib'); cds.User = cds.User.Privileged // skip auth
|
||||
const { GET, expect } = cds.test('bookshop').in(__dirname,'..')
|
||||
|
||||
describe('OData Protocol', () => {
|
||||
|
||||
|
||||
it('serves $metadata documents in v4', async () => {
|
||||
const { headers, status, data } = await GET `/browse/$metadata`
|
||||
expect(status).to.equal(200)
|
||||
|
||||
Reference in New Issue
Block a user