initialize mtx
This commit is contained in:
1
multitenancy/.cdsrc.json
Normal file
1
multitenancy/.cdsrc.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
29
multitenancy/.gitignore
vendored
Normal file
29
multitenancy/.gitignore
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# CAP multitenancy
|
||||||
|
_out
|
||||||
|
*.db
|
||||||
|
connection.properties
|
||||||
|
default-*.json
|
||||||
|
gen/
|
||||||
|
node_modules/
|
||||||
|
target/
|
||||||
|
|
||||||
|
# Web IDE, App Studio
|
||||||
|
.che/
|
||||||
|
.gen/
|
||||||
|
|
||||||
|
# MTA
|
||||||
|
*_mta_build_tmp
|
||||||
|
*.mtar
|
||||||
|
mta_archives/
|
||||||
|
|
||||||
|
# Other
|
||||||
|
.DS_Store
|
||||||
|
*.orig
|
||||||
|
*.log
|
||||||
|
|
||||||
|
*.iml
|
||||||
|
*.flattened-pom.xml
|
||||||
|
|
||||||
|
# IDEs
|
||||||
|
# .vscode
|
||||||
|
# .idea
|
||||||
20
multitenancy/.vscode/extensions.json
vendored
Normal file
20
multitenancy/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
// See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
|
||||||
|
// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp
|
||||||
|
|
||||||
|
// List of extensions which should be recommended for users of this workspace.
|
||||||
|
"recommendations": [
|
||||||
|
// >>>>>>>> Add CDS Editor here as soon it is available of vscode marketplace!,
|
||||||
|
"dbaeumer.vscode-eslint",
|
||||||
|
"esbenp.prettier-vscode",
|
||||||
|
"mechatroner.rainbow-csv",
|
||||||
|
"humao.rest-client",
|
||||||
|
"alexcvzz.vscode-sqlite",
|
||||||
|
"hbenl.vscode-mocha-test-adapter",
|
||||||
|
"sdras.night-owl"
|
||||||
|
],
|
||||||
|
// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
|
||||||
|
"unwantedRecommendations": [
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
||||||
15
multitenancy/.vscode/launch.json
vendored
Normal file
15
multitenancy/.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"command": "cds run --with-mocks --in-memory?",
|
||||||
|
"name": "cds run",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "node-terminal",
|
||||||
|
"skipFiles": [ "<node_internals>/**" ]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
7
multitenancy/.vscode/settings.json
vendored
Normal file
7
multitenancy/.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"files.exclude": {
|
||||||
|
"**/.gitignore": true,
|
||||||
|
"**/.git": true,
|
||||||
|
"**/.vscode": true
|
||||||
|
}
|
||||||
|
}
|
||||||
25
multitenancy/.vscode/tasks.json
vendored
Normal file
25
multitenancy/.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||||
|
// for the documentation about the tasks.json format
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"type": "shell",
|
||||||
|
"label": "cds watch",
|
||||||
|
"command": "cds",
|
||||||
|
"args": ["watch"],
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "shell",
|
||||||
|
"label": "cds run",
|
||||||
|
"command": "cds",
|
||||||
|
"args": ["run", "--with-mocks", "--in-memory?"],
|
||||||
|
"problemMatcher": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
25
multitenancy/README.md
Normal file
25
multitenancy/README.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Getting Started
|
||||||
|
|
||||||
|
Welcome to your new project.
|
||||||
|
|
||||||
|
It contains these folders and files, following our recommended project layout:
|
||||||
|
|
||||||
|
File or Folder | Purpose
|
||||||
|
---------|----------
|
||||||
|
`app/` | content for UI frontends goes here
|
||||||
|
`db/` | your domain models and data go here
|
||||||
|
`srv/` | your service models and code go here
|
||||||
|
`package.json` | project metadata and configuration
|
||||||
|
`readme.md` | this getting started guide
|
||||||
|
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
- Open a new terminal and run `cds watch`
|
||||||
|
- (in VS Code simply choose _**Terminal** > Run Task > cds watch_)
|
||||||
|
- Start adding content, for example, a [db/schema.cds](db/schema.cds).
|
||||||
|
|
||||||
|
|
||||||
|
## Learn More
|
||||||
|
|
||||||
|
Learn more at https://cap.cloud.sap/docs/get-started/.
|
||||||
6
multitenancy/db/schema.cds
Normal file
6
multitenancy/db/schema.cds
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace sap.capire.multitenancy;
|
||||||
|
using { sap.capire.bookshop.Books } from '../../bookshop';
|
||||||
|
using { sap.capire.orders.Orders } from '../../orders';
|
||||||
|
using { sap.capire.orders.Orders_Items } from '../../orders';
|
||||||
|
using { Country, managed, cuid } from '@sap/cds/common';
|
||||||
|
|
||||||
136
multitenancy/db/src/.hdiconfig
Normal file
136
multitenancy/db/src/.hdiconfig
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
{
|
||||||
|
"file_suffixes": {
|
||||||
|
"csv": {
|
||||||
|
"plugin_name": "com.sap.hana.di.tabledata.source"
|
||||||
|
},
|
||||||
|
"hdbafllangprocedure": {
|
||||||
|
"plugin_name": "com.sap.hana.di.afllangprocedure"
|
||||||
|
},
|
||||||
|
"hdbanalyticprivilege": {
|
||||||
|
"plugin_name": "com.sap.hana.di.analyticprivilege"
|
||||||
|
},
|
||||||
|
"hdbcalculationview": {
|
||||||
|
"plugin_name": "com.sap.hana.di.calculationview"
|
||||||
|
},
|
||||||
|
"hdbcollection": {
|
||||||
|
"plugin_name": "com.sap.hana.di.collection"
|
||||||
|
},
|
||||||
|
"hdbconstraint": {
|
||||||
|
"plugin_name": "com.sap.hana.di.constraint"
|
||||||
|
},
|
||||||
|
"hdbdropcreatetable": {
|
||||||
|
"plugin_name": "com.sap.hana.di.dropcreatetable"
|
||||||
|
},
|
||||||
|
"hdbflowgraph": {
|
||||||
|
"plugin_name": "com.sap.hana.di.flowgraph"
|
||||||
|
},
|
||||||
|
"hdbfunction": {
|
||||||
|
"plugin_name": "com.sap.hana.di.function"
|
||||||
|
},
|
||||||
|
"hdbgraphworkspace": {
|
||||||
|
"plugin_name": "com.sap.hana.di.graphworkspace"
|
||||||
|
},
|
||||||
|
"hdbhadoopmrjob": {
|
||||||
|
"plugin_name": "com.sap.hana.di.virtualfunctionpackage.hadoop"
|
||||||
|
},
|
||||||
|
"hdbindex": {
|
||||||
|
"plugin_name": "com.sap.hana.di.index"
|
||||||
|
},
|
||||||
|
"hdblibrary": {
|
||||||
|
"plugin_name": "com.sap.hana.di.library"
|
||||||
|
},
|
||||||
|
"hdbmigrationtable": {
|
||||||
|
"plugin_name": "com.sap.hana.di.table.migration"
|
||||||
|
},
|
||||||
|
"hdbprocedure": {
|
||||||
|
"plugin_name": "com.sap.hana.di.procedure"
|
||||||
|
},
|
||||||
|
"hdbprojectionview": {
|
||||||
|
"plugin_name": "com.sap.hana.di.projectionview"
|
||||||
|
},
|
||||||
|
"hdbprojectionviewconfig": {
|
||||||
|
"plugin_name": "com.sap.hana.di.projectionview.config"
|
||||||
|
},
|
||||||
|
"hdbreptask": {
|
||||||
|
"plugin_name": "com.sap.hana.di.reptask"
|
||||||
|
},
|
||||||
|
"hdbresultcache": {
|
||||||
|
"plugin_name": "com.sap.hana.di.resultcache"
|
||||||
|
},
|
||||||
|
"hdbrole": {
|
||||||
|
"plugin_name": "com.sap.hana.di.role"
|
||||||
|
},
|
||||||
|
"hdbroleconfig": {
|
||||||
|
"plugin_name": "com.sap.hana.di.role.config"
|
||||||
|
},
|
||||||
|
"hdbsearchruleset": {
|
||||||
|
"plugin_name": "com.sap.hana.di.searchruleset"
|
||||||
|
},
|
||||||
|
"hdbsequence": {
|
||||||
|
"plugin_name": "com.sap.hana.di.sequence"
|
||||||
|
},
|
||||||
|
"hdbstatistics": {
|
||||||
|
"plugin_name": "com.sap.hana.di.statistics"
|
||||||
|
},
|
||||||
|
"hdbstructuredprivilege": {
|
||||||
|
"plugin_name": "com.sap.hana.di.structuredprivilege"
|
||||||
|
},
|
||||||
|
"hdbsynonym": {
|
||||||
|
"plugin_name": "com.sap.hana.di.synonym"
|
||||||
|
},
|
||||||
|
"hdbsynonymconfig": {
|
||||||
|
"plugin_name": "com.sap.hana.di.synonym.config"
|
||||||
|
},
|
||||||
|
"hdbsystemversioning": {
|
||||||
|
"plugin_name": "com.sap.hana.di.systemversioning"
|
||||||
|
},
|
||||||
|
"hdbtable": {
|
||||||
|
"plugin_name": "com.sap.hana.di.table"
|
||||||
|
},
|
||||||
|
"hdbtabledata": {
|
||||||
|
"plugin_name": "com.sap.hana.di.tabledata"
|
||||||
|
},
|
||||||
|
"hdbtabletype": {
|
||||||
|
"plugin_name": "com.sap.hana.di.tabletype"
|
||||||
|
},
|
||||||
|
"hdbtrigger": {
|
||||||
|
"plugin_name": "com.sap.hana.di.trigger"
|
||||||
|
},
|
||||||
|
"hdbview": {
|
||||||
|
"plugin_name": "com.sap.hana.di.view"
|
||||||
|
},
|
||||||
|
"hdbvirtualfunction": {
|
||||||
|
"plugin_name": "com.sap.hana.di.virtualfunction"
|
||||||
|
},
|
||||||
|
"hdbvirtualfunctionconfig": {
|
||||||
|
"plugin_name": "com.sap.hana.di.virtualfunction.config"
|
||||||
|
},
|
||||||
|
"hdbvirtualpackagehadoop": {
|
||||||
|
"plugin_name": "com.sap.hana.di.virtualpackage.hadoop"
|
||||||
|
},
|
||||||
|
"hdbvirtualpackagesparksql": {
|
||||||
|
"plugin_name": "com.sap.hana.di.virtualpackage.sparksql"
|
||||||
|
},
|
||||||
|
"hdbvirtualprocedure": {
|
||||||
|
"plugin_name": "com.sap.hana.di.virtualprocedure"
|
||||||
|
},
|
||||||
|
"hdbvirtualprocedureconfig": {
|
||||||
|
"plugin_name": "com.sap.hana.di.virtualprocedure.config"
|
||||||
|
},
|
||||||
|
"hdbvirtualtable": {
|
||||||
|
"plugin_name": "com.sap.hana.di.virtualtable"
|
||||||
|
},
|
||||||
|
"hdbvirtualtableconfig": {
|
||||||
|
"plugin_name": "com.sap.hana.di.virtualtable.config"
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"plugin_name": "com.sap.hana.di.tabledata.properties"
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"plugin_name": "com.sap.hana.di.tabledata.properties"
|
||||||
|
},
|
||||||
|
"txt": {
|
||||||
|
"plugin_name": "com.sap.hana.di.copyonly"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
89
multitenancy/mta.yaml
Normal file
89
multitenancy/mta.yaml
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
## Generated mta.yaml based on template version 0.4.0
|
||||||
|
## appName = multitenancy
|
||||||
|
## language=nodejs; multitenant=true
|
||||||
|
## approuter=
|
||||||
|
_schema-version: '3.1'
|
||||||
|
ID: multitenancy
|
||||||
|
version: 1.0.0
|
||||||
|
description: "A simple CAP project."
|
||||||
|
parameters:
|
||||||
|
enable-parallel-deployments: true
|
||||||
|
|
||||||
|
build-parameters:
|
||||||
|
before-all:
|
||||||
|
- builder: custom
|
||||||
|
commands:
|
||||||
|
- npm install --production
|
||||||
|
- npx -p @sap/cds-dk cds build --production
|
||||||
|
|
||||||
|
modules:
|
||||||
|
# --------------------- SERVER MODULE ------------------------
|
||||||
|
- name: multitenancy-srv
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
type: nodejs
|
||||||
|
path: gen/srv
|
||||||
|
properties:
|
||||||
|
SAP_JWT_TRUST_ACL: [{"clientid":"*","identityzone":"sap-provisioning"}] # Trust between server and SaaS Manager
|
||||||
|
requires:
|
||||||
|
# Resources extracted from CAP configuration
|
||||||
|
- name: multitenancy-db-mt
|
||||||
|
- name: multitenancy-uaa-mt
|
||||||
|
- name: multitenancy-registry
|
||||||
|
provides:
|
||||||
|
- name: srv-api # required by consumers of CAP services (e.g. approuter)
|
||||||
|
properties:
|
||||||
|
srv-url: ${default-url}
|
||||||
|
- name: mtx-api # potentially required by approuter
|
||||||
|
properties:
|
||||||
|
mtx-url: ${default-url}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
resources:
|
||||||
|
# services extracted from CAP configuration
|
||||||
|
# 'service-plan' can be configured via 'cds.requires.<name>.vcap.plan'
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
- name: multitenancy-db-mt
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
type: org.cloudfoundry.managed-service
|
||||||
|
parameters:
|
||||||
|
service: service-manager
|
||||||
|
service-plan: container
|
||||||
|
properties:
|
||||||
|
hdi-service-name: ${service-name}
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
- name: multitenancy-uaa-mt
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
type: org.cloudfoundry.managed-service
|
||||||
|
parameters:
|
||||||
|
service: xsuaa
|
||||||
|
service-plan: application
|
||||||
|
path: ./xs-security.json
|
||||||
|
config:
|
||||||
|
xsappname: multitenancy-${space} # name + space dependency
|
||||||
|
tenant-mode: shared
|
||||||
|
|
||||||
|
- name: multitenancy-registry
|
||||||
|
type: org.cloudfoundry.managed-service
|
||||||
|
requires:
|
||||||
|
- name: multitenancy-uaa-mt
|
||||||
|
- name: mtx-api
|
||||||
|
properties:
|
||||||
|
prop: ~{mtx-url}
|
||||||
|
parameters:
|
||||||
|
param: ~{mtx-url}
|
||||||
|
parameters:
|
||||||
|
service: saas-registry
|
||||||
|
service-plan: application
|
||||||
|
config:
|
||||||
|
xsappname: multitenancy-${space}
|
||||||
|
appName: multitenancy
|
||||||
|
displayName: multitenancy
|
||||||
|
description: A simple CAP project.
|
||||||
|
#category: 'Category'
|
||||||
|
appUrls:
|
||||||
|
onSubscription: ~{mtx-api/mtx-url}/mtx/v1/provisioning/tenant/{tenantId}
|
||||||
|
onSubscriptionAsync: false
|
||||||
|
onUnSubscriptionAsync: false
|
||||||
|
callbackTimeoutMillis: 300000
|
||||||
|
|
||||||
5086
multitenancy/package-lock.json
generated
Normal file
5086
multitenancy/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
84
multitenancy/package.json
Normal file
84
multitenancy/package.json
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
{
|
||||||
|
"name": "multitenancy",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "A simple CAP project.",
|
||||||
|
"repository": "<Add your repository here>",
|
||||||
|
"license": "UNLICENSED",
|
||||||
|
"private": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@capire/fiori": "../fiori",
|
||||||
|
"@sap/cds": "5.0.6",
|
||||||
|
"@sap/cds-mtx": "1.2.1",
|
||||||
|
"@sap/hana-client": "^2",
|
||||||
|
"@sap/hdi-deploy": "^4",
|
||||||
|
"@sap/instance-manager": "^2",
|
||||||
|
"@sap/xssec": "^3",
|
||||||
|
"express": "^4",
|
||||||
|
"passport": "^0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"sqlite3": "^5.0.2"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"start": "cds run"
|
||||||
|
},
|
||||||
|
"eslintConfig": {
|
||||||
|
"extends": "eslint:recommended",
|
||||||
|
"env": {
|
||||||
|
"es2020": true,
|
||||||
|
"node": true,
|
||||||
|
"jest": true,
|
||||||
|
"mocha": true
|
||||||
|
},
|
||||||
|
"globals": {
|
||||||
|
"SELECT": true,
|
||||||
|
"INSERT": true,
|
||||||
|
"UPDATE": true,
|
||||||
|
"DELETE": true,
|
||||||
|
"CREATE": true,
|
||||||
|
"DROP": true,
|
||||||
|
"CDL": true,
|
||||||
|
"CQL": true,
|
||||||
|
"CXL": true,
|
||||||
|
"cds": true
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"no-console": "off",
|
||||||
|
"require-atomic-updates": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cds": {
|
||||||
|
"requires": {
|
||||||
|
"multitenancy": true,
|
||||||
|
"auth": {
|
||||||
|
"strategy": "JWT"
|
||||||
|
},
|
||||||
|
"db": {
|
||||||
|
"kind": "hana",
|
||||||
|
"vcap": {
|
||||||
|
"label": "service-manager"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uaa": {
|
||||||
|
"kind": "xsuaa"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hana": {
|
||||||
|
"deploy-format": "hdbtable"
|
||||||
|
},
|
||||||
|
"mtx": {
|
||||||
|
"element-prefix": "Z_",
|
||||||
|
"namespace-blacklist": [
|
||||||
|
"com.sap.",
|
||||||
|
"sap."
|
||||||
|
],
|
||||||
|
"entity-whitelist": [],
|
||||||
|
"service-whitelist": []
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"passport": {
|
||||||
|
"strategy": "JWT"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
7
multitenancy/server.js
Normal file
7
multitenancy/server.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
const cds = require ('@sap/cds');
|
||||||
|
|
||||||
|
cds.on('bootstrap', async app => {
|
||||||
|
await cds.mtx.in(app);
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = cds.server;
|
||||||
15
multitenancy/srv/multitenancy-service.cds
Normal file
15
multitenancy/srv/multitenancy-service.cds
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
using {sap.capire.bookshop as bookshop } from '../../bookshop/db/schema';
|
||||||
|
using {sap.capire.orders as orders } from '../../orders/db/schema';
|
||||||
|
|
||||||
|
service MultitenancyService {
|
||||||
|
entity Books as projection on bookshop.Books;
|
||||||
|
entity Orders as projection on orders.Orders;
|
||||||
|
entity Orders_Items as projection on orders.Orders_Items;
|
||||||
|
}
|
||||||
|
|
||||||
|
using AdminService from '../../bookshop/srv/admin-service';
|
||||||
|
using CatalogService from '../../bookshop/srv/cat-service';
|
||||||
|
|
||||||
|
annotate AdminService with @restrict : false;
|
||||||
|
annotate CatalogService with @restrict : false;
|
||||||
|
|
||||||
37
multitenancy/xs-security.json
Normal file
37
multitenancy/xs-security.json
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"xsappname": "multitenancy-${space}",
|
||||||
|
"tenant-mode": "shared",
|
||||||
|
"scopes": [
|
||||||
|
{ "name": "$XSAPPNAME.ExtendCDS", "description": "Extend CDS application" },
|
||||||
|
{ "name": "$XSAPPNAME.ExtendCDSdelete", "description": "Extend CDS application with undeploy" },
|
||||||
|
{ "name": "$XSAPPNAME.MtxDiagnose", "description": "Diagnose MTX sidecar" },
|
||||||
|
{
|
||||||
|
"name": "$XSAPPNAME.Callback",
|
||||||
|
"description": "With this scope set, the callbacks for subscribe, unsubscribe and getDependencies can be called.",
|
||||||
|
"grant-as-authority-to-apps": [
|
||||||
|
"$XSAPPNAME(application,sap-provisioning,tenant-onboarding)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"authorities": [
|
||||||
|
"$XSAPPNAME.MtxDiagnose"
|
||||||
|
],
|
||||||
|
"role-templates": [
|
||||||
|
{
|
||||||
|
"name": "ExtensionDeveloper",
|
||||||
|
"description": "Extend application",
|
||||||
|
"scope-references": [
|
||||||
|
"$XSAPPNAME.ExtendCDS"
|
||||||
|
],
|
||||||
|
"attribute-references": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ExtensionDeveloperUndeploy",
|
||||||
|
"description": "Undeploy extension",
|
||||||
|
"scope-references": [
|
||||||
|
"$XSAPPNAME.ExtendCDSdelete"
|
||||||
|
],
|
||||||
|
"attribute-references": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user