Compare commits

...

2 Commits
v7 ... ESM

Author SHA1 Message Date
Daniel Hutzel
dec9ec2aba ES Modules 2023-11-18 11:13:58 +01:00
Daniel Hutzel
789faeb7c4 ES Modules 2023-11-18 11:13:25 +01:00
9 changed files with 54 additions and 27 deletions

View File

@@ -10,6 +10,9 @@
"jest": true, "jest": true,
"mocha": true "mocha": true
}, },
"parserOptions": {
"sourceType": "module"
},
"globals": { "globals": {
"SELECT": true, "SELECT": true,
"INSERT": true, "INSERT": true,

2
bookshop/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
@cds-models
@cds

View File

@@ -6,7 +6,7 @@
// NOTE: We use cds.on('served') to delay the UPSERTs after the db init // NOTE: We use cds.on('served') to delay the UPSERTs after the db init
// to run after all INSERTs from .csv files happened. // to run after all INSERTs from .csv files happened.
module.exports = cds.on('served', ()=> cds.run( cds.on('served', ()=> cds.run(
UPSERT.into ('sap.common.Currencies') .columns ( UPSERT.into ('sap.common.Currencies') .columns (
[ 'code', 'symbol', 'name' ] [ 'code', 'symbol', 'name' ]
) .rows ( ) .rows (

View File

@@ -1,2 +1 @@
const { CatalogService } = require('./srv/cat-service') export { CatalogService } from './srv/cat-service'
module.exports = { CatalogService }

11
bookshop/jsconfig.json Normal file
View File

@@ -0,0 +1,11 @@
{
"compilerOptions": {
"module": "NodeNext",
"moduleResolution": "nodenext",
"paths": {
"#cds/*": [
"./@cds/*"
]
}
}
}

View File

@@ -2,6 +2,7 @@
"name": "@capire/bookshop", "name": "@capire/bookshop",
"version": "1.0.0", "version": "1.0.0",
"description": "A simple self-contained bookshop service.", "description": "A simple self-contained bookshop service.",
"type": "module",
"files": [ "files": [
"app", "app",
"srv", "srv",
@@ -10,7 +11,8 @@
"index.js" "index.js"
], ],
"devDependencies": { "devDependencies": {
"@cap-js/sqlite": "*" "@cap-js/sqlite": "*",
"@cap-js/cds-typer": ">=0.1"
}, },
"dependencies": { "dependencies": {
"@sap/cds": "^7", "@sap/cds": "^7",
@@ -21,5 +23,8 @@
"genres": "cds serve test/genres.cds", "genres": "cds serve test/genres.cds",
"start": "cds-serve", "start": "cds-serve",
"watch": "cds watch" "watch": "cds watch"
},
"imports": {
"#cds/*": "./@cds/*/index.js"
} }
} }

View File

@@ -1,6 +1,6 @@
const cds = require('@sap/cds/lib') import cds from '@sap/cds'
module.exports = class AdminService extends cds.ApplicationService { init(){ export class AdminService extends cds.ApplicationService { init(){
this.before ('NEW','Authors', genid) this.before ('NEW','Authors', genid)
this.before ('NEW','Books', genid) this.before ('NEW','Books', genid)
return super.init() return super.init()

View File

@@ -1,29 +1,36 @@
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 { Books } = cds.entities('sap.capire.bookshop')
const { ListOfBooks } = this.entities const { ListOfBooks } = this.entities
// Reduce stock of ordered books if available stock suffices
this.on ('submitOrder', async req => {
const {book,quantity} = req.data
if (quantity < 1) return req.reject (400,`quantity has to be 1 or more`)
let b = await SELECT `stock` .from (Books,book)
if (!b) return req.error (404,`Book #${book} doesn't exist`)
let {stock} = b
if (quantity > stock) return req.reject (409,`${quantity} exceeds stock for book #${book}`)
await UPDATE (Books,book) .with ({ stock: stock -= quantity })
await this.emit ('OrderedBook', { book, quantity, buyer:req.user.id })
return { stock }
})
// Add some discount for overstocked books // Add some discount for overstocked books
this.after ('READ', ListOfBooks, each => { this.after('READ', ListOfBooks, each => {
if (each.stock > 111) each.title += ` -- 11% discount!` if (each.stock > 111) each.title += ` -- 11% discount!`
}) })
// Reduce stock of ordered books if available stock suffices
this.on('submitOrder', async req => {
let { book:id, quantity } = req.data
let book = await SELECT.from (Books, id, b => b.stock)
// Validate input data
if (!book) return req.error (404, `Book #${id} doesn't exist`)
if (quantity < 1) return req.error (400, `quantity has to be 1 or more`)
if (quantity > book.stock) return req.error (409, `${quantity} exceeds stock for book #${id}`)
// Reduce stock in database and return updated stock value
await UPDATE (Books, id) .with ({ stock: book.stock -= quantity })
return book
})
// Emit event when an order has been submitted
this.after('submitOrder', async (_,req) => {
let { book, quantity } = req.data
await this.emit('OrderedBook', { book, quantity, buyer: req.user.id })
})
// Delegate requests to the underlying generic service
return super.init() return super.init()
}} }}
module.exports = { CatalogService }

View File

@@ -1,5 +1,5 @@
const cds = require('@sap/cds') import cds from '@sap/cds'
module.exports = class UserService extends cds.Service { init(){ export class UserService extends cds.Service { init(){
this.on('READ', 'me', ({ tenant, user, locale }) => ({ id: user.id, locale, tenant })) this.on('READ', 'me', ({ tenant, user, locale }) => ({ id: user.id, locale, tenant }))
this.on('login', (req) => { this.on('login', (req) => {
if (req.user._is_anonymous) if (req.user._is_anonymous)