Compare commits
4 Commits
next
...
ord-servic
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ccd11062a | ||
|
|
20348e0776 | ||
|
|
6acd5338d9 | ||
|
|
413d4de745 |
@@ -13,6 +13,7 @@
|
|||||||
"@cap-js/sqlite": "*"
|
"@cap-js/sqlite": "*"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@cap-js/ord": "2",
|
||||||
"@sap/cds": ">=7",
|
"@sap/cds": ">=7",
|
||||||
"express": "^4.17.1"
|
"express": "^4.17.1"
|
||||||
},
|
},
|
||||||
|
|||||||
1
ord/cds-plugin.js
Normal file
1
ord/cds-plugin.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
// just a dummy tag file to be identified as a plugin
|
||||||
12
ord/package.json
Normal file
12
ord/package.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "@cap-js/ord",
|
||||||
|
"version": "2.0.0",
|
||||||
|
"cds": {
|
||||||
|
"requires": {
|
||||||
|
"SAP ORD Service": {
|
||||||
|
"model": "@cap-js/ord/srv/ord-service",
|
||||||
|
"service": "OrdService"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
12
ord/srv/ord-service.cds
Normal file
12
ord/srv/ord-service.cds
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
// @requires: 'ORDconsumer'
|
||||||
|
@rest @path:'/ord/v1'
|
||||||
|
service OrdService {
|
||||||
|
@readonly entity documents {
|
||||||
|
key id: String;
|
||||||
|
}
|
||||||
|
@readonly entity csn {
|
||||||
|
key id: String;
|
||||||
|
}
|
||||||
|
|
||||||
|
function api (service: String, format: String) returns {};
|
||||||
|
}
|
||||||
73
ord/srv/ord-service.mjs
Normal file
73
ord/srv/ord-service.mjs
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
import cds from '@sap/cds'
|
||||||
|
export class OrdService extends cds.ApplicationService {
|
||||||
|
init(){
|
||||||
|
|
||||||
|
this.on('READ','documents', req => {
|
||||||
|
let csn = cds.context?.model || cds.model
|
||||||
|
return { ord: csn }
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Just an example to do something with id, if given.
|
||||||
|
* Try it out with URLs like that:
|
||||||
|
*
|
||||||
|
* - http://localhost:4004/ord/v1/documents
|
||||||
|
* - http://localhost:4004/ord/v1/documents/CatalogService
|
||||||
|
* - http://localhost:4004/ord/v1/documents/CatalogService.Books
|
||||||
|
* - http://localhost:4004/ord/v1/documents/CatalogService.Authors
|
||||||
|
*/
|
||||||
|
this.on('READ','csn', req => {
|
||||||
|
let csn = cds.context?.model || cds.model
|
||||||
|
let { id } = req.data
|
||||||
|
if (id) csn = csn.definitions[id] || 'not in model!'
|
||||||
|
return { id, csn }
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Just an example to serve arbitrary content with a function.
|
||||||
|
* Try it out with URLs like that:
|
||||||
|
*
|
||||||
|
* - http://localhost:4004/ord/v1/api?service=CatalogService
|
||||||
|
* - http://localhost:4004/ord/v1/api?service=CatalogService&format=edmx
|
||||||
|
* - http://localhost:4004/ord/v1/api?service=CatalogService&format=edmx-v2
|
||||||
|
* - http://localhost:4004/ord/v1/api?service=CatalogService&format=openapi
|
||||||
|
*/
|
||||||
|
this.on('api', req => {
|
||||||
|
let csn = cds.context?.model || cds.model
|
||||||
|
let { service, format = 'csn' } = req.data
|
||||||
|
let { res } = req.http
|
||||||
|
if (format === 'csn') {
|
||||||
|
if (!service) return res.send(csn)
|
||||||
|
service = csn.services[service]
|
||||||
|
return res.send({ definitions: [ service, ...service.entities ] .reduce ((all,e) => {
|
||||||
|
let d = all[e.name] = {...e}
|
||||||
|
delete d.projection // not part of the API
|
||||||
|
delete d.query // not part of the API
|
||||||
|
return all
|
||||||
|
},{})})
|
||||||
|
}
|
||||||
|
let api = cds.compile(csn).to[format]({service})
|
||||||
|
return res.send(api)
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example how to register arbitrary express routes,
|
||||||
|
* and map them to our service's interface.
|
||||||
|
* Try it out with URLs like that:
|
||||||
|
*
|
||||||
|
* - http://localhost:4004/ord/v1/csn/CatalogService
|
||||||
|
* - http://localhost:4004/ord/v1/edmx/CatalogService
|
||||||
|
* - http://localhost:4004/ord/v1/openapi/CatalogService
|
||||||
|
* - http://localhost:4004/ord/v1/asyncapi/CatalogService
|
||||||
|
*
|
||||||
|
* NOTE: we add cds.middlewares.before to the route, which gives us all
|
||||||
|
* the context and auth handling, which is also available to CAP services.
|
||||||
|
*/
|
||||||
|
cds.app.get (`${this.path}/:api?/:service?`, cds.middlewares.before, req => {
|
||||||
|
const { api, service } = req.params
|
||||||
|
return this.api (service, api)
|
||||||
|
})
|
||||||
|
|
||||||
|
return super.init()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,6 +15,7 @@
|
|||||||
"./fiori",
|
"./fiori",
|
||||||
"./hello",
|
"./hello",
|
||||||
"./media",
|
"./media",
|
||||||
|
"./ord",
|
||||||
"./orders",
|
"./orders",
|
||||||
"./loggers",
|
"./loggers",
|
||||||
"./reviews"
|
"./reviews"
|
||||||
|
|||||||
Reference in New Issue
Block a user