From 413d4de74599876c57a41b49c3cf707a4332a1d5 Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Fri, 21 Feb 2025 12:57:05 +0100 Subject: [PATCH] some samples how to serve things --- bookshop/srv/ord-service.cds | 12 ++++++++ bookshop/srv/ord-service.mjs | 53 ++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 bookshop/srv/ord-service.cds create mode 100644 bookshop/srv/ord-service.mjs diff --git a/bookshop/srv/ord-service.cds b/bookshop/srv/ord-service.cds new file mode 100644 index 00000000..05a0c5f2 --- /dev/null +++ b/bookshop/srv/ord-service.cds @@ -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 {}; +} diff --git a/bookshop/srv/ord-service.mjs b/bookshop/srv/ord-service.mjs new file mode 100644 index 00000000..92633615 --- /dev/null +++ b/bookshop/srv/ord-service.mjs @@ -0,0 +1,53 @@ +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 } = req.data + let { res } = req.http + if (!format) { + 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) + }) + + return super.init() + } +}