Add initial content
This commit is contained in:
24
.eslintrc
Normal file
24
.eslintrc
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
15
.gitignore
vendored
Normal file
15
.gitignore
vendored
Normal file
@@ -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
|
||||||
7
lerna.json
Normal file
7
lerna.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"packages": [
|
||||||
|
"packages/*",
|
||||||
|
"shared/*"
|
||||||
|
],
|
||||||
|
"version": "0.0.0"
|
||||||
|
}
|
||||||
16
package.json
Normal file
16
package.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
6
packages/bookstore/.cdsrc.json
Normal file
6
packages/bookstore/.cdsrc.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"target": ".",
|
||||||
|
"tasks": []
|
||||||
|
}
|
||||||
|
}
|
||||||
15
packages/bookstore/.gitignore
vendored
Normal file
15
packages/bookstore/.gitignore
vendored
Normal file
@@ -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
|
||||||
20
packages/bookstore/package.json
Normal file
20
packages/bookstore/package.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "bookstore",
|
||||||
|
"description": "Generated by cds init",
|
||||||
|
"repository": "<Add your repository here>",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
12
packages/products-service/.gitignore
vendored
Normal file
12
packages/products-service/.gitignore
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
gen/
|
||||||
|
.gen/
|
||||||
|
node_modules/
|
||||||
|
target/
|
||||||
|
*.db
|
||||||
|
.DS_Store
|
||||||
|
_out
|
||||||
|
.che/
|
||||||
|
.cds_gen.log
|
||||||
|
package-lock.json
|
||||||
|
*.orig
|
||||||
|
mta_archives/
|
||||||
18
packages/products-service/db/schema.cds
Normal file
18
packages/products-service/db/schema.cds
Normal file
@@ -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;
|
||||||
|
}
|
||||||
2
packages/products-service/index.cds
Normal file
2
packages/products-service/index.cds
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
using from './db/schema';
|
||||||
|
using from './srv/admin-service';
|
||||||
16
packages/products-service/package.json
Normal file
16
packages/products-service/package.json
Normal file
@@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
7
packages/products-service/srv/admin-service.cds
Normal file
7
packages/products-service/srv/admin-service.cds
Normal file
@@ -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;
|
||||||
|
}
|
||||||
68
packages/products-service/tests/categories.test.js
Normal file
68
packages/products-service/tests/categories.test.js
Normal file
@@ -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' } ]},
|
||||||
|
]}
|
||||||
|
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
@@ -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
|
||||||
|
157
packages/products-service/tests/postman.json
Normal file
157
packages/products-service/tests/postman.json
Normal file
@@ -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": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
11
shared/dev-env/package.json
Normal file
11
shared/dev-env/package.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
10
shared/tests-env/package.json
Normal file
10
shared/tests-env/package.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user