Compare commits
171 Commits
multitenan
...
experiment
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fc69311ebe | ||
|
|
67643b8d95 | ||
|
|
cd3aad59e1 | ||
|
|
bcbf65f95e | ||
|
|
1189374860 | ||
|
|
9f2eb8fa83 | ||
|
|
7b18e15e5b | ||
|
|
00bfc1507e | ||
|
|
47a58e7393 | ||
|
|
c04b972d27 | ||
|
|
85b9b9d3a3 | ||
|
|
3655eef971 | ||
|
|
87dd356204 | ||
|
|
a89ec34f7c | ||
|
|
444dcacb14 | ||
|
|
2011a1ca7a | ||
|
|
7e0c36ede5 | ||
|
|
e8d08d039e | ||
|
|
5e3258913e | ||
|
|
44e14926e4 | ||
|
|
592e945c28 | ||
|
|
5d5c787365 | ||
|
|
bb79def1d9 | ||
|
|
bd4a38bf54 | ||
|
|
abf18d74db | ||
|
|
f144354229 | ||
|
|
97670bbc84 | ||
|
|
82d6f54337 | ||
|
|
8ba8381ca7 | ||
|
|
e7fbcc1ac1 | ||
|
|
d977c21483 | ||
|
|
2e10b1ac4d | ||
|
|
cabcd404cf | ||
|
|
5141df8e0f | ||
|
|
785ecbda8f | ||
|
|
2b9ceba62f | ||
|
|
c6e2fac860 | ||
|
|
f2877db34f | ||
|
|
d2bd4c5bb1 | ||
|
|
732b6b081c | ||
|
|
db595a9635 | ||
|
|
4a8b85f227 | ||
|
|
0cb7349e62 | ||
|
|
ba3eeff58b | ||
|
|
86e6983bed | ||
|
|
9bbc431448 | ||
|
|
097b74db03 | ||
|
|
870f8d063d | ||
|
|
4a0db3e259 | ||
|
|
5e76c7f52e | ||
|
|
31c110e9e2 | ||
|
|
a4baee6e3b | ||
|
|
95b01e7d7a | ||
|
|
c2437fc419 | ||
|
|
9381459458 | ||
|
|
8d67c0bf62 | ||
|
|
21359a7ad3 | ||
|
|
649b9c8ca8 | ||
|
|
11c54b29d0 | ||
|
|
80302a0a3d | ||
|
|
c8c10b7c8a | ||
|
|
d9d7203e49 | ||
|
|
4a8379e953 | ||
|
|
dd28bd04f6 | ||
|
|
28a7c16895 | ||
|
|
5397df5e81 | ||
|
|
f57ae79e37 | ||
|
|
6412df75dd | ||
|
|
9277aa12da | ||
|
|
d41a9e10ab | ||
|
|
0b2182afcb | ||
|
|
6b74c23aa0 | ||
|
|
c854717359 | ||
|
|
9dfe62c5c7 | ||
|
|
5b4210bb38 | ||
|
|
48ee934b00 | ||
|
|
254bb40e38 | ||
|
|
fb5d00bbe0 | ||
|
|
7ae992c5bb | ||
|
|
016587094f | ||
|
|
d04cb801c4 | ||
|
|
902afd8a76 | ||
|
|
c4bee1f09a | ||
|
|
278258c436 | ||
|
|
8601bd8a46 | ||
|
|
98113c46fd | ||
|
|
eb4bc703dd | ||
|
|
de806a1e38 | ||
|
|
2999c8df83 | ||
|
|
87dbb4552a | ||
|
|
0bdf4bb93e | ||
|
|
a4810c3a7b | ||
|
|
c899843319 | ||
|
|
43e5f6faef | ||
|
|
1b5cc62d1c | ||
|
|
4b48d68ba6 | ||
|
|
d21a0e08ca | ||
|
|
50fd83fd19 | ||
|
|
3f20f4b9a2 | ||
|
|
5031779be8 | ||
|
|
ad385cbc6c | ||
|
|
2650db4ee9 | ||
|
|
e04e9d231d | ||
|
|
476724792e | ||
|
|
5ae31f7c67 | ||
|
|
edbca44a43 | ||
|
|
02f19e295d | ||
|
|
c1141e6c87 | ||
|
|
05cdb67329 | ||
|
|
4877386e86 | ||
|
|
4bd4446975 | ||
|
|
a54b0124ea | ||
|
|
944afe3bc8 | ||
|
|
92a83f71a1 | ||
|
|
5e5ace0dd4 | ||
|
|
6e686c6c8b | ||
|
|
1ccddb2155 | ||
|
|
7c8e52d5e9 | ||
|
|
593228a51e | ||
|
|
624cea6343 | ||
|
|
0dc1dc198d | ||
|
|
20bfb5c5f7 | ||
|
|
be87f5617a | ||
|
|
3117df1282 | ||
|
|
adfe170e8d | ||
|
|
6b08826af5 | ||
|
|
c6239f0375 | ||
|
|
be685437aa | ||
|
|
0d19e56509 | ||
|
|
ff3801be71 | ||
|
|
702c3245bd | ||
|
|
14002300c5 | ||
|
|
ad417ec061 | ||
|
|
a6ec296129 | ||
|
|
1b10bbbfe4 | ||
|
|
aaa1b2d6c7 | ||
|
|
fc088015d3 | ||
|
|
1cb169e886 | ||
|
|
9b9bb4c114 | ||
|
|
c9f7dc68b8 | ||
|
|
7d9303635e | ||
|
|
b724ae900c | ||
|
|
2f96b92854 | ||
|
|
99dc8d31d7 | ||
|
|
c672e0f1fa | ||
|
|
0ddd70acbc | ||
|
|
3e52a9a102 | ||
|
|
b44701ef62 | ||
|
|
c23ddc7e54 | ||
|
|
66bd2f707c | ||
|
|
3320c7e5a2 | ||
|
|
a35782e775 | ||
|
|
e5bd8ec5a5 | ||
|
|
0aa95a0a67 | ||
|
|
5015eb8c52 | ||
|
|
6d3f4c689f | ||
|
|
f0fead2bc2 | ||
|
|
f1d780d6d9 | ||
|
|
796bf62bde | ||
|
|
5f176a0b88 | ||
|
|
a5c8b5101e | ||
|
|
d72ff809b0 | ||
|
|
5e829ae7bb | ||
|
|
d265a385f8 | ||
|
|
80f469b5b6 | ||
|
|
8e8ae949df | ||
|
|
3d24dc491d | ||
|
|
f593265687 | ||
|
|
6d488b042c | ||
|
|
d5ef630743 | ||
|
|
b47c9d75df |
2
.github/workflows/node.js.yml
vendored
2
.github/workflows/node.js.yml
vendored
@@ -24,5 +24,5 @@ jobs:
|
|||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
- run: npm install
|
- run: npm ci
|
||||||
- run: npm test
|
- run: npm test
|
||||||
|
|||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -10,12 +10,10 @@ target/
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
*.log
|
*.log
|
||||||
*.mtar
|
*.mtar
|
||||||
*mta-op*/
|
|
||||||
connection.properties
|
connection.properties
|
||||||
default-env.json
|
default-env.json
|
||||||
packages/messageBox
|
packages/messageBox
|
||||||
reviews/msg-box
|
reviews/msg-box
|
||||||
reviews/db/test.db
|
reviews/db/test.db
|
||||||
|
|
||||||
package-lock.json
|
*.openapi3.json
|
||||||
*log*.txt
|
|
||||||
|
|||||||
3
.npmrc
Normal file
3
.npmrc
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Ensure we always use public packages, i.e. avoid using local registries from ~/.npmrc
|
||||||
|
@sap:registry=https://registry.npmjs.org/
|
||||||
|
registry=https://registry.npmjs.org/
|
||||||
@@ -5,7 +5,7 @@ const app = express()
|
|||||||
|
|
||||||
const { PORT=4444 } = process.env
|
const { PORT=4444 } = process.env
|
||||||
const [,,port=PORT] = process.argv
|
const [,,port=PORT] = process.argv
|
||||||
process.chdir(__dirname)
|
const cwd = __dirname
|
||||||
|
|
||||||
app.use('/-/:tarball', (req,res,next) => {
|
app.use('/-/:tarball', (req,res,next) => {
|
||||||
console.debug ('GET', req.params)
|
console.debug ('GET', req.params)
|
||||||
@@ -13,7 +13,7 @@ app.use('/-/:tarball', (req,res,next) => {
|
|||||||
const { tarball } = req.params
|
const { tarball } = req.params
|
||||||
const [, pkg ] = /^capire-(\w+)/.exec(tarball)
|
const [, pkg ] = /^capire-(\w+)/.exec(tarball)
|
||||||
fs.lstat(tarball,(err => {
|
fs.lstat(tarball,(err => {
|
||||||
if (err) exec(`npm pack ../${pkg}`,next)
|
if (err) exec(`npm pack ../${pkg}`,{cwd},next)
|
||||||
else next()
|
else next()
|
||||||
}))
|
}))
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@@ -13,5 +13,5 @@
|
|||||||
"**/cds/lib/req/cls.js",
|
"**/cds/lib/req/cls.js",
|
||||||
"**/odata-v4/okra/**"
|
"**/odata-v4/okra/**"
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
32
README.md
32
README.md
@@ -84,3 +84,35 @@ In case you've a question, find a bug, or otherwise need support, use our [commu
|
|||||||
## License
|
## License
|
||||||
|
|
||||||
Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, version 2.0 except as noted otherwise in the [LICENSE](LICENSE.txt) file.
|
Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, version 2.0 except as noted otherwise in the [LICENSE](LICENSE.txt) file.
|
||||||
|
|
||||||
|
# Suppliers - in progress for Messaging & Service Consumption -
|
||||||
|
|
||||||
|
## TODOs
|
||||||
|
|
||||||
|
1. Fix issues when running in same process
|
||||||
|
2. Automated tests
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
1. Run:
|
||||||
|
|
||||||
|
```
|
||||||
|
CDS_ENV=local-hybrid cds mock API_BUSINESS_PARTNER -p 5001
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Wait until startup is completed
|
||||||
|
3. Run in a 2nd terminal:
|
||||||
|
|
||||||
|
```
|
||||||
|
CDS_ENV=local-hybrid cds serve all --with-mocks --in-memory
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Now, you can issues the requests listed in `suppliers/requests.http`
|
||||||
|
|
||||||
|
## Request Sequence
|
||||||
|
|
||||||
|
* TODO
|
||||||
|
## URLs
|
||||||
|
|
||||||
|
* Get books with their replicated supplier: http://localhost:4004/browse/Books?$expand=supplier
|
||||||
|
* Get remote suppliers: http://localhost:4004/admin/Suppliers?$top=11
|
||||||
@@ -35,7 +35,7 @@ const books = new Vue ({
|
|||||||
try {
|
try {
|
||||||
const res = await POST(`/submitOrder`, { amount, book: book.ID })
|
const res = await POST(`/submitOrder`, { amount, book: book.ID })
|
||||||
book.stock = res.data.stock
|
book.stock = res.data.stock
|
||||||
books.order = { amount, succeeded: `Successfully orderd ${amount} item(s).` }
|
books.order = { amount, succeeded: `Successfully ordered ${amount} item(s).` }
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
books.order = { amount, failed: e.response.data.error.message }
|
books.order = { amount, failed: e.response.data.error.message }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,4 +3,4 @@ ID;title;descr;author_ID;stock;price;currency_code;genre_ID
|
|||||||
207;Jane Eyre;"Jane Eyre /ɛər/ (originally published as Jane Eyre: An Autobiography) is a novel by English writer Charlotte Brontë, published under the pen name ""Currer Bell"", on 16 October 1847, by Smith, Elder & Co. of London. The first American edition was published the following year by Harper & Brothers of New York. Primarily a bildungsroman, Jane Eyre follows the experiences of its eponymous heroine, including her growth to adulthood and her love for Mr. Rochester, the brooding master of Thornfield Hall. The novel revolutionised prose fiction in that the focus on Jane's moral and spiritual development is told through an intimate, first-person narrative, where actions and events are coloured by a psychological intensity. The book contains elements of social criticism, with a strong sense of Christian morality at its core and is considered by many to be ahead of its time because of Jane's individualistic character and how the novel approaches the topics of class, sexuality, religion and feminism.";107;11;12.34;GBP;11
|
207;Jane Eyre;"Jane Eyre /ɛər/ (originally published as Jane Eyre: An Autobiography) is a novel by English writer Charlotte Brontë, published under the pen name ""Currer Bell"", on 16 October 1847, by Smith, Elder & Co. of London. The first American edition was published the following year by Harper & Brothers of New York. Primarily a bildungsroman, Jane Eyre follows the experiences of its eponymous heroine, including her growth to adulthood and her love for Mr. Rochester, the brooding master of Thornfield Hall. The novel revolutionised prose fiction in that the focus on Jane's moral and spiritual development is told through an intimate, first-person narrative, where actions and events are coloured by a psychological intensity. The book contains elements of social criticism, with a strong sense of Christian morality at its core and is considered by many to be ahead of its time because of Jane's individualistic character and how the novel approaches the topics of class, sexuality, religion and feminism.";107;11;12.34;GBP;11
|
||||||
251;The Raven;"""The Raven"" is a narrative poem by American writer Edgar Allan Poe. First published in January 1845, the poem is often noted for its musicality, stylized language, and supernatural atmosphere. It tells of a talking raven's mysterious visit to a distraught lover, tracing the man's slow fall into madness. The lover, often identified as being a student, is lamenting the loss of his love, Lenore. Sitting on a bust of Pallas, the raven seems to further distress the protagonist with its constant repetition of the word ""Nevermore"". The poem makes use of folk, mythological, religious, and classical references.";150;333;13.13;USD;16
|
251;The Raven;"""The Raven"" is a narrative poem by American writer Edgar Allan Poe. First published in January 1845, the poem is often noted for its musicality, stylized language, and supernatural atmosphere. It tells of a talking raven's mysterious visit to a distraught lover, tracing the man's slow fall into madness. The lover, often identified as being a student, is lamenting the loss of his love, Lenore. Sitting on a bust of Pallas, the raven seems to further distress the protagonist with its constant repetition of the word ""Nevermore"". The poem makes use of folk, mythological, religious, and classical references.";150;333;13.13;USD;16
|
||||||
252;Eleonora;"""Eleonora"" is a short story by Edgar Allan Poe, first published in 1842 in Philadelphia in the literary annual The Gift. It is often regarded as somewhat autobiographical and has a relatively ""happy"" ending.";150;555;14;USD;16
|
252;Eleonora;"""Eleonora"" is a short story by Edgar Allan Poe, first published in 1842 in Philadelphia in the literary annual The Gift. It is often regarded as somewhat autobiographical and has a relatively ""happy"" ending.";150;555;14;USD;16
|
||||||
271;Catweazle;Catweazle is a British fantasy television series, starring Geoffrey Bayldon in the title role, and created by Richard Carpenter for London Weekend Television. The first series, produced and directed by Quentin Lawrence, was screened in the UK on ITV in 1970. The second series, directed by David Reid and David Lane, was shown in 1971. Each series had thirteen episodes, most but not all written by Carpenter, who also published two books based on the scripts.;170;22;15;EUR;13
|
271;Catweazle;Catweazle is a British fantasy television series, starring Geoffrey Bayldon in the title role, and created by Richard Carpenter for London Weekend Television. The first series, produced and directed by Quentin Lawrence, was screened in the UK on ITV in 1970. The second series, directed by David Reid and David Lane, was shown in 1971. Each series had thirteen episodes, most but not all written by Carpenter, who also published two books based on the scripts.;170;22;150;JPY;13
|
||||||
|
@@ -2,8 +2,9 @@ using { sap.capire.bookshop as my } from '../db/schema';
|
|||||||
service CatalogService @(path:'/browse') {
|
service CatalogService @(path:'/browse') {
|
||||||
|
|
||||||
/** For displaying lists of Books */
|
/** For displaying lists of Books */
|
||||||
@readonly entity ListOfBooks as projection on Books
|
@readonly entity ListOfBooks as projection on Books {
|
||||||
excluding { descr };
|
ID, title, author, genre, price, currency
|
||||||
|
}
|
||||||
|
|
||||||
/** For display in details pages */
|
/** For display in details pages */
|
||||||
@readonly entity Books as projection on my.Books { *,
|
@readonly entity Books as projection on my.Books { *,
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ CAD;de;Kanadischer Dollar;Kanadischer Dollar
|
|||||||
AUD;de;Australischer Dollar;Australischer Dollar
|
AUD;de;Australischer Dollar;Australischer Dollar
|
||||||
GBP;de;Pfund;Britische Pfund
|
GBP;de;Pfund;Britische Pfund
|
||||||
ILS;de;Schekel;Israelische Schekel
|
ILS;de;Schekel;Israelische Schekel
|
||||||
|
JPY;de;Yen;Japanische Yen
|
||||||
EUR;fr;euro;de la Zone euro
|
EUR;fr;euro;de la Zone euro
|
||||||
USD;fr;dollar;dollar des États-Unis
|
USD;fr;dollar;dollar des États-Unis
|
||||||
CAD;fr;dollar canadien;dollar canadien
|
CAD;fr;dollar canadien;dollar canadien
|
||||||
AUD;fr;dollar australien;dollar australien
|
AUD;fr;dollar australien;dollar australien
|
||||||
GBP;fr;livre sterling;pound sterling
|
GBP;fr;livre sterling;pound sterling
|
||||||
ILS;fr;Shekel;shekel israelien
|
ILS;fr;Shekel;shekel israelien
|
||||||
|
JPY;fr;Yen;Yen japonais
|
||||||
|
2
fiori/.env
Normal file
2
fiori/.env
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
cds.requires.messaging.kind = file-based-messaging
|
||||||
|
PORT = 4004
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using { AdminService } from '../../db/schema';
|
using { AdminService, sap.capire.bookshop } from '../../db/schema';
|
||||||
|
using from '../common'; // to help UI linter get the complete annotations
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
@@ -70,7 +71,7 @@ annotate AdminService.Authors with @(
|
|||||||
annotate sap.capire.bookshop.Books with @fiori.draft.enabled;
|
annotate sap.capire.bookshop.Books with @fiori.draft.enabled;
|
||||||
annotate AdminService.Books with @odata.draft.enabled;
|
annotate AdminService.Books with @odata.draft.enabled;
|
||||||
|
|
||||||
annotate AdminService.Books_texts with @(
|
annotate AdminService.Books.texts with @(
|
||||||
UI: {
|
UI: {
|
||||||
Identification: [{Value:title}],
|
Identification: [{Value:title}],
|
||||||
SelectionFields: [ locale, title ],
|
SelectionFields: [ locale, title ],
|
||||||
@@ -83,11 +84,12 @@ annotate AdminService.Books_texts with @(
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Add Value Help for Locales
|
// Add Value Help for Locales
|
||||||
annotate AdminService.Books_texts {
|
annotate AdminService.Books.texts {
|
||||||
locale @ValueList:{entity:'Languages',type:#fixed}
|
locale @ValueList:{entity:'Languages',type:#fixed}
|
||||||
}
|
}
|
||||||
// In addition we need to expose Languages through AdminService
|
// In addition we need to expose Languages and Books.texts through AdminService
|
||||||
using { sap } from '@sap/cds/common';
|
using { sap } from '@sap/cds/common';
|
||||||
extend service AdminService {
|
extend service AdminService {
|
||||||
entity Languages as projection on sap.common.Languages;
|
entity Languages as projection on sap.common.Languages;
|
||||||
|
entity Books.texts as projection on bookshop.Books.texts;
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
using CatalogService from '../../srv/cat-service';
|
using CatalogService from '@capire/bookshop';
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
Common Annotations shared by all apps
|
Common Annotations shared by all apps
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using { sap.capire.bookshop as my } from '../db/schema';
|
using { sap.capire.bookshop as my } from '@capire/bookshop';
|
||||||
using { sap.common } from '../db/capire_common';
|
using { sap.common } from '@capire/common';
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
@@ -54,7 +54,7 @@ annotate my.Books with {
|
|||||||
title @title:'{i18n>Title}';
|
title @title:'{i18n>Title}';
|
||||||
genre @title:'{i18n>Genre}' @Common: { Text: genre.name, TextArrangement: #TextOnly };
|
genre @title:'{i18n>Genre}' @Common: { Text: genre.name, TextArrangement: #TextOnly };
|
||||||
author @title:'{i18n>Author}' @Common: { Text: author.name, TextArrangement: #TextOnly };
|
author @title:'{i18n>Author}' @Common: { Text: author.name, TextArrangement: #TextOnly };
|
||||||
price @title:'{i18n>Price}';
|
price @title:'{i18n>Price}' @Measures.ISOCurrency: currency_code;
|
||||||
stock @title:'{i18n>Stock}';
|
stock @title:'{i18n>Stock}';
|
||||||
descr @UI.MultiLineText;
|
descr @UI.MultiLineText;
|
||||||
}
|
}
|
||||||
@@ -4,8 +4,9 @@
|
|||||||
|
|
||||||
using from './admin/fiori-service';
|
using from './admin/fiori-service';
|
||||||
using from './browse/fiori-service';
|
using from './browse/fiori-service';
|
||||||
using from './orders/fiori-service';
|
|
||||||
using from './common';
|
using from './common';
|
||||||
|
|
||||||
using from '../db/capire_common';
|
using from '@capire/common';
|
||||||
|
|
||||||
|
// only works in case of embedded orders service
|
||||||
|
using from '@capire/orders/app/orders/fiori-service';
|
||||||
10
fiori/db/hana/index.cds
Normal file
10
fiori/db/hana/index.cds
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
//
|
||||||
|
// Add Author.age and .lifetime with a DB-specific function
|
||||||
|
//
|
||||||
|
|
||||||
|
using { AdminService } from '../schema';
|
||||||
|
|
||||||
|
extend projection AdminService.Authors with {
|
||||||
|
YEARS_BETWEEN(dateOfBirth, dateOfDeath) as age: Integer,
|
||||||
|
YEAR(dateOfBirth) || ' – ' || YEAR(dateOfDeath) as lifetime : String
|
||||||
|
}
|
||||||
8
fiori/db/schema.cds
Normal file
8
fiori/db/schema.cds
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
using { sap.capire.bookshop } from '@capire/bookshop';
|
||||||
|
|
||||||
|
// Forward-declare calculated fields to be filled in database-specific ways
|
||||||
|
// TODO find a better way to have 'default' fields that still can be overwritten.
|
||||||
|
extend bookshop.Authors with {
|
||||||
|
virtual age: Integer;
|
||||||
|
virtual lifetime: String;
|
||||||
|
}
|
||||||
10
fiori/db/sqlite/index.cds
Normal file
10
fiori/db/sqlite/index.cds
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
//
|
||||||
|
// Add Author.age and .lifetime with a DB-specific function
|
||||||
|
//
|
||||||
|
|
||||||
|
using { AdminService } from '../schema';
|
||||||
|
|
||||||
|
extend projection AdminService.Authors with {
|
||||||
|
strftime('%Y',dateOfDeath)-strftime('%Y',dateOfBirth) as age: Integer,
|
||||||
|
strftime('%Y',dateOfBirth) || ' – ' || strftime('%Y',dateOfDeath) as lifetime : String
|
||||||
|
}
|
||||||
49
fiori/package.json
Normal file
49
fiori/package.json
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"name": "@capire/fiori",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@capire/bookshop": "*",
|
||||||
|
"@capire/common": "*",
|
||||||
|
"@capire/orders": "*",
|
||||||
|
"@capire/reviews": "*",
|
||||||
|
"@capire/suppliers": "*",
|
||||||
|
"@sap/cds": ">=5",
|
||||||
|
"express": "^4.17.1",
|
||||||
|
"passport": "^0.4.1"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"start": "cds run --in-memory?",
|
||||||
|
"watch": "cds watch"
|
||||||
|
},
|
||||||
|
"cds": {
|
||||||
|
"hana": {
|
||||||
|
"deploy-format": "hdbtable"
|
||||||
|
},
|
||||||
|
"requires": {
|
||||||
|
"API_BUSINESS_PARTNER": {
|
||||||
|
"kind": "odata-v2",
|
||||||
|
"model": "@capire/suppliers"
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"strategy": "dummy"
|
||||||
|
},
|
||||||
|
"ReviewsService": {
|
||||||
|
"kind": "odata-v4",
|
||||||
|
"model": "@capire/reviews"
|
||||||
|
},
|
||||||
|
"OrdersService": {
|
||||||
|
"kind": "odata-v4",
|
||||||
|
"model": "@capire/orders"
|
||||||
|
},
|
||||||
|
"db": {
|
||||||
|
"kind": "sql",
|
||||||
|
"[development]": {
|
||||||
|
"model": "db/sqlite"
|
||||||
|
},
|
||||||
|
"[production]": {
|
||||||
|
"model": "db/hana"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
16
fiori/server.js
Normal file
16
fiori/server.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
const cds = require ('@sap/cds')
|
||||||
|
module.exports = cds.server
|
||||||
|
|
||||||
|
cds.once('bootstrap',(app)=>{
|
||||||
|
app.serve ('/orders/webapp').from('@capire/orders','app/orders/webapp')
|
||||||
|
app.serve ('/bookshop').from('@capire/bookshop','app/vue')
|
||||||
|
app.serve ('/reviews').from('@capire/reviews','app/vue')
|
||||||
|
})
|
||||||
|
|
||||||
|
cds.once('served', require('./srv/mashup'))
|
||||||
|
cds.once('served', require('@capire/suppliers/srv/mashup'))
|
||||||
|
|
||||||
|
// Swagger UI - see https://cap.cloud.sap/docs/advanced/openapi
|
||||||
|
if (process.env.NODE_ENV !== 'production') {
|
||||||
|
cds.once ('bootstrap', app => app.use (require ('cds-swagger-ui-express')()) )
|
||||||
|
}
|
||||||
@@ -3,25 +3,29 @@
|
|||||||
// Mashing up imported models...
|
// Mashing up imported models...
|
||||||
//
|
//
|
||||||
|
|
||||||
using { sap.capire.bookshop.Books } from '../db/schema';
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Extend Books with access to Reviews and average ratings
|
// Extend Books with access to Reviews and average ratings
|
||||||
//
|
//
|
||||||
|
|
||||||
/*
|
using { CatalogService.ListOfBooks, sap.capire.bookshop.Books } from '@capire/bookshop';
|
||||||
using { ReviewsService.Reviews } from '@capire/reviews';
|
using { ReviewsService.Reviews } from '@capire/reviews';
|
||||||
extend Books with {
|
extend Books with {
|
||||||
reviews : Composition of many Reviews on reviews.subject = $self.ID;
|
reviews : Composition of many Reviews on reviews.subject = $self.ID;
|
||||||
rating : Decimal;
|
rating : Reviews:rating;
|
||||||
}
|
}
|
||||||
*/
|
extend projection ListOfBooks with { rating }
|
||||||
|
|
||||||
//
|
//
|
||||||
// Extend Orders with Books as Products
|
// Extend Orders with Books as Products
|
||||||
//
|
//
|
||||||
|
|
||||||
using { sap.capire.orders.Orders_Items } from '../db/schema';
|
using { sap.capire.orders.Orders_Items } from '@capire/orders';
|
||||||
extend Orders_Items with {
|
extend Orders_Items with {
|
||||||
book : Association to Books on product.ID = book.ID
|
book : Association to Books on product.ID = book.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
using { OrdersService.Orders } from '@capire/orders';
|
||||||
|
// extend service CatalogService with {
|
||||||
|
// entity OrdereredBooks as projection on Orders;
|
||||||
|
// }
|
||||||
@@ -6,7 +6,7 @@ module.exports = async()=>{ // called by server.js
|
|||||||
|
|
||||||
const cds = require('@sap/cds')
|
const cds = require('@sap/cds')
|
||||||
const CatalogService = await cds.connect.to ('CatalogService')
|
const CatalogService = await cds.connect.to ('CatalogService')
|
||||||
//const ReviewsService = await cds.connect.to ('ReviewsService')
|
const ReviewsService = await cds.connect.to ('ReviewsService')
|
||||||
const OrdersService = await cds.connect.to ('OrdersService')
|
const OrdersService = await cds.connect.to ('OrdersService')
|
||||||
const db = await cds.connect.to ('db')
|
const db = await cds.connect.to ('db')
|
||||||
|
|
||||||
@@ -39,14 +39,12 @@ module.exports = async()=>{ // called by server.js
|
|||||||
//
|
//
|
||||||
// Update Books' average ratings when ReviewsService signals updatd reviews
|
// Update Books' average ratings when ReviewsService signals updatd reviews
|
||||||
//
|
//
|
||||||
/*
|
|
||||||
ReviewsService.on ('reviewed', (msg) => {
|
ReviewsService.on ('reviewed', (msg) => {
|
||||||
console.debug ('> received:', msg.event, msg.data)
|
console.debug ('> received:', msg.event, msg.data)
|
||||||
const { subject, rating } = msg.data
|
const { subject, rating } = msg.data
|
||||||
return UPDATE(Books,subject).with({rating})
|
return UPDATE(Books,subject).with({rating})
|
||||||
// ^ Note: the framework will execute this and take care for db.tx
|
// ^ Note: the framework will execute this and take care for db.tx
|
||||||
})
|
})
|
||||||
*/
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Reduce stock of ordered books for orders are created from Orders admin UI
|
// Reduce stock of ordered books for orders are created from Orders admin UI
|
||||||
81
fiori/test/requests.http
Normal file
81
fiori/test/requests.http
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
|
||||||
|
@bookshop = http://localhost:4004
|
||||||
|
@reviews-service = {{bookshop}}/reviews
|
||||||
|
# Uncomment this when running a separate reviews service
|
||||||
|
@reviews-service = http://localhost:4005/reviews
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#################################################
|
||||||
|
#
|
||||||
|
# Reviews Service
|
||||||
|
#
|
||||||
|
|
||||||
|
GET {{reviews-service}}/Reviews
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
|
POST {{reviews-service}}/Reviews
|
||||||
|
Authorization: Basic {{$processEnv USER}}:
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{"subject":"201", "title":"boo", "rating":3 }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#################################################
|
||||||
|
#
|
||||||
|
# Bookshop Services
|
||||||
|
#
|
||||||
|
|
||||||
|
GET {{bookshop}}/browse/Books/201/reviews?
|
||||||
|
&$select=rating,date,title
|
||||||
|
&$top=3
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
|
GET {{bookshop}}/browse/Books(201)?
|
||||||
|
&$select=ID,title,rating
|
||||||
|
&$expand=reviews
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
|
GET {{bookshop}}/browse/Books?
|
||||||
|
&$select=title,author&$expand=currency
|
||||||
|
Accept-Language: de
|
||||||
|
|
||||||
|
#################################################
|
||||||
|
#
|
||||||
|
# Orders Service, incl. draft choreography
|
||||||
|
#
|
||||||
|
@newOrderID = e939604c-ab83-4d4f-bdb6-95fe30b3773e
|
||||||
|
|
||||||
|
GET {{bookshop}}/orders/Orders
|
||||||
|
|
||||||
|
### Create order, still inactive
|
||||||
|
POST {{bookshop}}/orders/Orders
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{"ID": "{{newOrderID}}"}
|
||||||
|
|
||||||
|
### Get inactive order. We have to specify `IsActiveEntity`.
|
||||||
|
GET {{bookshop}}/orders/Orders(ID={{newOrderID}},IsActiveEntity=false)
|
||||||
|
|
||||||
|
### Activate order using `.../<servicename>.draftActivate`
|
||||||
|
POST {{bookshop}}/orders/Orders(ID={{newOrderID}},IsActiveEntity=false)/OrdersService.draftActivate
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
### Get active order
|
||||||
|
GET {{bookshop}}/orders/Orders(ID={{newOrderID}},IsActiveEntity=true)
|
||||||
|
|
||||||
|
### Create author
|
||||||
|
POST {{bookshop}}/admin/Authors
|
||||||
|
Content-Type: application/json
|
||||||
|
Authorization: Basic alice:
|
||||||
|
|
||||||
|
{
|
||||||
|
"ID": 200,
|
||||||
|
"name": "William Shakespeare",
|
||||||
|
"dateOfBirth": "1564-04-26",
|
||||||
|
"dateOfDeath": "1616-04-23"
|
||||||
|
}
|
||||||
@@ -2,6 +2,28 @@
|
|||||||
"name": "@capire/hello-world",
|
"name": "@capire/hello-world",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"watch": "cds serve world.cds"
|
"test": "npx jest --silent",
|
||||||
|
"watch": "cds serve world.cds",
|
||||||
|
"watch:ts": "cds-ts serve world.cds"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/jest": "^26.0.23",
|
||||||
|
"@types/node": "^15.12.0",
|
||||||
|
"ts-jest": "^27.0.2",
|
||||||
|
"typescript": "^4.3.5"
|
||||||
|
},
|
||||||
|
"jest": {
|
||||||
|
"testEnvironment": "node",
|
||||||
|
"preset": "ts-jest",
|
||||||
|
"globals": {
|
||||||
|
"ts-jest": {
|
||||||
|
"diagnostics": {
|
||||||
|
"_comment": "see https://githubmemory.com/repo/kulshekhar/ts-jest/issues/2722",
|
||||||
|
"ignoreCodes": [
|
||||||
|
151001
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
15
hello/test/hello-world-ts.test.ts
Normal file
15
hello/test/hello-world-ts.test.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
process.env.CDS_TYPESCRIPT = 'true';
|
||||||
|
import * as cds from '@sap/cds';
|
||||||
|
|
||||||
|
//@ts-ignore
|
||||||
|
const {GET} = cds.test.in(__dirname,'..').run('serve', 'world.cds');
|
||||||
|
|
||||||
|
describe('Hello world!', () => {
|
||||||
|
afterAll(() => { delete process.env.CDS_TYPESCRIPT; });
|
||||||
|
|
||||||
|
it('should say hello with class impl from a typescript file', async () => {
|
||||||
|
const {data} = await GET`/say/hello(to='world')`
|
||||||
|
expect(data.value).toMatch(/Hello world.*typescript.*/i)
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
5
hello/world.ts
Normal file
5
hello/world.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
module.exports = class say {
|
||||||
|
hello(req: any) {
|
||||||
|
return `Hello ${req.data.to} from a typescript file!`
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1 +0,0 @@
|
|||||||
{}
|
|
||||||
33
multitenancy/.gitignore
vendored
33
multitenancy/.gitignore
vendored
@@ -1,33 +0,0 @@
|
|||||||
# CAP multitenancy
|
|
||||||
_out
|
|
||||||
*.db
|
|
||||||
connection.properties
|
|
||||||
default-*.json
|
|
||||||
gen/
|
|
||||||
node_modules/
|
|
||||||
target/
|
|
||||||
|
|
||||||
# Web IDE, App Studio
|
|
||||||
.che/
|
|
||||||
.gen/
|
|
||||||
|
|
||||||
# MTA
|
|
||||||
*_mta_build_tmp
|
|
||||||
*.mtar
|
|
||||||
*.mta
|
|
||||||
mta_archives/
|
|
||||||
*mta-op*/
|
|
||||||
|
|
||||||
|
|
||||||
# Other
|
|
||||||
.DS_Store
|
|
||||||
*.orig
|
|
||||||
*.log
|
|
||||||
|
|
||||||
*.iml
|
|
||||||
*.flattened-pom.xml
|
|
||||||
*log*.txt
|
|
||||||
|
|
||||||
# IDEs
|
|
||||||
# .vscode
|
|
||||||
# .idea
|
|
||||||
20
multitenancy/.vscode/extensions.json
vendored
20
multitenancy/.vscode/extensions.json
vendored
@@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
// See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
|
|
||||||
// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp
|
|
||||||
|
|
||||||
// List of extensions which should be recommended for users of this workspace.
|
|
||||||
"recommendations": [
|
|
||||||
// >>>>>>>> Add CDS Editor here as soon it is available of vscode marketplace!,
|
|
||||||
"dbaeumer.vscode-eslint",
|
|
||||||
"esbenp.prettier-vscode",
|
|
||||||
"mechatroner.rainbow-csv",
|
|
||||||
"humao.rest-client",
|
|
||||||
"alexcvzz.vscode-sqlite",
|
|
||||||
"hbenl.vscode-mocha-test-adapter",
|
|
||||||
"sdras.night-owl"
|
|
||||||
],
|
|
||||||
// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
|
|
||||||
"unwantedRecommendations": [
|
|
||||||
|
|
||||||
]
|
|
||||||
}
|
|
||||||
15
multitenancy/.vscode/launch.json
vendored
15
multitenancy/.vscode/launch.json
vendored
@@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
// Use IntelliSense to learn about possible attributes.
|
|
||||||
// Hover to view descriptions of existing attributes.
|
|
||||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"command": "cds run --with-mocks --in-memory?",
|
|
||||||
"name": "cds run",
|
|
||||||
"request": "launch",
|
|
||||||
"type": "node-terminal",
|
|
||||||
"skipFiles": [ "<node_internals>/**" ]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
7
multitenancy/.vscode/settings.json
vendored
7
multitenancy/.vscode/settings.json
vendored
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"files.exclude": {
|
|
||||||
"**/.gitignore": true,
|
|
||||||
"**/.git": true,
|
|
||||||
"**/.vscode": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
25
multitenancy/.vscode/tasks.json
vendored
25
multitenancy/.vscode/tasks.json
vendored
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
|
||||||
// for the documentation about the tasks.json format
|
|
||||||
"version": "2.0.0",
|
|
||||||
"tasks": [
|
|
||||||
{
|
|
||||||
"type": "shell",
|
|
||||||
"label": "cds watch",
|
|
||||||
"command": "cds",
|
|
||||||
"args": ["watch"],
|
|
||||||
"group": {
|
|
||||||
"kind": "build",
|
|
||||||
"isDefault": true
|
|
||||||
},
|
|
||||||
"problemMatcher": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "shell",
|
|
||||||
"label": "cds run",
|
|
||||||
"command": "cds",
|
|
||||||
"args": ["run", "--with-mocks", "--in-memory?"],
|
|
||||||
"problemMatcher": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
# Getting Started
|
|
||||||
|
|
||||||
Welcome to your new project.
|
|
||||||
|
|
||||||
It contains these folders and files, following our recommended project layout:
|
|
||||||
|
|
||||||
File or Folder | Purpose
|
|
||||||
---------|----------
|
|
||||||
`app/` | content for UI frontends goes here
|
|
||||||
`db/` | your domain models and data go here
|
|
||||||
`srv/` | your service models and code go here
|
|
||||||
`package.json` | project metadata and configuration
|
|
||||||
`readme.md` | this getting started guide
|
|
||||||
|
|
||||||
|
|
||||||
## Next Steps
|
|
||||||
|
|
||||||
- Open a new terminal and run `cds watch`
|
|
||||||
- (in VS Code simply choose _**Terminal** > Run Task > cds watch_)
|
|
||||||
- Start adding content, for example, a [db/schema.cds](db/schema.cds).
|
|
||||||
|
|
||||||
|
|
||||||
## Learn More
|
|
||||||
|
|
||||||
Learn more at https://cap.cloud.sap/docs/get-started/.
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<head>
|
|
||||||
<meta http-equiv="refresh" content="0;url=bookshop/index.html">
|
|
||||||
</head>
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Note: this is designed for the OrdersService being co-located with
|
|
||||||
// bookshop. It does not work if OrdersService is run as a separate
|
|
||||||
// process, and is not intended to do so.
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
using { OrdersService } from '../../srv/orders-service';
|
|
||||||
|
|
||||||
|
|
||||||
@odata.draft.enabled
|
|
||||||
annotate OrdersService.Orders with @(
|
|
||||||
UI: {
|
|
||||||
SelectionFields: [ createdAt, createdBy ],
|
|
||||||
LineItem: [
|
|
||||||
{Value: OrderNo, Label:'OrderNo'},
|
|
||||||
// {Value: buyer, Label:'Customer'}, we do not need this, because we want extend it later
|
|
||||||
{Value: createdAt, Label:'Date'}
|
|
||||||
],
|
|
||||||
HeaderInfo: {
|
|
||||||
TypeName: 'Order', TypeNamePlural: 'Orders',
|
|
||||||
Title: {
|
|
||||||
Label: 'Order number ', //A label is possible but it is not considered on the ObjectPage yet
|
|
||||||
Value: OrderNo
|
|
||||||
},
|
|
||||||
Description: {Value: createdBy}
|
|
||||||
},
|
|
||||||
Identification: [ //Is the main field group
|
|
||||||
{Value: createdBy, Label:'Customer'},
|
|
||||||
{Value: createdAt, Label:'Date'},
|
|
||||||
{Value: OrderNo },
|
|
||||||
],
|
|
||||||
HeaderFacets: [
|
|
||||||
{$Type: 'UI.ReferenceFacet', Label: '{i18n>Created}', Target: '@UI.FieldGroup#Created'},
|
|
||||||
{$Type: 'UI.ReferenceFacet', Label: '{i18n>Modified}', Target: '@UI.FieldGroup#Modified'},
|
|
||||||
],
|
|
||||||
Facets: [
|
|
||||||
{$Type: 'UI.ReferenceFacet', Label: '{i18n>Details}', Target: '@UI.FieldGroup#Details'},
|
|
||||||
{$Type: 'UI.ReferenceFacet', Label: '{i18n>OrderItems}', Target: 'Items/@UI.LineItem'},
|
|
||||||
],
|
|
||||||
FieldGroup#Details: {
|
|
||||||
Data: [
|
|
||||||
{Value: currency_code, Label:'Currency'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
FieldGroup#Created: {
|
|
||||||
Data: [
|
|
||||||
{Value: createdBy},
|
|
||||||
{Value: createdAt},
|
|
||||||
]
|
|
||||||
},
|
|
||||||
FieldGroup#Modified: {
|
|
||||||
Data: [
|
|
||||||
{Value: modifiedBy},
|
|
||||||
{Value: modifiedAt},
|
|
||||||
]
|
|
||||||
},
|
|
||||||
},
|
|
||||||
) {
|
|
||||||
createdAt @UI.HiddenFilter:false;
|
|
||||||
createdBy @UI.HiddenFilter:false;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
annotate OrdersService.Orders_Items with @(
|
|
||||||
UI: {
|
|
||||||
LineItem: [
|
|
||||||
{Value: product_ID, Label:'Product ID'},
|
|
||||||
{Value: title, Label:'Product Title'},
|
|
||||||
{Value: price, Label:'Unit Price'},
|
|
||||||
{Value: amount, Label:'Quantity'},
|
|
||||||
],
|
|
||||||
Identification: [ //Is the main field group
|
|
||||||
{Value: amount, Label:'Amount'},
|
|
||||||
{Value: title, Label:'Product'},
|
|
||||||
{Value: price, Label:'Unit Price'},
|
|
||||||
],
|
|
||||||
Facets: [
|
|
||||||
{$Type: 'UI.ReferenceFacet', Label: '{i18n>OrderItems}', Target: '@UI.Identification'},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
) {
|
|
||||||
amount @(
|
|
||||||
Common.FieldControl: #Mandatory
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -1,170 +0,0 @@
|
|||||||
{
|
|
||||||
"_version": "1.8.0",
|
|
||||||
"sap.app": {
|
|
||||||
"id": "orders",
|
|
||||||
"type": "application",
|
|
||||||
"title": "Order Books",
|
|
||||||
"description": "Sample Application",
|
|
||||||
"i18n": "i18n/i18n.properties",
|
|
||||||
"dataSources": {
|
|
||||||
"OrdersService": {
|
|
||||||
"uri": "/orders/",
|
|
||||||
"type": "OData",
|
|
||||||
"settings": {
|
|
||||||
"odataVersion": "4.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"-sourceTemplate": {
|
|
||||||
"id": "ui5template.basicSAPUI5ApplicationProject",
|
|
||||||
"-id": "ui5template.smartTemplate",
|
|
||||||
"-version": "1.40.12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"sap.ui5": {
|
|
||||||
"dependencies": {
|
|
||||||
"libs": {
|
|
||||||
"sap.fe.templates": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"models": {
|
|
||||||
"i18n": {
|
|
||||||
"type": "sap.ui.model.resource.ResourceModel",
|
|
||||||
"uri": "i18n/i18n.properties"
|
|
||||||
},
|
|
||||||
"": {
|
|
||||||
"dataSource": "OrdersService",
|
|
||||||
"settings": {
|
|
||||||
"synchronizationMode": "None",
|
|
||||||
"operationMode": "Server",
|
|
||||||
"autoExpandSelect" : true,
|
|
||||||
"earlyRequests": true,
|
|
||||||
"groupProperties": {
|
|
||||||
"default": {
|
|
||||||
"submit": "Auto"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"routing": {
|
|
||||||
"routes": [
|
|
||||||
{
|
|
||||||
"pattern": ":?query:",
|
|
||||||
"name": "OrdersList",
|
|
||||||
"target": "OrdersList"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pattern": "Orders({key}):?query:",
|
|
||||||
"name": "OrdersDetails",
|
|
||||||
"target": "OrdersDetails"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pattern": "Orders({boo})/Items({boo2}):?query:",
|
|
||||||
"name": "OrderItemsDetails",
|
|
||||||
"target": "OrderItemsDetails"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pattern": "Books({key}):?query:",
|
|
||||||
"name": "BooksDetails",
|
|
||||||
"target": "BooksDetails"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"targets": {
|
|
||||||
"OrdersList": {
|
|
||||||
"type": "Component",
|
|
||||||
"id": "OrdersList",
|
|
||||||
"name": "sap.fe.templates.ListReport",
|
|
||||||
"options": {
|
|
||||||
"settings" : {
|
|
||||||
"entitySet" : "Orders",
|
|
||||||
"navigation" : {
|
|
||||||
"Orders" : {
|
|
||||||
"detail" : {
|
|
||||||
"route" : "OrdersDetails"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"OrdersDetails": {
|
|
||||||
"type": "Component",
|
|
||||||
"id": "OrdersDetails",
|
|
||||||
"name": "sap.fe.templates.ObjectPage",
|
|
||||||
"options": {
|
|
||||||
"settings" : {
|
|
||||||
"entitySet": "Orders",
|
|
||||||
"navigation" : {
|
|
||||||
"Items": {
|
|
||||||
"detail": {
|
|
||||||
"route": "OrderItemsDetails"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"book": {
|
|
||||||
"detail": {
|
|
||||||
"route": "BooksDetails"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dummy": {
|
|
||||||
"detail": {
|
|
||||||
"route": "BooksDetails"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"OrderItemsDetails": {
|
|
||||||
"type": "Component",
|
|
||||||
"id": "OrderItemsDetails",
|
|
||||||
"name": "sap.fe.templates.ObjectPage",
|
|
||||||
"options": {
|
|
||||||
"settings" : {
|
|
||||||
"entitySet": "Orders_Items"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"BooksDetails": {
|
|
||||||
"type": "Component",
|
|
||||||
"id": "BooksDetails",
|
|
||||||
"name": "sap.fe.templates.ObjectPage",
|
|
||||||
"options": {
|
|
||||||
"settings" : {
|
|
||||||
"entitySet": "Books",
|
|
||||||
"navigation": {
|
|
||||||
"author": {
|
|
||||||
"detail": {
|
|
||||||
"route": "AuthorsDetails"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"AuthorsDetails": {
|
|
||||||
"type": "Component",
|
|
||||||
"id": "AuthorsDetails",
|
|
||||||
"name": "sap.fe.templates.ObjectPage",
|
|
||||||
"options": {
|
|
||||||
"settings" : {
|
|
||||||
"entitySet": "Authors"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"contentDensities": {
|
|
||||||
"compact": true,
|
|
||||||
"cozy": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"sap.ui": {
|
|
||||||
"technology": "UI5",
|
|
||||||
"fullWidth": false
|
|
||||||
},
|
|
||||||
"sap.fiori": {
|
|
||||||
"registrationIds": [],
|
|
||||||
"archeType": "transactional"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "approuter",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "",
|
|
||||||
"main": "index.js",
|
|
||||||
"devDependencies": {},
|
|
||||||
"engines": {
|
|
||||||
"node": "^12.0.0"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"start": "node node_modules/@sap/approuter/approuter.js"
|
|
||||||
},
|
|
||||||
"keywords": [],
|
|
||||||
"author": "",
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"@sap/approuter": ">=9.0.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<head>
|
|
||||||
<meta http-equiv="refresh" content="0;url=reviews/index.html">
|
|
||||||
</head>
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
"welcomeFile": "/admin-fiori.html",
|
|
||||||
"authenticationMethod": "route",
|
|
||||||
"sessionTimeout": 30,
|
|
||||||
"logout": {
|
|
||||||
"logoutEndpoint": "/do/logout",
|
|
||||||
"logoutPage": "/"
|
|
||||||
},
|
|
||||||
"routes": [
|
|
||||||
{
|
|
||||||
"source": "^/((admin|browse|orders)/webapp/.*)$",
|
|
||||||
"target": "$1",
|
|
||||||
"localDir": ".",
|
|
||||||
"authenticationType": "xsuaa"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"source": "^(/[^/]+\\.html(\\?.*)?)$",
|
|
||||||
"target": "$1",
|
|
||||||
"localDir": ".",
|
|
||||||
"authenticationType": "xsuaa"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"source": "^.*$",
|
|
||||||
"destination": "srv-api",
|
|
||||||
"authenticationType": "xsuaa"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
using { sap } from '@sap/cds/common';
|
|
||||||
|
|
||||||
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
|
|
||||||
// See also:
|
|
||||||
// [1] https://www.iso.org/iso-4217-currency-codes.html
|
|
||||||
// [2] https://www.currency-iso.org/en/home/tables/table-a1.html
|
|
||||||
// [3] https://www.ibm.com/support/knowledgecenter/en/SSZLC2_7.0.0/com.ibm.commerce.payments.developer.doc/refs/rpylerl2mst97.htm
|
|
||||||
numcode : Integer;
|
|
||||||
exponent : Integer; //> e.g. 2 --> 1 Dollar = 10^2 Cent
|
|
||||||
minor : String; //> e.g. 'Cent'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Code Lists below are designed as optional extensions to
|
|
||||||
* the base schema. Switch them on by adding an Association to
|
|
||||||
* one of the code list entities in your models or by:
|
|
||||||
* annotate sap.common.Countries with @cds.persistence.skip:false;
|
|
||||||
*/
|
|
||||||
|
|
||||||
context sap.common_countries {
|
|
||||||
|
|
||||||
extend sap.common.Countries {
|
|
||||||
regions : Composition of many Regions on regions._parent = $self.code;
|
|
||||||
}
|
|
||||||
|
|
||||||
entity Regions : sap.common.CodeList {
|
|
||||||
key code : String(5); // ISO 3166-2 alpha5 codes, e.g. DE-BW
|
|
||||||
children : Composition of many Regions on children._parent = $self.code;
|
|
||||||
cities : Composition of many Cities on cities.region = $self;
|
|
||||||
_parent : String(11);
|
|
||||||
}
|
|
||||||
entity Cities : sap.common.CodeList {
|
|
||||||
key code : String(11);
|
|
||||||
region : Association to Regions;
|
|
||||||
districts : Composition of many Districts on districts.city = $self;
|
|
||||||
}
|
|
||||||
entity Districts : sap.common.CodeList {
|
|
||||||
key code : String(11);
|
|
||||||
city : Association to Cities;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
ID;name;dateOfBirth;placeOfBirth;dateOfDeath;placeOfDeath
|
|
||||||
101;Emily Brontë;1818-07-30;Thornton, Yorkshire;1848-12-19;Haworth, Yorkshire
|
|
||||||
107;Charlotte Brontë;1818-04-21;Thornton, Yorkshire;1855-03-31;Haworth, Yorkshire
|
|
||||||
150;Edgar Allen Poe;1809-01-19;Boston, Massachusetts;1849-10-07;Baltimore, Maryland
|
|
||||||
170;Richard Carpenter;1929-08-14;King’s Lynn, Norfolk;2012-02-26;Hertfordshire, England
|
|
||||||
|
500 Internal Server Error
Gitea Version: 1.24.4 |