diff --git a/bookshop/app/vue/app.js b/bookshop/app/vue/app.js index 7aaa2972..c2b7ce11 100644 --- a/bookshop/app/vue/app.js +++ b/bookshop/app/vue/app.js @@ -9,7 +9,8 @@ const books = Vue.createApp ({ return { list: [], book: undefined, - order: { quantity:1, succeeded:'', failed:'' } + order: { quantity:1, succeeded:'', failed:'' }, + user: {} } }, @@ -37,12 +38,24 @@ const books = Vue.createApp ({ book.stock = res.data.stock books.order = { quantity, succeeded: `Successfully ordered ${quantity} item(s).` } } catch (e) { - books.order = { quantity, failed: e.response.data.error.message } + books.order = { quantity, failed: e.response.data.error ? e.response.data.error.message : e.response.data } } - } + }, + async fetchUserInfo() { + try { + books.user = (await axios.get('/user/Me')).data + if (!books.user.ID) books.user.ID = 'anonymous' + } catch (err) { books.user = {}; books.user.ID = err.message } + } } }).mount("#app") // initially fill list of books books.fetch() + +books.fetchUserInfo() +document.addEventListener('keydown', (event) => { + // hide user info on request + if (event.key === 'u') books.user = undefined +}) diff --git a/bookshop/app/vue/index.html b/bookshop/app/vue/index.html index 6f94c022..20204a18 100644 --- a/bookshop/app/vue/index.html +++ b/bookshop/app/vue/index.html @@ -11,12 +11,19 @@ .rating-stars { color:teal } .succeeded { color:teal } .failed { color:red } + .user {text-align: end; color: grey;}
+
+
User: {{ user.ID || 'anonymous' }}
+
Locale: {{ user.locale }}
+
Tenant: {{ user.tenant }}
+
+

Capire Books

diff --git a/bookshop/srv/user-service.cds b/bookshop/srv/user-service.cds new file mode 100644 index 00000000..80320fa2 --- /dev/null +++ b/bookshop/srv/user-service.cds @@ -0,0 +1,17 @@ +/** + * Exposes user information + */ +@requires : 'authenticated-user' +service UserService { + + /** + * The current user + */ + @odata.singleton + entity Me { + ID : String; + locale : String; + tenant : String; + } + +} diff --git a/bookshop/srv/user-service.js b/bookshop/srv/user-service.js new file mode 100644 index 00000000..33502cc6 --- /dev/null +++ b/bookshop/srv/user-service.js @@ -0,0 +1,11 @@ +const cds = require('@sap/cds'); + +module.exports = cds.service.impl((srv) => { + srv.on('READ', 'Me', ({ user }) => { + return { + ID: user.id, + locale: user.locale, + tenant: user.tenant, + }; + }); +}); diff --git a/test/odata.test.js b/test/odata.test.js index 43b90791..08dcd87c 100644 --- a/test/odata.test.js +++ b/test/odata.test.js @@ -1,7 +1,6 @@ const cds = require('@sap/cds/lib') -const { GET, expect } = cds.test ('@capire/bookshop') -if (cds.User.default) cds.User.default = cds.User.Privileged // hard core monkey patch -else cds.User = cds.User.Privileged // hard core monkey patch for older cds releases +const { GET, expect, axios } = cds.test ('@capire/bookshop') +axios.defaults.auth = { username: 'alice', password: 'admin' } describe('OData Protocol', () => { @@ -76,3 +75,18 @@ describe('OData Protocol', () => { ]) }) }) + +describe('Misc', () => { + + it('serves user info', async () => { + { + const { data } = await GET (`/user/Me`) + expect(data).to.containSubset({ ID: 'alice', locale:'en', tenant: null }) + } + { + const { data } = await GET (`/user/Me`, {auth: { username: 'joe' }}) + expect(data).to.containSubset({ ID: 'joe', locale:'en', tenant: null }) + } + }) + +}) \ No newline at end of file