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