Compare commits
2 Commits
new-capire
...
ESM
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dec9ec2aba | ||
|
|
789faeb7c4 |
@@ -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
2
bookshop/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
@cds-models
|
||||||
|
@cds
|
||||||
@@ -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 (
|
||||||
|
|||||||
@@ -1,2 +1 @@
|
|||||||
const { CatalogService } = require('./srv/cat-service')
|
export { CatalogService } from './srv/cat-service'
|
||||||
module.exports = { CatalogService }
|
|
||||||
|
|||||||
11
bookshop/jsconfig.json
Normal file
11
bookshop/jsconfig.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"module": "NodeNext",
|
||||||
|
"moduleResolution": "nodenext",
|
||||||
|
"paths": {
|
||||||
|
"#cds/*": [
|
||||||
|
"./@cds/*"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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 }
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user