Compare commits
1 Commits
Reuse-Migr
...
esm
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cba8e0cc5c |
4
.github/workflows/node.js.yml
vendored
4
.github/workflows/node.js.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [22.x, 20.x, 18.x]
|
||||
node-version: [20.x, 18.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -33,6 +33,6 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22.x
|
||||
node-version: 20.x
|
||||
- run: npm ci
|
||||
- run: npm run lint
|
||||
|
||||
29
.reuse/dep5
Normal file
29
.reuse/dep5
Normal file
@@ -0,0 +1,29 @@
|
||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: cloud-cap-samples
|
||||
Upstream-Contact: <Christian Georgi (christian.georgi@sap.com)>
|
||||
Source: https://github.com/SAP-samples/cloud-cap-samples
|
||||
Disclaimer: The code in this project may include calls to APIs (“API Calls”) of
|
||||
SAP or third-party products or services developed outside of this project
|
||||
(“External Products”).
|
||||
“APIs” means application programming interfaces, as well as their respective
|
||||
specifications and implementing code that allows software to communicate with
|
||||
other software.
|
||||
API Calls to External Products are not licensed under the open source license
|
||||
that governs this project. The use of such API Calls and related External
|
||||
Products are subject to applicable additional agreements with the relevant
|
||||
provider of the External Products. In no event shall the open source license
|
||||
that governs this project grant any rights in or to any External Products,or
|
||||
alter, expand or supersede any terms of the applicable additional agreements.
|
||||
If you have a valid license agreement with SAP for the use of a particular SAP
|
||||
External Product, then you may make use of any API Calls included in this
|
||||
project’s code for that SAP External Product, subject to the terms of such
|
||||
license agreement. If you do not have a valid license agreement for the use of
|
||||
a particular SAP External Product, then you may only make use of any API Calls
|
||||
in this project for that SAP External Product for your internal, non-productive
|
||||
and non-commercial test and evaluation of such API Calls. Nothing herein grants
|
||||
you any rights to use or access any SAP External Product, or provide any third
|
||||
parties the right to use of access any SAP External Product, through API Calls.
|
||||
|
||||
Files: *
|
||||
Copyright: 2019-2020 SAP SE or an SAP affiliate company and cap-cloud-samples
|
||||
License: Apache-2.0
|
||||
@@ -1,6 +1,3 @@
|
||||
[](https://api.reuse.software/info/github.com/SAP-samples/cloud-cap-samples)
|
||||
|
||||
|
||||
# Welcome to cap/samples
|
||||
|
||||
Find here a collection of samples for the [SAP Cloud Application Programming Model](https://cap.cloud.sap) organized in a simplistic [monorepo setup](samples.md#all-in-one-monorepo).
|
||||
@@ -16,7 +13,7 @@ Find here a collection of samples for the [SAP Cloud Application Programming Mod
|
||||
|
||||
### Preliminaries
|
||||
|
||||
1. Ensure you have the latest LTS version of Node.js installed (see [Getting Started](https://cap.cloud.sap/docs/get-started/jumpstart))
|
||||
1. Ensure you have the latest LTS version of Node.js installed (see [Getting Started](https://cap.cloud.sap/docs/get-started/))
|
||||
2. Install [**@sap/cds-dk**](https://cap.cloud.sap/docs/get-started/) globally:
|
||||
|
||||
```sh
|
||||
@@ -39,7 +36,7 @@ cd samples
|
||||
In the samples folder run:
|
||||
|
||||
```sh
|
||||
npm ci
|
||||
npm install
|
||||
```
|
||||
|
||||
### Run
|
||||
|
||||
11
REUSE.toml
11
REUSE.toml
@@ -1,11 +0,0 @@
|
||||
version = 1
|
||||
SPDX-PackageName = "cloud-cap-samples"
|
||||
SPDX-PackageSupplier = "<CAP (cap@sap.com)>"
|
||||
SPDX-PackageDownloadLocation = "https://github.com/SAP-samples/cloud-cap-samples"
|
||||
SPDX-PackageComment = "The code in this project may include calls to APIs (“API Calls”) of\n SAP or third-party products or services developed outside of this project\n (“External Products”).\n “APIs” means application programming interfaces, as well as their respective\n specifications and implementing code that allows software to communicate with\n other software.\n API Calls to External Products are not licensed under the open source license\n that governs this project. The use of such API Calls and related External\n Products are subject to applicable additional agreements with the relevant\n provider of the External Products. In no event shall the open source license\n that governs this project grant any rights in or to any External Products,or\n alter, expand or supersede any terms of the applicable additional agreements.\n If you have a valid license agreement with SAP for the use of a particular SAP\n External Product, then you may make use of any API Calls included in this\n project’s code for that SAP External Product, subject to the terms of such\n license agreement. If you do not have a valid license agreement for the use of\n a particular SAP External Product, then you may only make use of any API Calls\n in this project for that SAP External Product for your internal, non-productive\n and non-commercial test and evaluation of such API Calls. Nothing herein grants\n you any rights to use or access any SAP External Product, or provide any third\n parties the right to use of access any SAP External Product, through API Calls."
|
||||
|
||||
[[annotations]]
|
||||
path = "**.**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2019-2025 SAP SE or an SAP affiliate company and cap-cloud-samples"
|
||||
SPDX-License-Identifier = "Apache-2.0"
|
||||
@@ -19,7 +19,7 @@ const books = Vue.createApp ({
|
||||
search: ({target:{value:v}}) => books.fetch(v && '&$search='+v),
|
||||
|
||||
async fetch (etc='') {
|
||||
const {data} = await GET(`/ListOfBooks?$expand=genre($select=name),currency($select=symbol)${etc}`)
|
||||
const {data} = await GET(`/ListOfBooks?$expand=genre,currency${etc}`)
|
||||
books.list = data.value
|
||||
},
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const cds = require('@sap/cds')
|
||||
import cds from '@sap/cds'
|
||||
|
||||
/**
|
||||
* In order to keep basic bookshop sample as simple as possible, we don't add
|
||||
@@ -8,7 +8,7 @@ const cds = require('@sap/cds')
|
||||
|
||||
// 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', ()=>
|
||||
export default cds.on('served', ()=>
|
||||
UPSERT.into ('sap.common.Currencies') .columns (
|
||||
[ 'code', 'symbol', 'name' ]
|
||||
) .rows (
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"name": "@capire/bookshop",
|
||||
"version": "1.0.0",
|
||||
"description": "A simple self-contained bookshop service.",
|
||||
"type": "module",
|
||||
"files": [
|
||||
"app",
|
||||
"srv",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const cds = require('@sap/cds')
|
||||
import cds from '@sap/cds'
|
||||
|
||||
module.exports = class AdminService extends cds.ApplicationService { init(){
|
||||
export class AdminService extends cds.ApplicationService { init(){
|
||||
this.before (['NEW','CREATE'],'Authors', genid)
|
||||
this.before (['NEW','CREATE'],'Books', genid)
|
||||
return super.init()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const cds = require('@sap/cds')
|
||||
import cds from '@sap/cds'
|
||||
|
||||
class CatalogService extends cds.ApplicationService { init() {
|
||||
export class CatalogService extends cds.ApplicationService { init() {
|
||||
|
||||
const { Books } = cds.entities('sap.capire.bookshop')
|
||||
const { ListOfBooks } = this.entities
|
||||
@@ -34,5 +34,3 @@ class CatalogService extends cds.ApplicationService { init() {
|
||||
// Delegate requests to the underlying generic service
|
||||
return super.init()
|
||||
}}
|
||||
|
||||
module.exports = CatalogService
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
const cds = require('@sap/cds')
|
||||
module.exports = class UserService extends cds.Service { init(){
|
||||
import cds from '@sap/cds'
|
||||
export class UserService extends cds.Service { init(){
|
||||
this.on('READ', 'me', ({ tenant, user, locale }) => ({ id: user.id, locale, tenant }))
|
||||
this.on('login', (req) => {
|
||||
if (req.user._is_anonymous)
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
Books = Bücher
|
||||
Book = Buch
|
||||
Title = Titel
|
||||
Description = Beschreibung
|
||||
Stock = Bestand
|
||||
Image = Bild
|
||||
Price = Preis
|
||||
Currency = Währung
|
||||
|
||||
Authors = Autoren
|
||||
Author = Autor
|
||||
AuthorID = ID des Autors
|
||||
@@ -1,21 +0,0 @@
|
||||
Books = Books
|
||||
Book = Book
|
||||
ID = ID
|
||||
Title = Title
|
||||
Description = Description
|
||||
Stock = Stock
|
||||
Image = Image
|
||||
Price = Price
|
||||
Currency = Currency
|
||||
|
||||
Authors = Authors
|
||||
Author = Author
|
||||
AuthorID = Author''s ID
|
||||
Name = Name
|
||||
DateOfBirth = Date of Birth
|
||||
DateOfDeath = Date of Death
|
||||
PlaceOfBirth = Place of Birth
|
||||
PlaceOfDeath = Place of Death
|
||||
|
||||
Genres = Genres
|
||||
Genre = Genre
|
||||
@@ -1,20 +0,0 @@
|
||||
Books = Livres
|
||||
Book = Livre
|
||||
Title = Titre
|
||||
Description = Description
|
||||
Stock = Action
|
||||
Image = Image
|
||||
Price = Prix
|
||||
Currency = Devise
|
||||
|
||||
Authors = Auteurs
|
||||
Author = Auteur
|
||||
AuthorID = ID de l''auteur
|
||||
Name = Nom
|
||||
DateOfBirth = Date de naissance
|
||||
DateOfDeath = Date de décès
|
||||
PlaceOfBirth = Lieu de naissance
|
||||
PlaceOfDeath = Lieu de décès
|
||||
|
||||
Genres = Genre
|
||||
Genre = Genre
|
||||
@@ -1,34 +0,0 @@
|
||||
400 = Ungültige Anfrage
|
||||
401 = Nicht autorisiert
|
||||
403 = Verboten
|
||||
404 = Nicht gefunden
|
||||
405 = Methode nicht zulässig
|
||||
406 = Nicht akzeptabel
|
||||
407 = Proxy-Authentifizierung erforderlich
|
||||
408 = Anfrage-Timeout
|
||||
409 = Konflikt
|
||||
410 = Weg
|
||||
411 = Erforderliche Länge
|
||||
412 = Vorbedingung fehlgeschlagen
|
||||
413 = Nutzlast zu groß
|
||||
414 = URI zu lang
|
||||
415 = Nicht unterstützter Medientyp
|
||||
416 = Bereich nicht erfüllbar
|
||||
417 = Erwartung fehlgeschlagen
|
||||
422 = Nicht verarbeitbarer Inhalt
|
||||
424 = Fehlgeschlagene Abhängigkeit
|
||||
428 = Vorbedingung erforderlich
|
||||
429 = Zu viele Anfragen
|
||||
431 = Anfrage-Headerfelder zu groß
|
||||
451 = Aus rechtlichen Gründen nicht verfügbar
|
||||
500 = Interner Serverfehler
|
||||
501 = Der Server unterstützt die zur Erfüllung der Anfrage erforderliche Funktionalität nicht
|
||||
502 = Ungültiges Gateway
|
||||
503 = Dienst nicht verfügbar
|
||||
504 = Gateway-Timeout
|
||||
|
||||
ASSERT_RANGE = Wert {0} liegt nicht im angegebenen Bereich [{1}, {2}]
|
||||
ASSERT_FORMAT = Wert "{0}" liegt nicht im angegebenen Format "{1}"
|
||||
ASSERT_ARRAY = Wert muss ein Array sein
|
||||
ASSERT_ENUM = Wert {0} ist gemäß Enumerationsdeklaration {{1}} ungültig
|
||||
ASSERT_NOT_NULL = Wert ist erforderlich
|
||||
@@ -1,34 +0,0 @@
|
||||
400 = Bad Request
|
||||
401 = Unauthorized
|
||||
403 = Forbidden
|
||||
404 = Not Found
|
||||
405 = Method Not Allowed
|
||||
406 = Not Acceptable
|
||||
407 = Proxy Authentication Required
|
||||
408 = Request Timeout
|
||||
409 = Conflict
|
||||
410 = Gone
|
||||
411 = Length Required
|
||||
412 = Precondition Failed
|
||||
413 = Payload Too Large
|
||||
414 = URI Too Long
|
||||
415 = Unsupported Media Type
|
||||
416 = Range Not Satisfiable
|
||||
417 = Expectation Failed
|
||||
422 = Unprocessable Content
|
||||
424 = Failed Dependency
|
||||
428 = Precondition Required
|
||||
429 = Too Many Requests
|
||||
431 = Request Header Fields Too Large
|
||||
451 = Unavailable For Legal Reasons
|
||||
500 = Internal Server Error
|
||||
501 = The server does not support the functionality required to fulfill the request
|
||||
502 = Bad Gateway
|
||||
503 = Service Unavailable
|
||||
504 = Gateway Timeout
|
||||
|
||||
ASSERT_RANGE = Value {0} is not in specified range [{1}, {2}]
|
||||
ASSERT_FORMAT = Value "{0}" is not in specified format "{1}"
|
||||
ASSERT_ARRAY = Value must be an array
|
||||
ASSERT_ENUM = Value {0} is invalid according to enum declaration {{1}}
|
||||
ASSERT_NOT_NULL = Value is required
|
||||
@@ -1,34 +0,0 @@
|
||||
400 = Requête incorrecte
|
||||
401 = Non autorisée
|
||||
403 = Interdite
|
||||
404 = Introuvable
|
||||
405 = Méthode non autorisée
|
||||
406 = Non acceptable
|
||||
407 = Authentification proxy requise
|
||||
408 = Délai d''expiration de la requête
|
||||
409 = Conflit
|
||||
410 = Disparu
|
||||
411 = Longueur requise
|
||||
412 = Échec de la condition préalable
|
||||
413 = Charge utile trop importante
|
||||
414 = URI trop longue
|
||||
415 = Type de média non pris en charge
|
||||
416 = Plage non satisfaisante
|
||||
417 = Échec de l''attente
|
||||
422 = Contenu non traitable
|
||||
424 = Dépendance échouée
|
||||
428 = Condition préalable requise
|
||||
429 = Trop de requêtes
|
||||
431 = Champs d''en-tête de requête trop importants
|
||||
451 = Indisponible pour des raisons juridiques
|
||||
500 = Erreur interne du serveur
|
||||
501 = Le serveur ne prend pas en charge la fonctionnalité requise pour répondre à la requête
|
||||
502 = Passerelle incorrecte
|
||||
503 = Service indisponible
|
||||
504 = Délai d''attente de la passerelle
|
||||
|
||||
ASSERT_RANGE = La valeur {0} n''est pas dans la plage spécifiée [{1}, {2}]
|
||||
ASSERT_FORMAT = La valeur "{0}" n''est pas au format spécifié "{1}"
|
||||
ASSERT_ARRAY = La valeur doit être un tableau
|
||||
ASSERT_ENUM = La valeur {0} n''est pas valide selon la déclaration d''énumération {{1}}
|
||||
ASSERT_NOT_NULL = La valeur est obligatoire
|
||||
@@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "@capire/bookstore",
|
||||
"version": "1.0.0",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@capire/bookshop": "*",
|
||||
"@capire/reviews": "*",
|
||||
|
||||
@@ -1,20 +1,13 @@
|
||||
const cds = require ('@sap/cds')
|
||||
import mashup from './srv/mashup.js'
|
||||
import cds from '@sap/cds'
|
||||
|
||||
// Add mashup logic
|
||||
cds.once('served', require('./srv/mashup'))
|
||||
cds.once('served', mashup)
|
||||
|
||||
// Add routes to UIs from imported packages
|
||||
cds.once('bootstrap',(app)=>{
|
||||
try {
|
||||
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')
|
||||
} catch (err) {
|
||||
if (err.code === 'MODULE_NOT_FOUND') throw new Error('Run "npm ci" to install the required dependencies', { cause: err })
|
||||
throw err
|
||||
}
|
||||
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')
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import cds from '@sap/cds'
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Mashing up bookshop services with required services...
|
||||
//
|
||||
module.exports = async()=>{ // called by server.js
|
||||
export default async()=>{ // called by server.js
|
||||
|
||||
const cds = require('@sap/cds')
|
||||
const CatalogService = await cds.connect.to ('CatalogService')
|
||||
const ReviewsService = await cds.connect.to ('ReviewsService')
|
||||
const OrdersService = await cds.connect.to ('OrdersService')
|
||||
@@ -28,8 +29,8 @@ module.exports = async()=>{ // called by server.js
|
||||
//
|
||||
CatalogService.on ('OrderedBook', async (msg) => {
|
||||
const { book, quantity, buyer } = msg.data
|
||||
const { title, price } = await db.read (Books, book, b => { b.title, b.price })
|
||||
return OrdersService.create ('Orders').entries({
|
||||
const { title, price } = await db.tx(msg).read (Books, book, b => { b.title, b.price })
|
||||
return OrdersService.tx(msg).create ('Orders').entries({
|
||||
OrderNo: 'Order at '+ (new Date).toLocaleString(),
|
||||
Items: [{ product:{ID:`${book}`}, title, price, quantity }],
|
||||
buyer, createdBy: buyer
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// 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 +0,0 @@
|
||||
// dummy to auto-load the plugin
|
||||
@@ -4,12 +4,5 @@
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"@sap/cds": "*"
|
||||
},
|
||||
"cds": {
|
||||
"requires": {
|
||||
"@capire/common/data": {
|
||||
"model": "@capire/common"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,6 @@ class DataService extends cds.ApplicationService { init(){
|
||||
|
||||
module.exports = { DataService }
|
||||
|
||||
/** @returns {cds.Service} */
|
||||
function findDataSource(dataSourceName, entityName) {
|
||||
for (let srv of Object.values(cds.services)) { // all connected services
|
||||
if (!srv.name) continue // FIXME intermediate/pending in cds.services ?
|
||||
|
||||
43
fiori/app/_i18n/i18n.properties
Normal file
43
fiori/app/_i18n/i18n.properties
Normal file
@@ -0,0 +1,43 @@
|
||||
Books = Books
|
||||
Book = Book
|
||||
ID = ID
|
||||
Title = Title
|
||||
Author = Author
|
||||
AuthorID = Author ID
|
||||
Stock = Stock
|
||||
Name = Name
|
||||
Description = Description
|
||||
Image = Image
|
||||
AuthorName = Author's Name
|
||||
DateOfBirth = Date of Birth
|
||||
DateOfDeath = Date of Death
|
||||
PlaceOfBirth = Place of Birth
|
||||
PlaceOfDeath = Place of Death
|
||||
Age = Age
|
||||
Lifetime = Lifetime
|
||||
Authors = Authors
|
||||
|
||||
Order = Order
|
||||
Orders = Orders
|
||||
OrderNo = Order Number
|
||||
OrderItems = Order Items
|
||||
Customer = Customer
|
||||
Product = Product
|
||||
ProductID = Product ID
|
||||
ProductTitle = Product Title
|
||||
UnitPrice = Unit Price
|
||||
Quantity = Quantity
|
||||
|
||||
Price = Price
|
||||
Currency = Currency
|
||||
Date = Date
|
||||
Rating = Rating
|
||||
NumberOfReviews = Number of Reviews
|
||||
|
||||
Genre = Genre
|
||||
Genres = Genres
|
||||
SubGenres = Sub Genres
|
||||
|
||||
NumCode = Numeric Code
|
||||
MinorUnit = Minor Unit
|
||||
Exponent = Exponent
|
||||
@@ -1,5 +1,14 @@
|
||||
Books = Bücher
|
||||
Book = Buch
|
||||
ID = ID
|
||||
Title = Titel
|
||||
Authors = Autoren
|
||||
Author = Autor
|
||||
AuthorID = ID des Autors
|
||||
AuthorName = Name des Autors
|
||||
Age = Alter
|
||||
rder = Bestellung
|
||||
Name = Name
|
||||
Stock = Bestand
|
||||
Order = Bestellung
|
||||
Orders = Bestellungen
|
||||
Price = Preis
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
Age = Age
|
||||
Lifetime = Lifetime
|
||||
|
||||
SubGenres = Sub Genres
|
||||
|
||||
NumCode = Numeric Code
|
||||
MinorUnit = Minor Unit
|
||||
Exponent = Exponent
|
||||
@@ -6,8 +6,8 @@ using CatalogService from '@capire/bookstore';
|
||||
//
|
||||
annotate CatalogService.Books with @(UI : {
|
||||
HeaderInfo : {
|
||||
TypeName : '{i18n>Book}',
|
||||
TypeNamePlural : '{i18n>Books}',
|
||||
TypeName : 'Book',
|
||||
TypeNamePlural : 'Books',
|
||||
Description : {Value : author}
|
||||
},
|
||||
HeaderFacets : [{
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "@capire/hello-world",
|
||||
"version": "1.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"test": "npx jest --silent",
|
||||
"start": "cds-serve srv/world.cds",
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
module.exports = class say {
|
||||
hello(req) {
|
||||
let {to} = req.data
|
||||
if (to === 'me') to = require('os').userInfo().username
|
||||
import cds from '@sap/cds'
|
||||
export class say extends cds.ApplicationService {
|
||||
hello (to = 'World') {
|
||||
return `Hello ${to}!`
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { Request } from "@sap/cds"
|
||||
|
||||
module.exports = class say {
|
||||
hello(req: Request) {
|
||||
return `Hello ${req.data.to} from a TypeScript file!`
|
||||
}
|
||||
import cds from '@sap/cds'
|
||||
export class say extends cds.ApplicationService {
|
||||
hello (to : String = 'World') {
|
||||
return `Hello ${to} from TypeScript!`
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
using { sap.capire.media as db } from '../db/data-model';
|
||||
namespace sap.capire.media;
|
||||
|
||||
@path: '/media-server'
|
||||
service MediaServer {
|
||||
entity Media as projection on db.Media ;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ module.exports = srv => {
|
||||
})
|
||||
|
||||
srv.on('UPDATE', 'Media', (req, next) => {
|
||||
const url = req.path
|
||||
const url = req._.req.path
|
||||
if (url.includes('content')) {
|
||||
const id = req.data.id
|
||||
const obj = mediaDB.get(id)
|
||||
@@ -32,7 +32,7 @@ module.exports = srv => {
|
||||
})
|
||||
|
||||
srv.on('READ', 'Media', (req, next) => {
|
||||
const url = req.path
|
||||
const url = req._.req.path
|
||||
if (url.includes('content')) {
|
||||
const id = req.data.id
|
||||
const mediaObj = mediaDB.get(id)
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
Order = Bestellung
|
||||
Orders = Bestellungen
|
||||
Price = Preis
|
||||
@@ -1,10 +0,0 @@
|
||||
Order = Order
|
||||
Orders = Orders
|
||||
OrderNo = Order Number
|
||||
OrderItems = Order Items
|
||||
Customer = Customer
|
||||
Product = Product
|
||||
ProductID = Product ID
|
||||
ProductTitle = Product Title
|
||||
UnitPrice = Unit Price
|
||||
Quantity = Quantity
|
||||
@@ -1,10 +0,0 @@
|
||||
Order = Order
|
||||
Orders = Orders
|
||||
OrderNo = Numéro de commande
|
||||
OrderItems = Articles de la commande
|
||||
Customer = Client
|
||||
Product = Produit
|
||||
ProductID = ID du produit
|
||||
ProductTitle = Titre du produit
|
||||
UnitPrice = Prix unitaire
|
||||
Quantity = Quantité
|
||||
@@ -2,7 +2,7 @@ using { Currency, User, managed, cuid } from '@sap/cds/common';
|
||||
namespace sap.capire.orders;
|
||||
|
||||
entity Orders : cuid, managed {
|
||||
OrderNo : String(44) @title:'Order Number'; //> readable key
|
||||
OrderNo : String(22) @title:'Order Number'; //> readable key
|
||||
Items : Composition of many {
|
||||
key ID : UUID;
|
||||
product : Association to Products;
|
||||
|
||||
858
package-lock.json
generated
858
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
99
package.json
99
package.json
@@ -1,51 +1,50 @@
|
||||
{
|
||||
"name": "@capire/samples",
|
||||
"version": "2.1.0",
|
||||
"description": "A monorepo with several samples for CAP.",
|
||||
"repository": "https://github.com/sap-samples/cloud-cap-samples.git",
|
||||
"author": "daniel.hutzel@sap.com",
|
||||
"dependencies": {
|
||||
"@sap/cds": ">=8"
|
||||
},
|
||||
"workspaces": [
|
||||
"./bookshop",
|
||||
"./bookstore",
|
||||
"./common",
|
||||
"./data-viewer",
|
||||
"./fiori",
|
||||
"./hello",
|
||||
"./media",
|
||||
"./orders",
|
||||
"./loggers",
|
||||
"./reviews"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@cap-js/cds-types": "^0",
|
||||
"@cap-js/sqlite": "^1",
|
||||
"axios": "^1",
|
||||
"chai": "^4.3.4",
|
||||
"chai-as-promised": "^7.1.1",
|
||||
"chai-subset": "^1.6.0",
|
||||
"eslint": "^9",
|
||||
"semver": "^7"
|
||||
},
|
||||
"scripts": {
|
||||
"bookshop": "cds watch bookshop",
|
||||
"start": "cds watch fiori",
|
||||
"fiori": "cds watch fiori",
|
||||
"hello": "cds watch hello",
|
||||
"media": "cds watch media",
|
||||
"lint": "eslint",
|
||||
"test": "npx jest --silent",
|
||||
"jest": "npx jest --silent",
|
||||
"mocha": "CDS_TEST_SILENT=y npx mocha",
|
||||
"test:hello": "cd hello && npm test"
|
||||
},
|
||||
"mocha": {
|
||||
"recursive": true,
|
||||
"parallel": true,
|
||||
"timeout": 6666
|
||||
},
|
||||
"license": "SEE LICENSE IN LICENSE",
|
||||
"private": true
|
||||
}
|
||||
"name": "@capire/samples",
|
||||
"version": "2.1.0",
|
||||
"description": "A monorepo with several samples for CAP.",
|
||||
"repository": "https://github.com/sap-samples/cloud-cap-samples.git",
|
||||
"author": "daniel.hutzel@sap.com",
|
||||
"dependencies": {
|
||||
"@sap/cds": ">=8"
|
||||
},
|
||||
"workspaces": [
|
||||
"./bookshop",
|
||||
"./bookstore",
|
||||
"./common",
|
||||
"./data-viewer",
|
||||
"./fiori",
|
||||
"./hello",
|
||||
"./media",
|
||||
"./orders",
|
||||
"./loggers",
|
||||
"./reviews"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@cap-js/sqlite": "^1",
|
||||
"axios": "^1",
|
||||
"chai": "^4.3.4",
|
||||
"chai-as-promised": "^7.1.1",
|
||||
"chai-subset": "^1.6.0",
|
||||
"eslint": "^9",
|
||||
"semver": "^7"
|
||||
},
|
||||
"scripts": {
|
||||
"bookshop": "cds watch bookshop",
|
||||
"start": "cds watch fiori",
|
||||
"fiori": "cds watch fiori",
|
||||
"hello": "cds watch hello",
|
||||
"media": "cds watch media",
|
||||
"lint": "eslint",
|
||||
"test": "npx jest --silent",
|
||||
"jest": "npx jest --silent",
|
||||
"mocha": "CDS_TEST_SILENT=y npx mocha",
|
||||
"test:hello": "cd hello && npm test"
|
||||
},
|
||||
"mocha": {
|
||||
"recursive": true,
|
||||
"parallel": true,
|
||||
"timeout": 6666
|
||||
},
|
||||
"license": "SEE LICENSE IN LICENSE",
|
||||
"private": true
|
||||
}
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
Date = Datum
|
||||
Rating = Bewertung
|
||||
NumberOfReviews = Anzahl der Reviews
|
||||
@@ -1,5 +0,0 @@
|
||||
Reviews = Reviews
|
||||
Review = Review
|
||||
Date = Date
|
||||
Rating = Rating
|
||||
NumberOfReviews = Number of Reviews
|
||||
@@ -1,5 +0,0 @@
|
||||
Reviews = Avis
|
||||
Review = Avis
|
||||
Date = Date
|
||||
Rating = Note
|
||||
NumberOfReviews = Nombre d''avis
|
||||
@@ -1,53 +0,0 @@
|
||||
const cds = require("@sap/cds");
|
||||
const { expect } = cds.test(
|
||||
"serve",
|
||||
"CatalogService",
|
||||
"--from",
|
||||
"@capire/bookshop,@capire/common",
|
||||
"--in-memory"
|
||||
);
|
||||
|
||||
describe("Consuming actions locally", () => {
|
||||
let cats, CatalogService, Books, stockBefore;
|
||||
const BOOK_ID = 251;
|
||||
const QUANTITY = 1;
|
||||
|
||||
before("bootstrap the database", async () => {
|
||||
CatalogService = cds.services.CatalogService;
|
||||
expect(CatalogService).not.to.be.undefined;
|
||||
|
||||
Books = CatalogService.entities.Books;
|
||||
expect(Books).not.to.be.undefined;
|
||||
|
||||
cats = await cds.connect.to("CatalogService");
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
// Read the stock before the action is called
|
||||
stockBefore = (await cats.get(Books, BOOK_ID)).stock;
|
||||
});
|
||||
|
||||
it("calls unbound actions - basic variant using srv.send", async () => {
|
||||
// Use a managed transaction to create a continuation with an authenticated user
|
||||
const res1 = await cats.tx({ user: "alice" }, () => {
|
||||
return cats.send("submitOrder", { book: BOOK_ID, quantity: QUANTITY });
|
||||
});
|
||||
expect(res1.stock).to.eql(stockBefore - QUANTITY);
|
||||
});
|
||||
|
||||
it("calls unbound actions - named args variant", async () => {
|
||||
// Use a managed transaction to create a continuation with an authenticated user
|
||||
const res2 = await cats.tx({ user: "alice" }, () => {
|
||||
return cats.submitOrder({ book: BOOK_ID, quantity: QUANTITY });
|
||||
});
|
||||
expect(res2.stock).to.eql(stockBefore - QUANTITY);
|
||||
});
|
||||
|
||||
it("calls unbound actions - positional args variant", async () => {
|
||||
// Use a managed transaction to create a continuation with an authenticated user
|
||||
const res3 = await cats.tx({ user: "alice" }, () => {
|
||||
return cats.submitOrder(BOOK_ID, QUANTITY);
|
||||
});
|
||||
expect(res3.stock).to.eql(stockBefore - QUANTITY);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user