Compare commits
46 Commits
common-con
...
compose-wi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8c5a20bdb0 | ||
|
|
c14ee0062c | ||
|
|
5eb293d378 | ||
|
|
b8469d562f | ||
|
|
afd4df3f39 | ||
|
|
0228841260 | ||
|
|
24ad8a84da | ||
|
|
e3acbb9832 | ||
|
|
36a800165b | ||
|
|
e5e86cb733 | ||
|
|
f5c7b50a6d | ||
|
|
6ae95cfa51 | ||
|
|
ec03c6418b | ||
|
|
021df191ec | ||
|
|
2e0a5aeb73 | ||
|
|
8b978a94ec | ||
|
|
9596511883 | ||
|
|
191e577e51 | ||
|
|
d67af1432b | ||
|
|
52b4dbeacc | ||
|
|
4a8d8a0ec3 | ||
|
|
a9f040edcc | ||
|
|
b0baf3b5aa | ||
|
|
86fb1d20d3 | ||
|
|
dfb7d80849 | ||
|
|
cdcfdafbdc | ||
|
|
e29394eac0 | ||
|
|
06c583d0cd | ||
|
|
1d14e75691 | ||
|
|
9991e73a37 | ||
|
|
8f9e875865 | ||
|
|
a92fb4c7cd | ||
|
|
f974ac1bf1 | ||
|
|
11770f68f4 | ||
|
|
96473d45c8 | ||
|
|
c089c9777b | ||
|
|
68f8a4fe7b | ||
|
|
60a0ea582e | ||
|
|
8ffa3f052d | ||
|
|
6c1c1b1785 | ||
|
|
7283ac7042 | ||
|
|
7add92a05c | ||
|
|
aa13772572 | ||
|
|
d612a560aa | ||
|
|
8b3a094d22 | ||
|
|
e7ed4ff0bf |
2
.github/workflows/node.js.yml
vendored
2
.github/workflows/node.js.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x, 16.x, 14.x]
|
||||
node-version: [18.x, 16.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
18
README.md
18
README.md
@@ -54,24 +54,6 @@ npx jest
|
||||
```
|
||||
> While mocha is a bit smaller and faster, jest runs tests in parallel and isolation, which allows to run all tests.
|
||||
|
||||
|
||||
### Serve `npm`
|
||||
|
||||
We've included a simple npm registry mock, which allows you to do an `npm install @capire/<package>` locally. Use it as follows:
|
||||
|
||||
1. Start the @capire registry:
|
||||
```sh
|
||||
npm run registry
|
||||
```
|
||||
> While running this will have `@capire:registry=http://localhost:4444` set with npmrc.
|
||||
|
||||
2. Install one of the @capire packages wherever you like, for example:
|
||||
|
||||
```sh
|
||||
npm add @capire/common @capire/bookshop
|
||||
```
|
||||
|
||||
|
||||
## Code Tours
|
||||
|
||||
Take one of the [guided tours](.tours) in VS Code through our CAP samples and learn which CAP features are showcased by the different parts of the repository. Just install the [CodeTour extension](https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour) for VS Code. We'll add more code tours in the future. Stay tuned!
|
||||
|
||||
3
bookshop/cds-plugin.js
Normal file
3
bookshop/cds-plugin.js
Normal file
@@ -0,0 +1,3 @@
|
||||
cds.once('bootstrap',(app)=>{
|
||||
app.serve ('/bookshop') .from ('@capire/bookshop','app/vue')
|
||||
})
|
||||
@@ -4,15 +4,10 @@
|
||||
* currencies, if not obtained through @capire/common.
|
||||
*/
|
||||
|
||||
module.exports = async (tx)=>{
|
||||
|
||||
const has_common = tx.model.definitions['sap.common.Currencies']?.elements.numcode
|
||||
if (has_common) return
|
||||
|
||||
const already_filled = await tx.exists('sap.common.Currencies',{code:'EUR'})
|
||||
if (already_filled) return
|
||||
|
||||
await tx.run (INSERT.into ('sap.common.Currencies') .columns (
|
||||
// NOTE: We use cds.on('served') to delay the UPSERTs after the db init
|
||||
// to run after all INSERTs from .csv files happened.
|
||||
module.exports = cds.on('served', ()=> cds.run(
|
||||
UPSERT.into ('sap.common.Currencies') .columns (
|
||||
[ 'code', 'symbol', 'name' ]
|
||||
) .rows (
|
||||
[ 'EUR', '€', 'Euro' ],
|
||||
@@ -20,5 +15,5 @@ module.exports = async (tx)=>{
|
||||
[ 'GBP', '£', 'British Pound' ],
|
||||
[ 'ILS', '₪', 'Shekel' ],
|
||||
[ 'JPY', '¥', 'Yen' ],
|
||||
))
|
||||
}
|
||||
)
|
||||
))
|
||||
|
||||
@@ -3,9 +3,9 @@ namespace sap.capire.bookshop;
|
||||
|
||||
entity Books : managed {
|
||||
key ID : Integer;
|
||||
title : localized String(111);
|
||||
title : localized String(111) @mandatory ;
|
||||
descr : localized String(1111);
|
||||
author : Association to Authors;
|
||||
author : Association to Authors @mandatory;
|
||||
genre : Association to Genres;
|
||||
stock : Integer;
|
||||
price : Decimal;
|
||||
@@ -15,7 +15,7 @@ entity Books : managed {
|
||||
|
||||
entity Authors : managed {
|
||||
key ID : Integer;
|
||||
name : String(111);
|
||||
name : String(111) @mandatory;
|
||||
dateOfBirth : Date;
|
||||
dateOfDeath : Date;
|
||||
placeOfBirth : String;
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
"index.cds",
|
||||
"index.js"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@cap-js/sqlite": "*"
|
||||
},
|
||||
"dependencies": {
|
||||
"@sap/cds": ">=5.9",
|
||||
"express": "^4.17.1",
|
||||
@@ -21,7 +24,9 @@
|
||||
},
|
||||
"cds": {
|
||||
"requires": {
|
||||
"db": "sql"
|
||||
"bookshop-services": {
|
||||
"model": "@capire/bookshop"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
using { sap.capire.bookshop as my } from '../db/schema';
|
||||
service AdminService @(requires:'admin') {
|
||||
service AdminService @(requires:'admin', path:'/admin') {
|
||||
entity Books as projection on my.Books;
|
||||
entity Authors as projection on my.Authors;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Exposes user information
|
||||
*/
|
||||
service UserService {
|
||||
service UserService @(path: '/user') {
|
||||
/**
|
||||
* The current user
|
||||
*/
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
"@capire/reviews": "*",
|
||||
"@capire/orders": "*",
|
||||
"@capire/common": "*",
|
||||
"@capire/fiori": "*",
|
||||
"@capire/data-viewer": "*",
|
||||
"@sap/cds": ">=5",
|
||||
"@sap/cds-common-content": "^1.0.0",
|
||||
"express": "^4.17.1"
|
||||
},
|
||||
"cds": {
|
||||
@@ -27,8 +27,7 @@
|
||||
"[production]": { "kind": "enterprise-messaging" }
|
||||
},
|
||||
"db": {
|
||||
"kind": "sql",
|
||||
"schema_evolution": "auto"
|
||||
"kind": "sql"
|
||||
}
|
||||
},
|
||||
"log": { "service": true }
|
||||
|
||||
@@ -1,22 +1,18 @@
|
||||
const cds = require ('@sap/cds')
|
||||
|
||||
// Add routes to UIs from imported packages
|
||||
cds.once('bootstrap',(app)=>{
|
||||
app.serve ('/admin-authors') .from ('@capire/fiori','app/admin-authors')
|
||||
app.serve ('/admin-books') .from ('@capire/fiori','app/admin-books')
|
||||
app.serve ('/browse-books') .from ('@capire/fiori','app/browse')
|
||||
})
|
||||
|
||||
// Add mashup logic
|
||||
cds.once('served', require('./srv/mashup'))
|
||||
|
||||
// Add routes to UIs from imported packages
|
||||
cds.once('bootstrap',(app)=>{
|
||||
app.serve ('/bookshop') .from ('@capire/bookshop','app/vue')
|
||||
app.serve ('/reviews') .from ('@capire/reviews','app/vue')
|
||||
app.serve ('/orders') .from('@capire/orders','app/orders')
|
||||
app.serve ('/data') .from('@capire/data-viewer','app/viewer')
|
||||
})
|
||||
|
||||
// Add Swagger UI
|
||||
require('./srv/swagger-ui')
|
||||
|
||||
// Returning cds.server
|
||||
module.exports = cds.server
|
||||
|
||||
// For didactic reasons in capire
|
||||
const { ReviewsService, OrdersService } = cds.requires
|
||||
if (!ReviewsService?.credentials && !OrdersService?.credentials) cds.requires.messaging = false
|
||||
|
||||
@@ -30,13 +30,3 @@ extend Orders with {
|
||||
book : Association to Books on product.ID = book.ID
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Add orders fiori app (in case of embedded orders service)
|
||||
using from '@capire/orders/app/fiori';
|
||||
|
||||
// Add data browser
|
||||
using from '@capire/data-viewer';
|
||||
|
||||
// Incorporate pre-build extensions from...
|
||||
using from '@capire/common';
|
||||
|
||||
0
common/cds-plugin.js
Normal file
0
common/cds-plugin.js
Normal file
12
common/data/sap.common-Countries.csv
Normal file
12
common/data/sap.common-Countries.csv
Normal file
@@ -0,0 +1,12 @@
|
||||
code;name;descr
|
||||
AU;Australia;Commonwealth of Australia
|
||||
CA;Canada;Canada
|
||||
CN;China;People's Republic of China (PRC)
|
||||
FR;France;French Republic
|
||||
DE;Germany;Federal Republic of Germany
|
||||
IN;India;Republic of India
|
||||
IL;Israel;State of Israel
|
||||
MM;Myanmar;Republic of the Union of Myanmar
|
||||
GB;United Kingdom;United Kingdom of Great Britain and Northern Ireland
|
||||
US;United States;United States of America (USA)
|
||||
EU;European Union;European Union
|
||||
|
12
common/data/sap.common-Countries_texts.csv
Normal file
12
common/data/sap.common-Countries_texts.csv
Normal file
@@ -0,0 +1,12 @@
|
||||
code;locale;name;descr
|
||||
AU;de;Australien;Commonwealth Australien
|
||||
CA;de;Kanada;Canada
|
||||
CN;de;China;Volksrepublik China
|
||||
FR;de;Frankreich;Republik Frankreich
|
||||
DE;de;Deutschland;Bundesrepublik Deutschland
|
||||
IN;de;Indien;Republik Indien
|
||||
IL;de;Israel;Staat Israel
|
||||
MM;de;Myanmar;Republik der Union Myanmar
|
||||
GB;de;Vereinigtes Königreich;Vereinigtes Königreich Großbritannien und Nordirland
|
||||
US;de;Vereinigte Staaten;Vereinigte Staaten von Amerika
|
||||
EU;de;Europäische Union;Europäische Union
|
||||
|
@@ -1,12 +1,12 @@
|
||||
code;symbol;numcode;minor;exponent
|
||||
EUR;€;978;Cent;2
|
||||
USD;$;840;Cent;2
|
||||
CAD;$;124;Cent;2
|
||||
AUD;$;036;Cent;2
|
||||
GBP;£;826;Penny;2
|
||||
ILS;₪;376;Agorat;2
|
||||
INR;₹;356;Paise;2
|
||||
QAR;﷼;634;Dirham;2
|
||||
SAR;﷼;682;Halala;2
|
||||
JPY;¥;392;Sen;2
|
||||
CNY;¥;156;Jiao;1
|
||||
code;symbol;name;descr;numcode;minor;exponent
|
||||
EUR;€;Euro;European Euro;978;Cent;2
|
||||
USD;$;US Dollar;United States Dollar;840;Cent;2
|
||||
CAD;$;Canadian Dollar;Canadian Dollar;124;Cent;2
|
||||
AUD;$;Australian Dollar;Australian Dollar;036;Cent;2
|
||||
GBP;£;British Pound;Great Britain Pound;826;Penny;2
|
||||
ILS;₪;Shekel;Israeli New Shekel;376;Agorat;2
|
||||
INR;₹;Rupee;Indian Rupee;356;Paise;2
|
||||
QAR;﷼;Riyal;Katar Riyal;356;Dirham;2
|
||||
SAR;﷼;Riyal;Saudi Riyal;682;Halala;2
|
||||
JPY;¥;Yen;Japanese Yen;392;Sen;2
|
||||
CNY;¥;Yuan;Chinese Yuan Renminbi;156;Jiao;1
|
||||
|
15
common/data/sap.common-Currencies_texts.csv
Normal file
15
common/data/sap.common-Currencies_texts.csv
Normal file
@@ -0,0 +1,15 @@
|
||||
code;locale;name;descr
|
||||
EUR;de;Euro;European Euro
|
||||
USD;de;US-Dollar;United States Dollar
|
||||
CAD;de;Kanadischer Dollar;Kanadischer Dollar
|
||||
AUD;de;Australischer Dollar;Australischer Dollar
|
||||
GBP;de;Pfund;Britische Pfund
|
||||
ILS;de;Schekel;Israelische Schekel
|
||||
JPY;de;Yen;Japanische Yen
|
||||
EUR;fr;euro;de la Zone euro
|
||||
USD;fr;dollar;dollar des États-Unis
|
||||
CAD;fr;dollar canadien;dollar canadien
|
||||
AUD;fr;dollar australien;dollar australien
|
||||
GBP;fr;livre sterling;pound sterling
|
||||
ILS;fr;Shekel;shekel israelien
|
||||
JPY;fr;Yen;Yen japonais
|
||||
|
5
common/data/sap.common-Languages.csv
Normal file
5
common/data/sap.common-Languages.csv
Normal file
@@ -0,0 +1,5 @@
|
||||
code;name
|
||||
de;German
|
||||
fr;French
|
||||
en;English
|
||||
en_GB;British English
|
||||
|
10
common/data/sap.common-Languages_texts.csv
Normal file
10
common/data/sap.common-Languages_texts.csv
Normal file
@@ -0,0 +1,10 @@
|
||||
code;locale;name
|
||||
de;en;German
|
||||
de;de;Deutsch
|
||||
de;fr;Allemande
|
||||
fr;en;French
|
||||
fr;de;Französisch
|
||||
fr;fr;Francais
|
||||
en;en;English
|
||||
en;de;Englisch
|
||||
en;fr;Anglais
|
||||
|
@@ -1,7 +1,5 @@
|
||||
using { sap } from '@sap/cds/common';
|
||||
|
||||
using from '@sap/cds-common-content';
|
||||
|
||||
extend sap.common.Currencies with {
|
||||
// Currencies.code = ISO 4217 alphabetic three-letter code
|
||||
// with the first two letters being equal to ISO 3166 alphabetic country codes
|
||||
|
||||
@@ -4,5 +4,12 @@
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"@sap/cds": "*"
|
||||
},
|
||||
"cds": {
|
||||
"requires": {
|
||||
"common-data": {
|
||||
"model": "@capire/common"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
168
compose/app/appconfig/fioriSandboxConfig.json
Normal file
168
compose/app/appconfig/fioriSandboxConfig.json
Normal file
@@ -0,0 +1,168 @@
|
||||
{
|
||||
"services": {
|
||||
"LaunchPage": {
|
||||
"adapter": {
|
||||
"config": {
|
||||
"catalogs": [],
|
||||
"groups": [
|
||||
{
|
||||
"id": "Bookshop",
|
||||
"title": "Bookshop",
|
||||
"isPreset": true,
|
||||
"isVisible": true,
|
||||
"isGroupLocked": false,
|
||||
"tiles": [
|
||||
{
|
||||
"id": "BrowseBooks",
|
||||
"tileType": "sap.ushell.ui.tile.StaticTile",
|
||||
"properties": {
|
||||
"title": "Browse Books",
|
||||
"targetURL": "#Books-display"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "BrowseGenres",
|
||||
"tileType": "sap.ushell.ui.tile.StaticTile",
|
||||
"properties": {
|
||||
"title": "Browse Genres (OData v2)",
|
||||
"targetURL": "#Genres-display"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "Administration",
|
||||
"title": "Administration",
|
||||
"isPreset": true,
|
||||
"isVisible": true,
|
||||
"isGroupLocked": false,
|
||||
"tiles": [
|
||||
{
|
||||
"id": "ManageBooks",
|
||||
"tileType": "sap.ushell.ui.tile.StaticTile",
|
||||
"properties": {
|
||||
"title": "Manage Books",
|
||||
"targetURL": "#Books-manage"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ManageAuthors",
|
||||
"tileType": "sap.ushell.ui.tile.StaticTile",
|
||||
"properties": {
|
||||
"title": "Manage Authors",
|
||||
"targetURL": "#Authors-display"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ManageOrders",
|
||||
"tileType": "sap.ushell.ui.tile.StaticTile",
|
||||
"properties": {
|
||||
"title": "Manage Orders",
|
||||
"targetURL": "#Orders-manage"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"NavTargetResolution": {
|
||||
"config": {
|
||||
"enableClientSideTargetResolution": true
|
||||
}
|
||||
},
|
||||
"ClientSideTargetResolution": {
|
||||
"adapter": {
|
||||
"config": {
|
||||
"inbounds": {
|
||||
"BrowseBooks": {
|
||||
"semanticObject": "Books",
|
||||
"action": "display",
|
||||
"title": "Browse Books",
|
||||
"signature": {
|
||||
"parameters": {
|
||||
"Books.ID": {
|
||||
"renameTo": "ID"
|
||||
},
|
||||
"Authors.books.ID": {
|
||||
"renameTo": "ID"
|
||||
}
|
||||
},
|
||||
"additionalParameters": "ignored"
|
||||
},
|
||||
"resolutionResult": {
|
||||
"applicationType": "SAPUI5",
|
||||
"additionalInformation": "SAPUI5.Component=bookshop",
|
||||
"url": "/browse/webapp"
|
||||
}
|
||||
},
|
||||
"BrowseAuthors": {
|
||||
"semanticObject": "Authors",
|
||||
"action": "display",
|
||||
"title": "Browse Authors",
|
||||
"signature": {
|
||||
"parameters": {
|
||||
"Books.author.ID":{
|
||||
"renameTo": "ID"
|
||||
}
|
||||
},
|
||||
"additionalParameters": "ignored"
|
||||
},
|
||||
"resolutionResult": {
|
||||
"applicationType": "SAPUI5",
|
||||
"additionalInformation": "SAPUI5.Component=authors",
|
||||
"url": "/admin-authors/webapp"
|
||||
}
|
||||
},
|
||||
"BrowseGenres": {
|
||||
"semanticObject": "Genres",
|
||||
"action": "display",
|
||||
"title": "Browse Genres",
|
||||
"signature": {
|
||||
"parameters": {
|
||||
"Genre.ID": {
|
||||
"renameTo": "ID"
|
||||
}
|
||||
},
|
||||
"additionalParameters": "ignored"
|
||||
},
|
||||
"resolutionResult": {
|
||||
"applicationType": "SAPUI5",
|
||||
"additionalInformation": "SAPUI5.Component=genres",
|
||||
"url": "/genres/webapp"
|
||||
}
|
||||
},
|
||||
"ManageBooks": {
|
||||
"semanticObject": "Books",
|
||||
"action": "manage",
|
||||
"title": "Manage Books",
|
||||
"signature": {
|
||||
"parameters": {},
|
||||
"additionalParameters": "allowed"
|
||||
},
|
||||
"resolutionResult": {
|
||||
"applicationType": "SAPUI5",
|
||||
"additionalInformation": "SAPUI5.Component=books",
|
||||
"url": "/admin-books/webapp"
|
||||
}
|
||||
},
|
||||
"ManageOrders": {
|
||||
"semanticObject": "Orders",
|
||||
"action": "manage",
|
||||
"signature": {
|
||||
"parameters": {},
|
||||
"additionalParameters": "allowed"
|
||||
},
|
||||
"resolutionResult": {
|
||||
"applicationType": "SAPUI5",
|
||||
"additionalInformation": "SAPUI5.Component=orders",
|
||||
"url": "/orders/webapp"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
12
compose/package.json
Normal file
12
compose/package.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "@capire/bookstore",
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"@capire/bookshop": "*",
|
||||
"@capire/reviews": "*",
|
||||
"@capire/fiori": "*",
|
||||
"@capire/orders": "*",
|
||||
"@sap/cds": ">=5",
|
||||
"express": "^4.17.1"
|
||||
}
|
||||
}
|
||||
8
compose/server.js
Normal file
8
compose/server.js
Normal file
@@ -0,0 +1,8 @@
|
||||
const cds = require ('@sap/cds')
|
||||
|
||||
// Add Swagger UI
|
||||
require('./srv/swagger-ui')
|
||||
|
||||
// For didactic reasons in capire
|
||||
const { ReviewsService, OrdersService } = cds.requires
|
||||
if (!ReviewsService?.credentials && !OrdersService?.credentials) cds.requires.messaging = false
|
||||
10
compose/srv/swagger-ui.js
Normal file
10
compose/srv/swagger-ui.js
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Adding Swagger UI - see https://cap.cloud.sap/docs/advanced/openapi
|
||||
const cds = require ('@sap/cds')
|
||||
try {
|
||||
const cds_swagger = require ('cds-swagger-ui-express')
|
||||
cds.once ('bootstrap', app => app.use (cds_swagger()) )
|
||||
} catch (err) {
|
||||
if (err.code !== 'MODULE_NOT_FOUND') throw err
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/* global Vue axios */ //> from vue.html
|
||||
const GET = (url) => axios.get('/-data'+url)
|
||||
const GET = (url) => axios.get('/odata/v4/-data'+url)
|
||||
const storageGet = (key, def) => localStorage.getItem('data-viewer:'+key) || def
|
||||
const storageSet = (key, val) => localStorage.setItem('data-viewer:'+key, val)
|
||||
const columnKeysFirst = (c1, c2) => {
|
||||
|
||||
3
data-viewer/cds-plugin.js
Normal file
3
data-viewer/cds-plugin.js
Normal file
@@ -0,0 +1,3 @@
|
||||
cds.once('bootstrap',(app)=>{
|
||||
app.serve ('/data') .from('@capire/data-viewer','app/viewer')
|
||||
})
|
||||
@@ -9,5 +9,12 @@
|
||||
"app",
|
||||
"srv",
|
||||
"index.cds"
|
||||
]
|
||||
],
|
||||
"cds": {
|
||||
"requires": {
|
||||
"orders-service": {
|
||||
"model": "@capire/data-viewer"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -33,7 +33,7 @@
|
||||
"resources": "resources.json",
|
||||
"dataSources": {
|
||||
"main": {
|
||||
"uri": "/v2/browse",
|
||||
"uri": "/odata/v2/browse",
|
||||
"type": "OData",
|
||||
"settings": {
|
||||
"annotations": ["localAnnotations"],
|
||||
|
||||
9
fiori/cds-plugin.js
Normal file
9
fiori/cds-plugin.js
Normal file
@@ -0,0 +1,9 @@
|
||||
// install OData v2 adapter
|
||||
const cds = require("@sap/cds")
|
||||
const proxy = require('@cap-js-community/odata-v2-adapter')
|
||||
const opts = global.it ? { target:'auto' } : {} // for tests, set 'auto' to detect port dynamically
|
||||
cds.once('bootstrap', app => {
|
||||
app.use(proxy(opts)) // install proxy
|
||||
// cds.log('cov2ap','silent') // suppress anoying log outpout, e.g. for `npm run mocha -- --reporter nyan`
|
||||
app.serve ('/fiori-apps') .from ('@capire/fiori','app/fiori-apps.html')
|
||||
})
|
||||
@@ -1,5 +0,0 @@
|
||||
ID_TEXTS;ID;locale;title;descr
|
||||
a5fe2682-fe60-4dc0-9218-695e501e42e6;201;de;Sturmhöhe;Sturmhöhe (Originaltitel: Wuthering Heights) ist der einzige Roman der englischen Schriftstellerin Emily Brontë (1818–1848). Der 1847 unter dem Pseudonym Ellis Bell veröffentlichte Roman wurde vom viktorianischen Publikum weitgehend abgelehnt, heute gilt er als ein Klassiker der britischen Romanliteratur des 19. Jahrhunderts.
|
||||
4edebff3-8cde-4761-8cd3-bae7834fc5f5;201;fr;Les Hauts de Hurlevent;Les Hauts de Hurlevent (titre original : Wuthering Heights), parfois orthographié Les Hauts de Hurle-Vent, est l'unique roman d'Emily Brontë, publié pour la première fois en 1847 sous le pseudonyme d’Ellis Bell. Loin d'être un récit moralisateur, Emily Brontë achève néanmoins le roman dans une atmosphère sereine, suggérant le triomphe de la paix et du Bien sur la vengeance et le Mal.
|
||||
b649031b-aacc-4dc3-838f-c36bae5d266e;207;de;Jane Eyre;Jane Eyre. Eine Autobiographie (Originaltitel: Jane Eyre. An Autobiography), erstmals erschienen im Jahr 1847 unter dem Pseudonym Currer Bell, ist der erste veröffentlichte Roman der britischen Autorin Charlotte Brontë und ein Klassiker der viktorianischen Romanliteratur des 19. Jahrhunderts. Der Roman erzählt in Form einer Ich-Erzählung die Lebensgeschichte von Jane Eyre (ausgesprochen /ˌdʒeɪn ˈɛə/), die nach einer schweren Kindheit eine Stelle als Gouvernante annimmt und sich in ihren Arbeitgeber verliebt, jedoch immer wieder um ihre Freiheit und Selbstbestimmung kämpfen muss. Als klein, dünn, blass, stets schlicht dunkel gekleidet und mit strengem Mittelscheitel beschrieben, gilt die Heldin des Romans Jane Eyre nicht zuletzt aufgrund der Kino- und Fernsehversionen der melodramatischen Romanvorlage als die bekannteste englische Gouvernante der Literaturgeschichte
|
||||
aa62f0e1-763c-4c92-a304-50c2b86e21f4;252;de;Eleonora;“Eleonora” ist eine Erzählung von Edgar Allan Poe. Sie wurde 1841 erstveröffentlicht. In ihr geht es um das Paradox der Treue in der Treulosigkeit.
|
||||
|
@@ -1 +1,8 @@
|
||||
using from './db/sqlite/index';
|
||||
using from './app/services';
|
||||
using from './app/genres/fiori-service';
|
||||
using from './app/browse/fiori-service';
|
||||
using from './app/admin-books/fiori-service';
|
||||
using from './app/admin-authors/fiori-service';
|
||||
using from './db/common';
|
||||
using from './app/common';
|
||||
@@ -22,6 +22,9 @@
|
||||
"kind": "odata",
|
||||
"model": "@capire/orders"
|
||||
},
|
||||
"self": {
|
||||
"model": "@capire/fiori"
|
||||
},
|
||||
"messaging": {
|
||||
"[production]": {
|
||||
"kind": "enterprise-messaging"
|
||||
@@ -34,8 +37,7 @@
|
||||
}
|
||||
},
|
||||
"db": {
|
||||
"kind": "sql",
|
||||
"schema_evolution": "auto"
|
||||
"kind": "sql"
|
||||
},
|
||||
"db-ext": {
|
||||
"[development]": {
|
||||
|
||||
@@ -3,6 +3,6 @@ const cds = require("@sap/cds")
|
||||
const proxy = require('@cap-js-community/odata-v2-adapter')
|
||||
const opts = global.it ? { target:'auto' } : {} // for tests, set 'auto' to detect port dynamically
|
||||
cds.on('bootstrap', app => app.use(proxy(opts))) // install proxy
|
||||
cds.log('cov2ap','silent') // suppress anoying log outpout, e.g. for `npm run mocha -- --reporter nyan`
|
||||
// cds.log('cov2ap','silent') // suppress anoying log outpout, e.g. for `npm run mocha -- --reporter nyan`
|
||||
|
||||
module.exports = require('@capire/bookstore/server.js')
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
service say {
|
||||
service say @(path: '/say') {
|
||||
function hello (to:String) returns String;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"i18n": "i18n/i18n.properties",
|
||||
"dataSources": {
|
||||
"OrdersService": {
|
||||
"uri": "/orders/",
|
||||
"uri": "/odata/v4/orders/",
|
||||
"type": "OData",
|
||||
"settings": {
|
||||
"odataVersion": "4.0"
|
||||
|
||||
3
orders/cds-plugin.js
Normal file
3
orders/cds-plugin.js
Normal file
@@ -0,0 +1,3 @@
|
||||
cds.once('bootstrap',(app)=>{
|
||||
app.serve ('/orders') .from('@capire/orders','app/orders')
|
||||
})
|
||||
@@ -4,5 +4,12 @@
|
||||
"dependencies": {
|
||||
"@capire/common": "*",
|
||||
"@sap/cds": ">=5"
|
||||
},
|
||||
"cds": {
|
||||
"requires": {
|
||||
"orders-service": {
|
||||
"model": "@capire/orders"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
944
package-lock.json
generated
944
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,7 @@
|
||||
"repository": "https://github.com/sap-samples/cloud-cap-samples.git",
|
||||
"author": "daniel.hutzel@sap.com",
|
||||
"dependencies": {
|
||||
"@sap/cds": ">=5.5.3"
|
||||
"@sap/cds": ">=7"
|
||||
},
|
||||
"workspaces": [
|
||||
"./bookshop",
|
||||
|
||||
3
reviews/cds-plugin.js
Normal file
3
reviews/cds-plugin.js
Normal file
@@ -0,0 +1,3 @@
|
||||
cds.once('bootstrap',(app)=>{
|
||||
app.serve ('/reviews') .from ('@capire/reviews','app/vue')
|
||||
})
|
||||
@@ -1,5 +1,5 @@
|
||||
ID;subject;rating;reviewer;title;text
|
||||
45167af7-8aba-4164-b296-a89461a5fb71;201;5;bob;Intriguing;Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
|
||||
2a4b02ad-5ccc-4354-9388-f8aaebef2636;201;4;bob;Fascinating;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Id diam maecenas ultricies mi eget mauris pharetra et. Risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Pulvinar mattis nunc sed blandit libero. Facilisis magna etiam tempor orci eu. Nec sagittis aliquam malesuada bibendum arcu. Eu consequat ac felis donec. Ultricies tristique nulla aliquet enim tortor at auctor urna nunc. Tortor posuere ac ut consequat semper viverra nam libero. Amet nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Scelerisque purus semper eget duis at tellus. Elementum tempus egestas sed sed risus pretium. Arcu dictum varius duis at. Amet luctus venenatis lectus magna fringilla urna. Eget velit aliquet sagittis id consectetur purus ut faucibus. Vitae auctor eu augue ut lectus. Fermentum iaculis eu non diam phasellus vestibulum.
|
||||
3882af87-b2e9-48c7-945b-140f15b5e2fa;207;2;bob;What is this?;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Libero justo laoreet sit amet cursus sit amet dictum. Nunc faucibus a pellentesque sit. Dis parturient montes nascetur ridiculus mus mauris vitae ultricies. Enim nunc faucibus a pellentesque. Commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Cras ornare arcu dui vivamus. Facilisi etiam dignissim diam quis enim lobortis. Et molestie ac feugiat sed. Urna neque viverra justo nec ultrices dui. Ullamcorper a lacus vestibulum sed arcu non. Volutpat ac tincidunt vitae semper quis. Dignissim sodales ut eu sem. Feugiat in fermentum posuere urna nec. At augue eget arcu dictum varius.
|
||||
eb4e934f-af77-4f72-9717-17abd3fefad8;251;3;bob;It's dark...;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Suscipit tellus mauris a diam. Velit aliquet sagittis id consectetur purus ut. Viverra adipiscing at in tellus integer. Vitae elementum curabitur vitae nunc. Mattis ullamcorper velit sed ullamcorper morbi. Diam quis enim lobortis scelerisque. Auctor neque vitae tempus quam pellentesque nec nam aliquam. Semper auctor neque vitae tempus. Quis eleifend quam adipiscing vitae proin. Neque convallis a cras semper auctor neque vitae. Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Sit amet consectetur adipiscing elit ut aliquam purus. Pretium quam vulputate dignissim suspendisse.
|
||||
subject;rating;reviewer;title;text
|
||||
201;5;bob;Intriguing;Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
|
||||
201;4;bob;Fascinating;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Id diam maecenas ultricies mi eget mauris pharetra et. Risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Pulvinar mattis nunc sed blandit libero. Facilisis magna etiam tempor orci eu. Nec sagittis aliquam malesuada bibendum arcu. Eu consequat ac felis donec. Ultricies tristique nulla aliquet enim tortor at auctor urna nunc. Tortor posuere ac ut consequat semper viverra nam libero. Amet nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Scelerisque purus semper eget duis at tellus. Elementum tempus egestas sed sed risus pretium. Arcu dictum varius duis at. Amet luctus venenatis lectus magna fringilla urna. Eget velit aliquet sagittis id consectetur purus ut faucibus. Vitae auctor eu augue ut lectus. Fermentum iaculis eu non diam phasellus vestibulum.
|
||||
207;2;bob;What is this?;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Libero justo laoreet sit amet cursus sit amet dictum. Nunc faucibus a pellentesque sit. Dis parturient montes nascetur ridiculus mus mauris vitae ultricies. Enim nunc faucibus a pellentesque. Commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Cras ornare arcu dui vivamus. Facilisi etiam dignissim diam quis enim lobortis. Et molestie ac feugiat sed. Urna neque viverra justo nec ultrices dui. Ullamcorper a lacus vestibulum sed arcu non. Volutpat ac tincidunt vitae semper quis. Dignissim sodales ut eu sem. Feugiat in fermentum posuere urna nec. At augue eget arcu dictum varius.
|
||||
251;3;bob;It's dark...;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Suscipit tellus mauris a diam. Velit aliquet sagittis id consectetur purus ut. Viverra adipiscing at in tellus integer. Vitae elementum curabitur vitae nunc. Mattis ullamcorper velit sed ullamcorper morbi. Diam quis enim lobortis scelerisque. Auctor neque vitae tempus quam pellentesque nec nam aliquam. Semper auctor neque vitae tempus. Quis eleifend quam adipiscing vitae proin. Neque convallis a cras semper auctor neque vitae. Imperdiet massa tincidunt nunc pulvinar sapien et ligula. Sit amet consectetur adipiscing elit ut aliquam purus. Pretium quam vulputate dignissim suspendisse.
|
||||
|
@@ -12,6 +12,10 @@
|
||||
},
|
||||
"cds": {
|
||||
"requires": {
|
||||
"ReviewsService": {
|
||||
"kind": "odata",
|
||||
"model": "@capire/reviews"
|
||||
},
|
||||
"messaging": {
|
||||
"[development]": { "kind": "file-based-messaging" },
|
||||
"[hybrid]": { "kind": "enterprise-messaging-shared" },
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using { sap.capire.reviews as my } from '../db/schema';
|
||||
|
||||
service ReviewsService {
|
||||
service ReviewsService @(path:'/reviews') {
|
||||
|
||||
// Sync API
|
||||
entity Reviews as projection on my.Reviews excluding { likes }
|
||||
|
||||
@@ -8,7 +8,7 @@ describe('cap/samples - Fiori APIs - v2', function() {
|
||||
// if (this.timeout) this.timeout(1e6)
|
||||
|
||||
it('serves $metadata documents in v2', async () => {
|
||||
const { headers, data } = await GET `/v2/browse/$metadata`
|
||||
const { headers, data } = await GET `/odata/v2/browse/$metadata`
|
||||
expect(headers).to.contain({
|
||||
'content-type': 'application/xml',
|
||||
'dataserviceversion': '2.0',
|
||||
@@ -17,7 +17,7 @@ describe('cap/samples - Fiori APIs - v2', function() {
|
||||
})
|
||||
|
||||
it('serves Books in v2', async () => {
|
||||
const { data } = await GET `/v2/browse/Books`
|
||||
const { data } = await GET `/odata/v2/browse/Books`
|
||||
expect(data).to.containSubset({d:{results:[]}})
|
||||
expect(data.d.results.length).to.be.greaterThanOrEqual(5)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user