audit log
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
using { sap.capire.bookshop as my } from '../db/schema';
|
||||
service AdminService @(requires_:'admin') {
|
||||
service AdminService @(requires:'admin') {
|
||||
entity Books as projection on my.Books;
|
||||
entity Authors as projection on my.Authors;
|
||||
}
|
||||
|
||||
13
bookshop/srv/admin-service.js
Normal file
13
bookshop/srv/admin-service.js
Normal file
@@ -0,0 +1,13 @@
|
||||
const cds = require('@sap/cds/lib')
|
||||
|
||||
module.exports = class AdminService extends cds.ApplicationService { init(){
|
||||
this.before ('NEW','Authors', genid)
|
||||
this.before ('NEW','Books', genid)
|
||||
return super.init()
|
||||
}}
|
||||
|
||||
/** Generate primary keys for target entity in request */
|
||||
async function genid (req) {
|
||||
const {ID} = await cds.tx(req).run (SELECT.one.from(req.target).columns('max(ID) as ID'))
|
||||
req.data.ID = ID - ID % 100 + 100 + 1
|
||||
}
|
||||
@@ -1,10 +1,21 @@
|
||||
using { sap.capire.bookshop as my } from '../db/schema';
|
||||
service CatalogService @(path:'/browse') {
|
||||
|
||||
@readonly entity Books as SELECT from my.Books {*,
|
||||
/** For displaying lists of Books */
|
||||
@readonly entity ListOfBooks as projection on Books
|
||||
excluding { descr };
|
||||
|
||||
/** For display in details pages */
|
||||
@readonly entity Books as projection on my.Books { *,
|
||||
author.name as author
|
||||
} excluding { createdBy, modifiedBy };
|
||||
|
||||
<<<<<<< HEAD
|
||||
@requires_: 'authenticated-user'
|
||||
action submitOrder (book : Integer, amount: Integer);
|
||||
=======
|
||||
@requires: 'authenticated-user'
|
||||
action submitOrder ( book: Books:ID, quantity: Integer ) returns { stock: Integer };
|
||||
event OrderedBook : { book: Books:ID; quantity: Integer; buyer: String };
|
||||
>>>>>>> 534af7ffee60e086c563dbaa450e86e5fca5cf2b
|
||||
}
|
||||
|
||||
@@ -1,22 +1,29 @@
|
||||
const cds = require('@sap/cds')
|
||||
module.exports = async function (){
|
||||
|
||||
const db = await cds.connect.to('db') // connect to database service
|
||||
const { Books } = db.entities // get reflected definitions
|
||||
class CatalogService extends cds.ApplicationService { init(){
|
||||
|
||||
const { Books } = cds.entities ('sap.capire.bookshop')
|
||||
const { ListOfBooks } = this.entities
|
||||
|
||||
// Reduce stock of ordered books if available stock suffices
|
||||
this.on ('submitOrder', async req => {
|
||||
const {book,amount} = req.data
|
||||
const n = await UPDATE (Books, book)
|
||||
.with ({ stock: {'-=': amount }})
|
||||
.where ({ stock: {'>=': amount }})
|
||||
n > 0 || req.error (409,`${amount} exceeds stock for book #${book}`)
|
||||
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
|
||||
this.after ('READ','Books', each => {
|
||||
if (each.stock > 111) {
|
||||
each.title += ` -- 11% discount!`
|
||||
}
|
||||
this.after ('READ', ListOfBooks, each => {
|
||||
if (each.stock > 111) each.title += ` -- 11% discount!`
|
||||
})
|
||||
}
|
||||
|
||||
return super.init()
|
||||
}}
|
||||
|
||||
module.exports = { CatalogService }
|
||||
|
||||
15
bookshop/srv/user-service.cds
Normal file
15
bookshop/srv/user-service.cds
Normal file
@@ -0,0 +1,15 @@
|
||||
/**
|
||||
* Exposes user information
|
||||
*/
|
||||
service UserService {
|
||||
/**
|
||||
* The current user
|
||||
*/
|
||||
@odata.singleton entity me @cds.persistence.skip {
|
||||
id : String; // user id
|
||||
locale : String;
|
||||
tenant : String;
|
||||
}
|
||||
|
||||
action login() returns me;
|
||||
}
|
||||
9
bookshop/srv/user-service.js
Normal file
9
bookshop/srv/user-service.js
Normal file
@@ -0,0 +1,9 @@
|
||||
const cds = require('@sap/cds')
|
||||
module.exports = 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)
|
||||
req._.res.set('WWW-Authenticate','Basic realm="Users"').sendStatus(401)
|
||||
else return this.read('me')
|
||||
})
|
||||
}}
|
||||
Reference in New Issue
Block a user