From 7825653c61a74bb6c0e34e29068d2051bfb7eba2 Mon Sep 17 00:00:00 2001 From: i079695 Date: Fri, 6 Sep 2019 12:16:54 +0200 Subject: [PATCH] Add initial content --- .eslintrc | 24 +++ .gitignore | 15 ++ .npmrc | 1 + lerna.json | 7 + package.json | 16 ++ packages/bookstore/.cdsrc.json | 6 + packages/bookstore/.gitignore | 15 ++ packages/bookstore/package.json | 20 +++ packages/products-service/.gitignore | 12 ++ packages/products-service/db/schema.cds | 18 ++ packages/products-service/index.cds | 2 + packages/products-service/package.json | 16 ++ .../products-service/srv/admin-service.cds | 7 + .../products-service/tests/categories.test.js | 68 ++++++++ .../data/sap.capire.products-Categories.csv | 10 ++ packages/products-service/tests/postman.json | 157 ++++++++++++++++++ shared/dev-env/package.json | 11 ++ shared/tests-env/package.json | 10 ++ 18 files changed, 415 insertions(+) create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 lerna.json create mode 100644 package.json create mode 100644 packages/bookstore/.cdsrc.json create mode 100644 packages/bookstore/.gitignore create mode 100644 packages/bookstore/package.json create mode 100644 packages/products-service/.gitignore create mode 100644 packages/products-service/db/schema.cds create mode 100644 packages/products-service/index.cds create mode 100644 packages/products-service/package.json create mode 100644 packages/products-service/srv/admin-service.cds create mode 100644 packages/products-service/tests/categories.test.js create mode 100644 packages/products-service/tests/data/sap.capire.products-Categories.csv create mode 100644 packages/products-service/tests/postman.json create mode 100644 shared/dev-env/package.json create mode 100644 shared/tests-env/package.json diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..79cf25fe --- /dev/null +++ b/.eslintrc @@ -0,0 +1,24 @@ +{ + "extends": "eslint:recommended", + "env": { + "node": true, + "es6": true, + "jest": true + }, + "parserOptions": { + "ecmaVersion": 2017 + }, + "globals": { + "SELECT": true, + "INSERT": true, + "UPDATE": true, + "DELETE": true, + "CREATE": true, + "DROP": true, + "cds": true + }, + "rules": { + "no-console": "off", + "require-atomic-updates": "off" + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..223b4534 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +.gen/ +_out/ +dist/ +edmx/ +gen/ +mta_archives/ +node_modules/ +target/ + +.DS_Store +*.log +*.mtar +connection.properties +default-env.json +packages/messageBox diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..43c97e71 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/lerna.json b/lerna.json new file mode 100644 index 00000000..3bf7eb30 --- /dev/null +++ b/lerna.json @@ -0,0 +1,7 @@ +{ + "packages": [ + "packages/*", + "shared/*" + ], + "version": "0.0.0" +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 00000000..26d7e5df --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "@sap/capire-samples", + "description": "The umbrella project for all samples to easily setup for local development and tests.", + "repository": "https://github.wdf.sap.corp/capire/samples.git", + "author": "daniel.hutzel@sap.com", + "private": true, + "scripts": { + "install": "(npx --no-install lerna -v || npm i lerna --no-save) && lerna bootstrap --hoist --ignore tests-env --loglevel warn", + "reset": "lerna clean -y && rm -fr node_modules", + "test": "jest", + "bookstore": "cds run packages/bookstore --in-memory", + "products-service": "cds run packages/products-service --in-memory", + "reviews-service": "cds run packages/reviews-service --in-memory" + }, + "license": "ISC" +} diff --git a/packages/bookstore/.cdsrc.json b/packages/bookstore/.cdsrc.json new file mode 100644 index 00000000..83eb56d4 --- /dev/null +++ b/packages/bookstore/.cdsrc.json @@ -0,0 +1,6 @@ +{ + "build": { + "target": ".", + "tasks": [] + } +} \ No newline at end of file diff --git a/packages/bookstore/.gitignore b/packages/bookstore/.gitignore new file mode 100644 index 00000000..502ead7c --- /dev/null +++ b/packages/bookstore/.gitignore @@ -0,0 +1,15 @@ +.che/ +.gen/ +gen/ +mta_archives/ +node_modules/ +target/ + +.cds_gen.log +connection.properties +*.db +.DS_Store +*.orig +_out +default-*.json +package-lock.json diff --git a/packages/bookstore/package.json b/packages/bookstore/package.json new file mode 100644 index 00000000..7d35a774 --- /dev/null +++ b/packages/bookstore/package.json @@ -0,0 +1,20 @@ +{ + "name": "bookstore", + "description": "Generated by cds init", + "repository": "", + "license": "ISC", + "version": "1.0.0", + "engines": { + "node": "^8.9" + }, + "dependencies": { + "@sap/cds": "^3.16.3", + "@sap/cds-rest": "latest", + "express": "^4.17.1" + }, + "scripts": { + "build": "cds build/all --clean", + "deploy": "cds deploy", + "start": "cds run" + } +} diff --git a/packages/products-service/.gitignore b/packages/products-service/.gitignore new file mode 100644 index 00000000..8b8bd34e --- /dev/null +++ b/packages/products-service/.gitignore @@ -0,0 +1,12 @@ +gen/ +.gen/ +node_modules/ +target/ +*.db +.DS_Store +_out +.che/ +.cds_gen.log +package-lock.json +*.orig +mta_archives/ diff --git a/packages/products-service/db/schema.cds b/packages/products-service/db/schema.cds new file mode 100644 index 00000000..573e93ad --- /dev/null +++ b/packages/products-service/db/schema.cds @@ -0,0 +1,18 @@ +namespace sap.capire.products; + +using { Currency, cuid, managed, sap.common.CodeList } from '@sap/cds/common'; + +entity Products : cuid, managed { + title : localized String(111); + descr : localized String(1111); + stock : Integer; + price : Decimal(9,2); + currency : Currency; + category : Association to Categories; +} + +entity Categories : CodeList { + key ID : Integer; + parent : Association to Categories; + children : Composition of many Categories on children.parent = $self; +} diff --git a/packages/products-service/index.cds b/packages/products-service/index.cds new file mode 100644 index 00000000..581fba09 --- /dev/null +++ b/packages/products-service/index.cds @@ -0,0 +1,2 @@ +using from './db/schema'; +using from './srv/admin-service'; diff --git a/packages/products-service/package.json b/packages/products-service/package.json new file mode 100644 index 00000000..24268722 --- /dev/null +++ b/packages/products-service/package.json @@ -0,0 +1,16 @@ +{ + "name": "@sap/capire-products", + "version": "1.0.0", + "description": "A reuse package providing domain models and services to manage product catalogs.", + "repository": "https://github.wdf.sap.corp/caps/products-service.git", + "license": "ISC", + "dependencies": { + "@sap/cds": "^3.16.3", + "express": "^4.17.1" + }, + "files": [ + "db", + "srv", + "index.cds" + ] +} diff --git a/packages/products-service/srv/admin-service.cds b/packages/products-service/srv/admin-service.cds new file mode 100644 index 00000000..a7ebd575 --- /dev/null +++ b/packages/products-service/srv/admin-service.cds @@ -0,0 +1,7 @@ +using { sap.capire.products as db } from '../db/schema'; +namespace sap.capire.products; + +service AdminService @(_requires:'admin') { + entity Products as projection on db.Products; + entity Categories as projection on db.Categories; +} diff --git a/packages/products-service/tests/categories.test.js b/packages/products-service/tests/categories.test.js new file mode 100644 index 00000000..8e541a4b --- /dev/null +++ b/packages/products-service/tests/categories.test.js @@ -0,0 +1,68 @@ +const cds = require ('@sap/cds') + +describe('reading/writing hierarchies', ()=>{ + + it ('should prepare to sqlite in-memory', async()=>{ + await cds.deploy (__dirname+'/../db') .to ('sqlite::memory:') + expect (cds.model) .toBeDefined() + }) + + it ('should insert hierarchy of categories', ()=>{ + const { Categories } = cds.entities + return INSERT.into (Categories) .entries ( + { ID:100, name:'Some Sample Categories...', children:[ + { ID:101, name:'Cat', children:[ + { ID:102, name:'Kitty', children:[ + { ID:103, name:'Kitty Cat', children:[ + { ID:104, name:'Aristocat' } ]}, + { ID:105, name:'Kitty Bat' } ]}, + { ID:106, name:'Catwoman', children:[ + { ID:107, name:'Catalina' } ]} ]}, + { ID:108, name:'Catweazle' } + ]} + ) + }) + + it ('should read categories with children', async()=>{ + const { Categories } = cds.entities + expect (await + + SELECT.one.from (Categories, c=>{ + c.ID, c.name.as('parent'), c.children (c=>{ + c.name.as('child') + }) + }) .where ({name:'Cat'}) + + ) .toMatchObject ( + + { ID:101, parent:'Cat', children:[ + { child:'Kitty' }, + { child:'Catwoman' }, + ]} + + ) + }) + + it ('should read hierarchy of categories', async()=>{ + const { Categories } = cds.entities + expect (await + + SELECT.one.from (Categories, c=>{ + c.ID, c.name, c.children (c=>{ c.name },{levels:3}) + }) .where ({name:'Cat'}) + + ) .toMatchObject ( + + { ID:101, name:'Cat', children:[ + { name:'Kitty', children:[ + { name:'Kitty Cat', children:[ + { name:'Aristocat' }, ]}, + { name:'Kitty Bat' }, ]}, + { name:'Catwoman', children:[ + { name:'Catalina' } ]}, + ]} + + ) + }) + +}) diff --git a/packages/products-service/tests/data/sap.capire.products-Categories.csv b/packages/products-service/tests/data/sap.capire.products-Categories.csv new file mode 100644 index 00000000..20183828 --- /dev/null +++ b/packages/products-service/tests/data/sap.capire.products-Categories.csv @@ -0,0 +1,10 @@ +ID;parent_ID;name +0;;Some Sample Categories... +1;;Cat +2;1;Kitty +3;2;Kitty Cat +4;3;Aristocat +5;2;Kitty Bat +6;1;Catwoman +7;6;Catalina +8;;Catweazle diff --git a/packages/products-service/tests/postman.json b/packages/products-service/tests/postman.json new file mode 100644 index 00000000..53381a32 --- /dev/null +++ b/packages/products-service/tests/postman.json @@ -0,0 +1,157 @@ +{ + "info": { + "_postman_id": "0f8d4e79-a1c2-47fe-aeab-0319fb4ce180", + "name": "@sap/capire-products", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "Categories", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{ \"ID\":0, \"name\":\"Some Sample Categories...\", \"children\":[\n { \"ID\":1, \"name\":\"Cat\", \"children\":[\n { \"ID\":2, \"name\":\"Kitty\", \"children\":[\n { \"ID\":3, \"name\":\"Kitty Cat\", \"children\":[\n { \"ID\":4, \"name\":\"Aristocat\" }\n ]},\n { \"ID\":5, \"name\":\"Kitty Bat\" }\n ]},\n { \"ID\":6, \"name\":\"Catwoman\", \"children\":[\n { \"ID\":7, \"name\":\"Catalina\" }\n ]}\n ] },\n { \"ID\":8, \"name\":\"Catweazle\" }\n]}\n" + }, + "url": { + "raw": "http://localhost:4004/admin/cats", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "4004", + "path": [ + "admin", + "cats" + ] + } + }, + "response": [] + }, + { + "name": "Categories", + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "http://localhost:4004/admin/cats/0?$expand=children($expand=children($expand=children($expand=children)))", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "4004", + "path": [ + "admin", + "cats", + "0" + ], + "query": [ + { + "key": "$expand", + "value": "children($expand=children($expand=children($expand=children)))" + } + ] + } + }, + "response": [ + { + "name": "Categories", + "originalRequest": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "http://localhost:4004/admin/cats/0?$expand=children($expand=children($expand=children($expand=children)))", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "4004", + "path": [ + "admin", + "cats", + "0" + ], + "query": [ + { + "key": "$expand", + "value": "children($expand=children($expand=children($expand=children)))" + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "X-Powered-By", + "value": "Express" + }, + { + "key": "OData-Version", + "value": "4.0" + }, + { + "key": "content-type", + "value": "application/json;odata.metadata=minimal" + }, + { + "key": "Date", + "value": "Tue, 21 May 2019 19:20:24 GMT" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "Content-Length", + "value": "767" + } + ], + "cookie": [], + "body": "{\n \"@odata.context\": \"$metadata#cats(children(children(children(children()))))/$entity\",\n \"@odata.metadataEtag\": \"W/\\\"+AAp4JKNOcr+OusjrdQo55RCfM+UHKpTh8EbhsxyPhM=\\\"\",\n \"name\": \"Some Sample Categories...\",\n \"descr\": null,\n \"ID\": 0,\n \"parent_ID\": null,\n \"children\": [\n {\n \"name\": \"Cat\",\n \"descr\": null,\n \"ID\": 1,\n \"parent_ID\": 0,\n \"children\": [\n {\n \"name\": \"Kitty\",\n \"descr\": null,\n \"ID\": 2,\n \"parent_ID\": 1,\n \"children\": [\n {\n \"name\": \"Kitty Cat\",\n \"descr\": null,\n \"ID\": 3,\n \"parent_ID\": 2,\n \"children\": [\n {\n \"name\": \"Aristocat\",\n \"descr\": null,\n \"ID\": 4,\n \"parent_ID\": 3\n }\n ]\n },\n {\n \"name\": \"Kitty Bat\",\n \"descr\": null,\n \"ID\": 5,\n \"parent_ID\": 2,\n \"children\": []\n }\n ]\n },\n {\n \"name\": \"Catwoman\",\n \"descr\": null,\n \"ID\": 6,\n \"parent_ID\": 1,\n \"children\": [\n {\n \"name\": \"Catalina\",\n \"descr\": null,\n \"ID\": 7,\n \"parent_ID\": 6,\n \"children\": []\n }\n ]\n }\n ]\n },\n {\n \"name\": \"Catweazle\",\n \"descr\": null,\n \"ID\": 8,\n \"parent_ID\": 0,\n \"children\": []\n }\n ]\n}" + } + ] + }, + { + "name": "Categories", + "request": { + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "http://localhost:4004/admin/cats/0", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "4004", + "path": [ + "admin", + "cats", + "0" + ] + } + }, + "response": [] + } + ] + +} \ No newline at end of file diff --git a/shared/dev-env/package.json b/shared/dev-env/package.json new file mode 100644 index 00000000..4f2726f4 --- /dev/null +++ b/shared/dev-env/package.json @@ -0,0 +1,11 @@ +{ + "name": "dev-env", + "author": "daniel.hutzel@sap.com", + "dependencies": { + "@sap/cds": "^3.16.3" + }, + "devDependencies": { + "sqlite3": "^4.0.7" + }, + "license": "ISC" +} diff --git a/shared/tests-env/package.json b/shared/tests-env/package.json new file mode 100644 index 00000000..1f1880a9 --- /dev/null +++ b/shared/tests-env/package.json @@ -0,0 +1,10 @@ +{ + "name": "tests-env", + "author": "daniel.hutzel@sap.com", + "devDependencies": { + "@types/jest": "*", + "jest": "^24.8.0", + "supertest": "^4.0.2" + }, + "license": "ISC" +}