
New Project from Template
COLUMN TABLE CALL_HISTORY (
"TS" TIMESTAMP,
"COMMENT" NVARCHAR(100),
"NAME" NVARCHAR(100),
"VALUE" INTEGER
)
procedure REGISTER_CALL()
language sqlscript
as
begin
insert into "CALL_HISTORY"("TS") values (current_utctimestamp);
end;
procedure REGISTER_CALL_WITH_PARAM(
in comment nvarchar(100),
in name nvarchar(100),
in val integer)
language sqlscript
as
begin
insert into CALL_HISTORY values (current_utctimestamp , :comment, :name, :val);
end;
HANA Artefacts
cds init --add nodejs
cds add hana, mta
_schema-version: "2.1"
ID: HANA_API_Service_Test
version: 0.0.1
modules:
- name: HANA_API_Service_Test-db-deployer
type: hdb
path: db
requires:
- name: hdi_db
properties:
TARGET_CONTAINER: ~{hdi-container-name}
parameters:
buildpack: nodejs_buildpack
- name: HANA_API_Service_Test-srv
type: nodejs
requires:
# - name: HANA_API_Service_Test-db
- name: hdi_db
resources:
- name: hdi_db
type: com.sap.xs.hdi-container
parameters:
config:
schema: HANA_API_SERVICE_TEST
service: hana
service-plan: hdi-shared
properties:
hdi-container-name: ${service-name}
…
"cds": {
"requires": {
"db": {
"kind": "hana-cloud"
}
}
}
…
npm install
service CatalogService {
function fun_register_call() returns Boolean;
function fun_register_call_with_param(comment: String, name: String, value: Integer) returns Boolean;
action act_register_call() returns Boolean;
action act_register_call_with_param(comment: String, name: String, value: Integer) returns Boolean;
}
const cds = require('@sap/cds')
module.exports = cds.service.impl(function () {
this.on('fun_register_call', async () => {
try {
let dbQuery = ' Call "REGISTER_CALL"( )'
let result = await cds.run(dbQuery, {})
console.log(result)
return true
} catch (error) {
console.error(error)
return false
}
})
this.on('fun_register_call_with_param', async (req) => {
try {
const { comment, name, value } = req.data;
let dbQuery = `Call "REGISTER_CALL_WITH_PARAM"("COMMENT" => '${comment}', "NAME" => '${name}', "VAL" => ${value} )`;
let result = await cds.run(dbQuery, {})
console.log(result)
return true
} catch (error) {
console.error(error)
return false
}
})
this.on('act_register_call', async () => {
try {
let dbQuery = ' Call "REGISTER_CALL"( )'
let result = await cds.run(dbQuery, {})
console.log(result)
return true
} catch (error) {
console.error(error)
return false
}
})
this.on('act_register_call_with_param', async (req) => {
try {
const { comment, name, value } = req.data;
let dbQuery = `Call "REGISTER_CALL_WITH_PARAM"("COMMENT" => '${comment}', "NAME" => '${name}', "VAL" => ${value} )`;
let result = await cds.run(dbQuery, {})
console.log(result)
return true
} catch (error) {
console.error(error)
return false
}
})
})
cds build
cds bind -2 <instance_name>:<service_key_name>
npm install
cds watch --profile hybrid
sap/cds Server
By clicking on $metadata a list of all services will be displayed:
… /catalog/fun_register_call()
API call through function (GET request)
API call through function with parameters
Database Explorer
cds add approuter
cd app
npm install
{
"authenticationMethod": "route",
"routes": [
{
"source": "^/app/(.*)$",
"target": "$1",
"localDir": ".",
"authenticationType": "xsuaa",
"cacheControl": "no-cache, no-store, must-revalidate"
},
{
"source": "^/(.*)$",
"target": "$1",
"destination": "srv-api",
"authenticationType": "xsuaa",
"csrfProtection": true
}
]
}
_schema-version: "2.1"
ID: HANA_API_Service_Test
version: 0.0.1
modules:
- name: HANA_API_Service_Test-db-deployer
type: hdb
path: db
requires:
- name: hdi_db
properties:
TARGET_CONTAINER: ~{hdi-container-name}
parameters:
buildpack: nodejs_buildpack
- name: HANA_API_Service_Test-srv
type: nodejs
requires:
# - name: HANA_API_Service_Test-db
- name: hdi_db
- name: HANA_API_Service_Test-auth
- name: HANA_API_Service_Test
type: approuter.nodejs
path: app # from cds.env.folders. Consider also cds.env.build.target -> gen/app
parameters:
keep-existing-routes: true
disk-quota: 256M
memory: 256M
requires:
- name: srv-api
group: destinations
properties:
name: srv-api # must be used in xs-app.json as well
url: ~{srv-url}
forwardAuthToken: true
- name: HANA_API_Service_Test-auth
resources:
- name: hdi_db
type: com.sap.xs.hdi-container
parameters:
config:
schema: HANA_API_SERVICE_TEST
service: hana
service-plan: hdi-shared
properties:
hdi-container-name: ${service-name}
- name: HANA_API_Service_Test-auth
type: org.cloudfoundry.managed-service
parameters:
service: xsuaa
service-plan: application
path: ./xs-security.json
config:
xsappname: HANA_API_Service_Test-${org}-${space}
tenant-mode: dedicated
_schema-version: "2.1"
ID: HANA_API_Service_Test
version: 0.0.1
modules:
- name: HANA_API_Service_Test-db-deployer
type: hdb
path: db
requires:
- name: hdi_db
properties:
TARGET_CONTAINER: ~{hdi-container-name}
parameters:
buildpack: nodejs_buildpack
- name: HANA_API_Service_Test-srv
type: nodejs
path: gen/srv
provides:
- name: srv-api # required by consumers of CAP services (e.g. approuter)
properties:
srv-url: ${default-url}
requires:
# - name: HANA_API_Service_Test-db
- name: hdi_db
- name: HANA_API_Service_Test-auth
- name: HANA_API_Service_Test
type: approuter.nodejs
path: app # from cds.env.folders. Consider also cds.env.build.target -> gen/app
parameters:
keep-existing-routes: true
disk-quota: 256M
memory: 256M
requires:
- name: srv-api
group: destinations
properties:
name: srv-api # must be used in xs-app.json as well
url: ~{srv-url}
forwardAuthToken: true
- name: HANA_API_Service_Test-auth
resources:
- name: hdi_db
type: com.sap.xs.hdi-container
parameters:
config:
schema: HANA_API_SERVICE_TEST
service: hana
service-plan: hdi-shared
properties:
hdi-container-name: ${service-name}
- name: HANA_API_Service_Test-auth
type: org.cloudfoundry.managed-service
parameters:
service: xsuaa
service-plan: application
path: ./xs-security.json
config:
xsappname: HANA_API_Service_Test-${org}-${space}
tenant-mode: dedicated
service CatalogService {
@requires: 'authenticated-user'
function fun_register_call() returns Boolean;
@requires: 'authenticated-user'
function fun_register_call_with_param(comment: String, name: String, value: Integer) returns Boolean;
@requires: 'authenticated-user'
action act_register_call() returns Boolean;
@requires: 'authenticated-user'
action act_register_call_with_param(comment: String, name: String, value: Integer) returns Boolean;
}
cd ..
cds compile srv/ --to xsuaa > xs-security.json
{
"xsappname": "HANA_API_Service_Test",
"tenant-mode": "dedicated",
"scopes": [
{
"name": "$XSAPPNAME.Admin",
"description": "Admin"
}
],
"attributes": [],
"role-templates": [
{
"name": "Admin",
"description": "generated",
"scope-references": [
"$XSAPPNAME.Admin"
],
"attribute-references": []
}
],
"oauth2-configuration": {
"credential-types": [
"binding-secret",
"x509"
],
"redirect-uris": [
"https://*.applicationstudio.cloud.sap/**"
]
}
}
cf create-service xsuaa application HANA_API_Service_Test-auth -c xs-security.json
cf create-service-key HANA_API_Service_Test-auth default
cds bind -2 HANA_API_Service_Test-auth:default
BTP Cockpit: Role Collection
{
"authenticationMethod": "route",
"logout": {
"logoutEndpoint": "/app-logout",
"logoutPage": "/"
},
"routes": [
{
"source": "^/app/(.*)$",
"target": "$1",
"localDir": ".",
"cacheControl": "no-cache, no-store, must-revalidate",
"authenticationType": "xsuaa"
},
{
"source": "^/(.*)$",
"target": "$1",
"destination": "srv-api",
"csrfProtection": true,
"authenticationType": "xsuaa"
},
{
"source": "^/user-api(.*)",
"target": "$1",
"service": "sap-approuter-userapi"
}
]
}
Npm install passport
npm i @sap/xssec
Npm install
cd gen/srv
npm install passport
npm i @sap/xssec
npm install
cd ../..
cds watch –profile hybrid
… /catalog/fun_register_call_with_param(comment='test_uaa',name='Hernan',value=1)
Authentication is required
cds bind --exec -- npm start --prefix app
Call via Application Router
{
"xsappname": "HANA_API_Service_Test",
"tenant-mode": "dedicated",
"scopes": [
{
"name": "$XSAPPNAME.Admin",
"description": "Admin"
}
],
"attributes": [],
"role-templates": [
{
"name": "Admin",
"description": "generated",
"scope-references": [
"$XSAPPNAME.Admin"
],
"attribute-references": []
}
]
}
_schema-version: "2.1"
ID: HANA_API_Service_Test
version: 0.0.1
modules:
- name: HANA_API_Service_Test-db-deployer
type: hdb
path: db
requires:
- name: HANA_API_Service_Test-db
properties:
TARGET_CONTAINER: ~{hdi-container-name}
parameters:
buildpack: nodejs_buildpack
build-parameters:
ignore: ["default-env.json", ".env"]
- name: HANA_API_Service_Test-srv
type: nodejs
path: gen/srv
provides:
- name: srv-api # required by consumers of CAP services (e.g. approuter)
properties:
srv-url: ${default-url}
requires:
- name: HANA_API_Service_Test-db
# - name: hdi_db
- name: HANA_API_Service_Test-auth
- name: HANA_API_Service_Test
type: approuter.nodejs
path: app # from cds.env.folders. Consider also cds.env.build.target -> gen/app
parameters:
keep-existing-routes: true
disk-quota: 256M
memory: 256M
requires:
- name: srv-api
group: destinations
properties:
name: srv-api # must be used in xs-app.json as well
url: ~{srv-url}
forwardAuthToken: true
- name: HANA_API_Service_Test-auth
resources:
- name: HANA_API_Service_Test-db
type: com.sap.xs.hdi-container
parameters:
config:
schema: HANA_API_SERVICE_TEST
service: hana
service-plan: hdi-shared
properties:
# hdi-container-name: ${service-name}
hdi-container-name: HANA_API_Service_Test-db
- name: HANA_API_Service_Test-auth
type: org.cloudfoundry.managed-service
parameters:
service: xsuaa
service-plan: application
path: ./xs-security.json
config:
# xsappname: HANA_API_Service_Test-${org}-${space}
xsappname: HANA_API_Service_Test
tenant-mode: dedicated
mbt build
Postman example - POST request
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
21 | |
12 | |
12 | |
11 | |
10 | |
9 | |
9 | |
8 | |
7 | |
7 |