diff --git a/data-viewer/app/viewer/app.js b/etc/data-viewer/app/viewer/app.js similarity index 100% rename from data-viewer/app/viewer/app.js rename to etc/data-viewer/app/viewer/app.js diff --git a/data-viewer/app/viewer/index.html b/etc/data-viewer/app/viewer/index.html similarity index 100% rename from data-viewer/app/viewer/index.html rename to etc/data-viewer/app/viewer/index.html diff --git a/data-viewer/index.cds b/etc/data-viewer/index.cds similarity index 100% rename from data-viewer/index.cds rename to etc/data-viewer/index.cds diff --git a/data-viewer/package.json b/etc/data-viewer/package.json similarity index 100% rename from data-viewer/package.json rename to etc/data-viewer/package.json diff --git a/data-viewer/srv/data-service.cds b/etc/data-viewer/srv/data-service.cds similarity index 100% rename from data-viewer/srv/data-service.cds rename to etc/data-viewer/srv/data-service.cds diff --git a/data-viewer/srv/data-service.js b/etc/data-viewer/srv/data-service.js similarity index 100% rename from data-viewer/srv/data-service.js rename to etc/data-viewer/srv/data-service.js diff --git a/loggers/app/loggers.html b/etc/loggers/app/loggers.html similarity index 100% rename from loggers/app/loggers.html rename to etc/loggers/app/loggers.html diff --git a/loggers/package.json b/etc/loggers/package.json similarity index 100% rename from loggers/package.json rename to etc/loggers/package.json diff --git a/loggers/readme.md b/etc/loggers/readme.md similarity index 100% rename from loggers/readme.md rename to etc/loggers/readme.md diff --git a/loggers/srv/dummy.cds b/etc/loggers/srv/dummy.cds similarity index 100% rename from loggers/srv/dummy.cds rename to etc/loggers/srv/dummy.cds diff --git a/loggers/srv/loggers.cds b/etc/loggers/srv/loggers.cds similarity index 100% rename from loggers/srv/loggers.cds rename to etc/loggers/srv/loggers.cds diff --git a/loggers/srv/loggers.js b/etc/loggers/srv/loggers.js similarity index 100% rename from loggers/srv/loggers.js rename to etc/loggers/srv/loggers.js diff --git a/loggers/test/requests.http b/etc/loggers/test/requests.http similarity index 100% rename from loggers/test/requests.http rename to etc/loggers/test/requests.http diff --git a/hello/README.md b/hello/README.md deleted file mode 100644 index 4ac6f0a9..00000000 --- a/hello/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Hello World Getting Started Sample - -## Next Steps - -- To run the JavaScript implementation, open a new terminal and run `cds watch`. -- To run the TypeScript implementation, open a new terminal and run `cds-ts watch`. - -Then call the service at: http://localhost:4004/say/hello(to='world') - -## Learn More - -Learn more about: - -- [Hello World!](https://cap.cloud.sap/docs/get-started/hello-world) -- [Using TypeScript](https://cap.cloud.sap/docs/node.js/typescript) diff --git a/hello/package.json b/hello/package.json deleted file mode 100644 index fb33e171..00000000 --- a/hello/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "@capire/hello-world", - "version": "1.0.0", - "scripts": { - "test": "npx jest --silent", - "start": "cds-serve srv/world.cds", - "start:ts": "cds-ts serve srv/world.cds" - }, - "dependencies": { - "@sap/cds": ">=5.0.4" - } -} diff --git a/hello/srv/world.cds b/hello/srv/world.cds deleted file mode 100644 index 0bceafcb..00000000 --- a/hello/srv/world.cds +++ /dev/null @@ -1,3 +0,0 @@ -service say { - function hello (to:String) returns String; -} \ No newline at end of file diff --git a/hello/srv/world.js b/hello/srv/world.js deleted file mode 100644 index c5cd2495..00000000 --- a/hello/srv/world.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = class say { - hello(req) { - let {to} = req.data - if (to === 'me') to = require('os').userInfo().username - return `Hello ${to}!` - } -} diff --git a/hello/srv/world.ts b/hello/srv/world.ts deleted file mode 100644 index e812c41e..00000000 --- a/hello/srv/world.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Request } from "@sap/cds" - -module.exports = class say { - hello(req: Request) { - return `Hello ${req.data.to} from a TypeScript file!` - } -} diff --git a/hello/test/test.http b/hello/test/test.http deleted file mode 100644 index 6e530877..00000000 --- a/hello/test/test.http +++ /dev/null @@ -1,5 +0,0 @@ -GET http://localhost:4004/odata/v4/say/hello -### - -GET http://localhost:4004/odata/v4/say/hello(to='me') -### diff --git a/media/db/data-model.cds b/media/db/data-model.cds deleted file mode 100644 index 2ad6c28e..00000000 --- a/media/db/data-model.cds +++ /dev/null @@ -1,13 +0,0 @@ -namespace sap.capire.media; - -entity Media { - - key id:Integer; - @Core.MediaType: mediaType - content : LargeBinary ; - - @Core.IsMediaType: true - mediaType : String; - fileName : String; - applicationName:String; -} \ No newline at end of file diff --git a/media/index.cds b/media/index.cds deleted file mode 100644 index 9ac07e86..00000000 --- a/media/index.cds +++ /dev/null @@ -1,2 +0,0 @@ -using from './db/data-model'; -using from './srv/media-service'; diff --git a/media/package.json b/media/package.json deleted file mode 100644 index 8fb8100a..00000000 --- a/media/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@capire/media", - "version": "1.0.0", - "dependencies": { - "lokijs": "^1.5.6" - }, - "files": [ - "db", - "srv", - "index.cds" - ], - "cds": { - "requires": { - "db": { - "kind": "sql" - } - } - } -} diff --git a/media/srv/media-service.cds b/media/srv/media-service.cds deleted file mode 100644 index 811dd741..00000000 --- a/media/srv/media-service.cds +++ /dev/null @@ -1,9 +0,0 @@ -using { sap.capire.media as db } from '../db/data-model'; -namespace sap.capire.media; - -@path: '/media-server' -service MediaServer { - entity Media as projection on db.Media ; -} - - \ No newline at end of file diff --git a/media/srv/media-service.js b/media/srv/media-service.js deleted file mode 100644 index ed9d480c..00000000 --- a/media/srv/media-service.js +++ /dev/null @@ -1,68 +0,0 @@ -const loki = require('lokijs') -const db = new loki('DB') -const mediaDB = db.addCollection('Media') -const { Readable, PassThrough } = require('stream') - -module.exports = srv => { - srv.before('CREATE', 'Media', req => { - const obj = mediaDB.insert({ media: '' }) - req.data.id = obj.$loki - }) - - srv.on('UPDATE', 'Media', (req, next) => { - const url = req.path - if (url.includes('content')) { - const id = req.data.id - const obj = mediaDB.get(id) - if (!obj) { - req.reject(404, 'No record found for the ID') - return - } - const stream = new PassThrough() - const chunks = [] - stream.on('data', chunk => { - chunks.push(chunk) - }) - stream.on('end', () => { - obj.media = Buffer.concat(chunks).toString('base64') - mediaDB.update(obj) - }) - req.data.content.pipe(stream) - } else return next() - }) - - srv.on('READ', 'Media', (req, next) => { - const url = req.path - if (url.includes('content')) { - const id = req.data.id - const mediaObj = mediaDB.get(id) - if (!mediaObj) { - req.reject(404, 'Media not found for the ID') - return - } - const decodedMedia = Buffer.from( - mediaObj.media.split(';base64,').pop(), - 'base64' - ) - return _formatResult(decodedMedia) - } else return next() //> delegate to next/default handlers - }) - - srv.on('DELETE', 'Media', (req, next) => { - const id = req.data.id - mediaDB - .chain() - .find({ $loki: id }) - .remove() - return next() //> delegate to next/default handlers - }) - - function _formatResult (decodedMedia) { - const readable = new Readable() - const result = new Array() - readable.push(decodedMedia) - readable.push(null) - result.push({ value: readable }) - return result - } -} diff --git a/media/test/Test.png b/media/test/Test.png deleted file mode 100644 index 89bf6497..00000000 Binary files a/media/test/Test.png and /dev/null differ diff --git a/media/test/media.http b/media/test/media.http deleted file mode 100644 index eaa34ac8..00000000 --- a/media/test/media.http +++ /dev/null @@ -1,35 +0,0 @@ -### Requires REST Client for VS Code -### https://marketplace.visualstudio.com/items?itemName=humao.rest-client -### -@protocol = http -@host = localhost -@port = 4004 -### Read Pictures -GET {{protocol}}://{{host}}:{{port}}/media-server/Media -Authorization: Basic admin: - -### Create Picture with mediatype -POST {{protocol}}://{{host}}:{{port}}/media-server/Media -Authorization: Basic admin: -Accept: application/json -Content-Type: application/json - -{ - "id": 1, - "mediaType": "image/png" -} - -### Upload Binary PNG -PUT {{protocol}}://{{host}}:{{port}}/media-server/Media(1)/content -Authorization: Basic admin: -Content-Type: image/png - -< ./Test.png - -### Read Binary -GET {{protocol}}://{{host}}:{{port}}/media-server/Media(1)/content -Authorization: Basic admin: - -### Delete Image -DELETE {{protocol}}://{{host}}:{{port}}/media-server/Media(1) -Authorization: Basic admin: diff --git a/package-lock.json b/package-lock.json index 130bfa7a..275635fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,24 +1,22 @@ { "name": "@capire/samples", - "version": "2.1.0", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@capire/samples", - "version": "2.1.0", + "version": "3.0.0", "license": "SEE LICENSE IN LICENSE", "workspaces": [ "./bookshop", "./bookstore", "./common", - "./data-viewer", "./fiori", - "./hello", - "./media", "./orders", - "./loggers", - "./reviews" + "./reviews", + "./etc/data-viewer", + "./etc/loggers" ], "dependencies": { "@sap/cds": ">=8" @@ -68,10 +66,26 @@ "data-viewer": { "name": "@capire/data-viewer", "version": "0.1.0", + "extraneous": true, "dependencies": { "@sap/cds": ">=5.0.4" } }, + "etc/data-viewer": { + "name": "@capire/data-viewer", + "version": "0.1.0", + "dependencies": { + "@sap/cds": ">=5.0.4" + } + }, + "etc/loggers": { + "name": "@capire/loggers", + "version": "1.0.0", + "dependencies": { + "@sap/cds": ">=5.9", + "express": "^4.17.1" + } + }, "fiori": { "name": "@capire/fiori", "version": "1.0.0", @@ -88,6 +102,7 @@ "hello": { "name": "@capire/hello-world", "version": "1.0.0", + "extraneous": true, "dependencies": { "@sap/cds": ">=5.0.4" } @@ -95,6 +110,7 @@ "loggers": { "name": "@capire/loggers", "version": "1.0.0", + "extraneous": true, "dependencies": { "@sap/cds": ">=5.9", "express": "^4.17.1" @@ -103,6 +119,7 @@ "media": { "name": "@capire/media", "version": "1.0.0", + "extraneous": true, "dependencies": { "lokijs": "^1.5.6" } @@ -176,23 +193,15 @@ "link": true }, "node_modules/@capire/data-viewer": { - "resolved": "data-viewer", + "resolved": "etc/data-viewer", "link": true }, "node_modules/@capire/fiori": { "resolved": "fiori", "link": true }, - "node_modules/@capire/hello-world": { - "resolved": "hello", - "link": true - }, "node_modules/@capire/loggers": { - "resolved": "loggers", - "link": true - }, - "node_modules/@capire/media": { - "resolved": "media", + "resolved": "etc/loggers", "link": true }, "node_modules/@capire/orders": { @@ -2176,12 +2185,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lokijs": { - "version": "1.5.12", - "resolved": "https://registry.npmjs.org/lokijs/-/lokijs-1.5.12.tgz", - "integrity": "sha512-Q5ALD6JiS6xAUWCwX3taQmgwxyveCtIIuL08+ml0nHwT3k0S/GIFJN+Hd38b1qYIMaE5X++iqsqWVksz7SYW+Q==", - "license": "MIT" - }, "node_modules/loupe": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", diff --git a/package.json b/package.json index 97d1246f..9511dfd7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@capire/samples", - "version": "2.1.0", + "version": "3.0.0", "description": "A monorepo with several samples for CAP.", "repository": "https://github.com/sap-samples/cloud-cap-samples.git", "author": "daniel.hutzel@sap.com", @@ -11,13 +11,11 @@ "./bookshop", "./bookstore", "./common", - "./data-viewer", "./fiori", - "./hello", - "./media", "./orders", - "./loggers", - "./reviews" + "./reviews", + "./etc/data-viewer", + "./etc/loggers" ], "devDependencies": { "@cap-js/cds-types": "^0", @@ -31,15 +29,11 @@ }, "scripts": { "bookshop": "cds watch bookshop", - "start": "cds watch fiori", "fiori": "cds watch fiori", - "hello": "cds watch hello", - "media": "cds watch media", "lint": "eslint", "test": "npx jest --silent", "jest": "npx jest --silent", - "mocha": "CDS_TEST_SILENT=y npx mocha", - "test:hello": "cd hello && npm test" + "mocha": "CDS_TEST_SILENT=y npx mocha" }, "mocha": { "recursive": true, diff --git a/samples.md b/samples.md index 5fb85e51..c0edd2dc 100644 --- a/samples.md +++ b/samples.md @@ -6,12 +6,6 @@ Each sub directory essentially is an individual npm package arranged in an [all- ![](etc/samples.drawio.svg) -## [@capire/hello-world](hello) - -- A simplistic [Hello World](https://cap.cloud.sap/docs/get-started/hello-world) service using [CDS](https://cap.cloud.sap/docs/cds/) and [cds.services](https://cap.cloud.sap/docs/node.js/api#services-api). -- [Typescript support](https://cap.cloud.sap/docs/node.js/typescript) - - ## [@capire/bookshop](bookshop) - [Getting Started](https://cap.cloud.sap/docs/get-started/in-a-nutshell) with CAP, briefly introducing: @@ -60,10 +54,10 @@ Each sub directory essentially is an individual npm package arranged in an [all- - [@capire/reviews](reviews) - [@capire/orders](orders) - [@capire/common](common) - - [@capire/data-viewer](data-viewer) + - [@capire/data-viewer](etc/data-viewer) - [The Vue.js app](bookshop/app/vue) imported from `bookshop` is served as well - [The Vue.js app](reviews/app/vue) imported from `reviews` is served as well -- [The Vue.js app](data-viewer/app/data) imported from `data-viewer` is served as well +- [The Vue.js app](etc/data-viewer/app/data) imported from `data-viewer` is served as well - [The Fiori app](orders/app) imported from `orders` is served as well - [OpenAPI export + Swagger UI](https://cap.cloud.sap/docs/advanced/openapi) diff --git a/test/hello-world.test.js b/test/hello-world.test.js deleted file mode 100644 index 1ebdfaf8..00000000 --- a/test/hello-world.test.js +++ /dev/null @@ -1,22 +0,0 @@ -const cds = require('@sap/cds') - -describe('cap/samples - Hello world!', () => { - - const { GET, expect } = cds.test (__dirname+'/../hello') - - it('should say hello with class impl', async () => { - const {data} = await GET `/odata/v4/say/hello(to='world')` - expect(data.value).to.eql('Hello world!') - }) - - it('should say hello with another impl', async () => { - await cds.serve('say').from(cds.model) - .at('/say-again').in(cds.app) - .with(srv => { - srv.on('hello', (req) => `Hello again ${req.data.to}!`) - }) - const {data} = await GET `/say-again/hello(to='world')` - expect(data.value).to.eql('Hello again world!') - }) - -})