From 02fc1a89a1846f6d868b249dbca72c9251e5b0f6 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 19 Oct 2022 13:00:20 +0200 Subject: [PATCH 01/15] Fixed expected tenants in odata.test.js --- test/odata.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/odata.test.js b/test/odata.test.js index 71d6f0a8..c0987828 100644 --- a/test/odata.test.js +++ b/test/odata.test.js @@ -128,11 +128,11 @@ describe('cap/samples - Bookshop APIs', () => { it('serves user info', async () => { { const { data } = await GET (`/user/me`) - expect(data).to.containSubset({ id: 'alice', locale:'en', tenant: null }) + expect(data).to.containSubset({ id: 'alice', locale:'en' }) } { const { data } = await GET (`/user/me`, {auth: { username: 'joe' }}) - expect(data).to.containSubset({ id: 'joe', locale:'en', tenant: null }) + expect(data).to.containSubset({ id: 'joe', locale:'en' }) } }) From 18c29d8b67e22faaec72d274a33406d9920bb148 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Mon, 24 Oct 2022 09:54:18 +0200 Subject: [PATCH 02/15] Create config.yml --- .github/ISSUE_TEMPLATE/config.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..58fede7a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: This channel is CLOSED. + about: Use SAP community instead + url: https://answers.sap.com/tags/9f13aee1-834c-4105-8e43-ee442775e5ce From 6981841d86ac6b96eb00d6bcf877c272ce8860e9 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Mon, 24 Oct 2022 09:54:48 +0200 Subject: [PATCH 03/15] Delete question--feedback-or-bug-.md --- .github/ISSUE_TEMPLATE/question--feedback-or-bug-.md | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/question--feedback-or-bug-.md diff --git a/.github/ISSUE_TEMPLATE/question--feedback-or-bug-.md b/.github/ISSUE_TEMPLATE/question--feedback-or-bug-.md deleted file mode 100644 index f4db679b..00000000 --- a/.github/ISSUE_TEMPLATE/question--feedback-or-bug-.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: This channel is CLOSED. -about: Use our community at https://answers.sap.com/tags/9f13aee1-834c-4105-8e43-ee442775e5ce -title: '' -labels: '' -assignees: '' - ---- - -Please use our community on https://answers.sap.com/tags/9f13aee1-834c-4105-8e43-ee442775e5ce From 3f7b43346f5fa35ea4dbbe61fb6c7d93d206b0e4 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 6 Nov 2022 18:03:38 +0100 Subject: [PATCH 04/15] Buffer() is deprecated --- media/srv/media-service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/srv/media-service.js b/media/srv/media-service.js index f70d3b90..b656f03c 100644 --- a/media/srv/media-service.js +++ b/media/srv/media-service.js @@ -40,7 +40,7 @@ module.exports = srv => { req.reject(404, 'Media not found for the ID') return } - const decodedMedia = new Buffer( + const decodedMedia = Buffer.from( mediaObj.media.split(';base64,').pop(), 'base64' ) From 0ad8baefc746f57e694e4ab8f03649454e9c6c98 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Nov 2022 12:04:29 +0000 Subject: [PATCH 05/15] Bump @sap/cds from 6.2.2 to 6.3.1 Bumps [@sap/cds](https://cap.cloud.sap/) from 6.2.2 to 6.3.1. --- updated-dependencies: - dependency-name: "@sap/cds" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1441a63e..ed067ab8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -333,9 +333,9 @@ } }, "node_modules/@sap/cds": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-6.2.2.tgz", - "integrity": "sha512-l1ps/Ofp+0k/ngSrCHBFNUXQew6n9A4OJhrm3CroxIEq8wQeXB5LBq53YQQYoCj807eQlXbVbzg6hRCm+BgDaQ==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-6.3.1.tgz", + "integrity": "sha512-EywUoV16yfYMMEgpY5M4NdNrdjw7dPcIK5c+pAVjio+16PDa7l2x81AhO/JNWD7g7j/POsNUc2ry+LtRxUuceQ==", "dependencies": { "@sap/cds-compiler": "^3.2.0", "@sap/cds-foss": "^4" @@ -344,7 +344,7 @@ "cds": "bin/cds.js" }, "engines": { - "node": ">=14.15.0" + "node": ">=14.18.0" } }, "node_modules/@sap/cds-compiler": { @@ -3200,9 +3200,9 @@ } }, "@sap/cds": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-6.2.2.tgz", - "integrity": "sha512-l1ps/Ofp+0k/ngSrCHBFNUXQew6n9A4OJhrm3CroxIEq8wQeXB5LBq53YQQYoCj807eQlXbVbzg6hRCm+BgDaQ==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-6.3.1.tgz", + "integrity": "sha512-EywUoV16yfYMMEgpY5M4NdNrdjw7dPcIK5c+pAVjio+16PDa7l2x81AhO/JNWD7g7j/POsNUc2ry+LtRxUuceQ==", "requires": { "@sap/cds-compiler": "^3.2.0", "@sap/cds-foss": "^4" From ad76c699c973d08a39699fefb1449301211d6144 Mon Sep 17 00:00:00 2001 From: Pierre Fritsch Date: Tue, 8 Nov 2022 14:23:44 +0100 Subject: [PATCH 06/15] Add column labels for `age` and `lifetime` (#419) Co-authored-by: Christian Georgi --- fiori/app/_i18n/i18n.properties | 1 + fiori/app/admin-authors/fiori-service.cds | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/fiori/app/_i18n/i18n.properties b/fiori/app/_i18n/i18n.properties index 83681bcf..01f3fc54 100644 --- a/fiori/app/_i18n/i18n.properties +++ b/fiori/app/_i18n/i18n.properties @@ -12,6 +12,7 @@ DateOfDeath = Date of Death PlaceOfBirth = Place of Birth PlaceOfDeath = Place of Death Age = Age +Lifetime = Lifetime Authors = Authors Order = Order Orders = Orders diff --git a/fiori/app/admin-authors/fiori-service.cds b/fiori/app/admin-authors/fiori-service.cds index 2309eae6..9ca69224 100644 --- a/fiori/app/admin-authors/fiori-service.cds +++ b/fiori/app/admin-authors/fiori-service.cds @@ -43,5 +43,10 @@ extend sap.capire.bookshop.Authors with { virtual lifetime : String; } +annotate AdminService.Authors with { + age @Common.Label : '{i18n>Age}'; + lifetime @Common.Label : '{i18n>Lifetime}' +} + // Workaround for Fiori popup for asking user to enter a new UUID on Create annotate AdminService.Authors with { ID @Core.Computed; } From e4214b0e4003462888d41c35a0237d644d0130ac Mon Sep 17 00:00:00 2001 From: Pierre Fritsch Date: Tue, 8 Nov 2022 14:26:48 +0100 Subject: [PATCH 07/15] Fiori app *Browse Books*: Add missing column labels (#420) * Add labels for `rating` and `numberOfReviews` * Add label for `currency.symbol` * Add label for `descr` * Add label for `image` Co-authored-by: Christian Georgi --- bookstore/srv/mashup.cds | 4 ++++ fiori/app/_i18n/i18n.properties | 5 +++++ fiori/app/browse/fiori-service.cds | 5 +---- fiori/app/common.cds | 10 ++++++++-- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/bookstore/srv/mashup.cds b/bookstore/srv/mashup.cds index 061418c0..7344ff1a 100644 --- a/bookstore/srv/mashup.cds +++ b/bookstore/srv/mashup.cds @@ -12,7 +12,11 @@ using { sap.capire.bookshop.Books } from '@capire/bookshop'; using { ReviewsService.Reviews } from '@capire/reviews'; extend Books with { reviews : Composition of many Reviews on reviews.subject = $self.ID; + + @Common.Label : '{i18n>Rating}' rating : Decimal; + + @Common.Label : '{i18n>NumberOfReviews}' numberOfReviews : Integer; } diff --git a/fiori/app/_i18n/i18n.properties b/fiori/app/_i18n/i18n.properties index 01f3fc54..30c91ce9 100644 --- a/fiori/app/_i18n/i18n.properties +++ b/fiori/app/_i18n/i18n.properties @@ -6,6 +6,8 @@ Author = Author AuthorID = Author ID Stock = Stock Name = Name +Description = Description +Image = Image AuthorName = Author's Name DateOfBirth = Date of Birth DateOfDeath = Date of Death @@ -17,6 +19,9 @@ Authors = Authors Order = Order Orders = Orders Price = Price +Currency = Currency +Rating = Rating +NumberOfReviews = Number of Reviews Genre = Genre Genres = Genres diff --git a/fiori/app/browse/fiori-service.cds b/fiori/app/browse/fiori-service.cds index def17d31..03ff198c 100644 --- a/fiori/app/browse/fiori-service.cds +++ b/fiori/app/browse/fiori-service.cds @@ -52,9 +52,6 @@ annotate CatalogService.Books with @(UI : { }, {Value : genre.name}, {Value : price}, - { - Value : currency.symbol, - Label : ' ' - }, + {Value : currency.symbol}, ] }, ); diff --git a/fiori/app/common.cds b/fiori/app/common.cds index 1f396d8d..912fe190 100644 --- a/fiori/app/common.cds +++ b/fiori/app/common.cds @@ -4,6 +4,7 @@ using { sap.capire.bookshop as my } from '@capire/bookstore'; using { sap.common } from '@capire/common'; +using { sap.common.Currencies } from '@sap/cds/common'; //////////////////////////////////////////////////////////////////////////// // @@ -25,7 +26,7 @@ annotate my.Books with @( { Value: genre.name }, { Value: stock }, { Value: price }, - { Value: currency.symbol, Label: ' ' }, + { Value: currency.symbol }, ] } ) { @@ -37,6 +38,10 @@ annotate my.Books with @( author @ValueList.entity : 'Authors'; }; +annotate Currencies with { + symbol @Common.Label : '{i18n>Currency}'; +} + //////////////////////////////////////////////////////////////////////////// // // Books Details @@ -60,7 +65,8 @@ annotate my.Books with { author @title: '{i18n>Author}' @Common: { Text: author.name, TextArrangement: #TextOnly }; price @title: '{i18n>Price}' @Measures.ISOCurrency : currency_code; stock @title: '{i18n>Stock}'; - descr @UI.MultiLineText; + descr @title: '{i18n>Description}' @UI.MultiLineText; + image @title: '{i18n>Image}'; } //////////////////////////////////////////////////////////////////////////// From 666001d56484165879d68a224d88b6cc83015c61 Mon Sep 17 00:00:00 2001 From: Pierre Fritsch Date: Tue, 8 Nov 2022 14:28:36 +0100 Subject: [PATCH 08/15] Filter criteria: Display the Genre name (#421) Co-authored-by: Christian Georgi --- fiori/app/common.cds | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fiori/app/common.cds b/fiori/app/common.cds index 912fe190..3e5f748a 100644 --- a/fiori/app/common.cds +++ b/fiori/app/common.cds @@ -87,6 +87,10 @@ annotate my.Genres with @( } ); +annotate my.Genres with { + ID @Common.Text : name @Common.TextArrangement : #TextOnly; +} + //////////////////////////////////////////////////////////////////////////// // // Genre Details From 5ff72c3f020eb8932d402dd2f153bc3880e0c24a Mon Sep 17 00:00:00 2001 From: Pierre Fritsch Date: Tue, 8 Nov 2022 14:30:28 +0100 Subject: [PATCH 09/15] Hide `ID` and `ID_Texts` for `Books.texts` (#422) Co-authored-by: Christian Georgi --- fiori/app/admin-books/fiori-service.cds | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fiori/app/admin-books/fiori-service.cds b/fiori/app/admin-books/fiori-service.cds index d7b1cd57..668e2548 100644 --- a/fiori/app/admin-books/fiori-service.cds +++ b/fiori/app/admin-books/fiori-service.cds @@ -62,6 +62,11 @@ annotate AdminService.Books.texts with @( } ); +annotate AdminService.Books.texts with { + ID @UI.Hidden; + ID_texts @UI.Hidden; +}; + // Add Value Help for Locales annotate AdminService.Books.texts { locale @( From affd1718efb94262ebffd015bda9a6a718e85089 Mon Sep 17 00:00:00 2001 From: Pierre Fritsch Date: Tue, 8 Nov 2022 14:33:25 +0100 Subject: [PATCH 10/15] Fiori app *Manage Orders*: Hide technical UUID's (#423) * Hide Order ID * Hide Order Item ID Co-authored-by: Christian Georgi --- orders/app/fiori.cds | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/orders/app/fiori.cds b/orders/app/fiori.cds index 8e2a3ab6..e6be3547 100644 --- a/orders/app/fiori.cds +++ b/orders/app/fiori.cds @@ -65,6 +65,7 @@ annotate OrdersService.Orders with @( ) { createdAt @UI.HiddenFilter:false; createdBy @UI.HiddenFilter:false; + ID @UI.Hidden; }; @@ -90,4 +91,7 @@ annotate OrdersService.Orders.Items with @( quantity @( Common.FieldControl: #Mandatory ); + ID @UI.Hidden; + up_ @UI.Hidden; + }; From d9058f9b51199898e14631628bd706e1506b4216 Mon Sep 17 00:00:00 2001 From: Pierre Fritsch Date: Tue, 8 Nov 2022 14:38:41 +0100 Subject: [PATCH 11/15] Manage Orders: Switch to translatable texts (#424) Co-authored-by: Christian Georgi --- fiori/app/_i18n/i18n.properties | 11 +++++++++++ orders/app/fiori.cds | 32 ++++++++++++++++---------------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/fiori/app/_i18n/i18n.properties b/fiori/app/_i18n/i18n.properties index 30c91ce9..c6e0d27d 100644 --- a/fiori/app/_i18n/i18n.properties +++ b/fiori/app/_i18n/i18n.properties @@ -16,10 +16,21 @@ PlaceOfDeath = Place of Death Age = Age Lifetime = Lifetime Authors = Authors + Order = Order Orders = Orders +OrderNo = Order Number +OrderItems = Order Items +Customer = Customer +Product = Product +ProductID = Product ID +ProductTitle = Product Title +UnitPrice = Unit Price +Quantity = Quantity + Price = Price Currency = Currency +Date = Date Rating = Rating NumberOfReviews = Number of Reviews diff --git a/orders/app/fiori.cds b/orders/app/fiori.cds index e6be3547..017b806b 100644 --- a/orders/app/fiori.cds +++ b/orders/app/fiori.cds @@ -18,22 +18,22 @@ annotate OrdersService.Orders with @( UI: { SelectionFields: [ createdBy ], LineItem: [ - {Value: OrderNo, Label:'OrderNo'}, - {Value: buyer, Label:'Customer'}, - {Value: currency.symbol, Label:'Currency'}, - {Value: createdAt, Label:'Date'}, + {Value: OrderNo, Label:'{i18n>OrderNo}'}, + {Value: buyer, Label:'{i18n>Customer}'}, + {Value: currency.symbol, Label:'{i18n>Currency}'}, + {Value: createdAt, Label:'{i18n>Date}'}, ], HeaderInfo: { - TypeName: 'Order', TypeNamePlural: 'Orders', + TypeName: '{i18n>Order}', TypeNamePlural: '{i18n>Orders}', Title: { - Label: 'Order number ', //A label is possible but it is not considered on the ObjectPage yet + Label: '{i18n>OrderNo}', //A label is possible but it is not considered on the ObjectPage yet Value: OrderNo }, Description: {Value: createdBy} }, Identification: [ //Is the main field group - {Value: createdBy, Label:'Customer'}, - {Value: createdAt, Label:'Date'}, + {Value: createdBy, Label:'{i18n>Customer}'}, + {Value: createdAt, Label:'{i18n>Date}'}, {Value: OrderNo }, ], HeaderFacets: [ @@ -46,7 +46,7 @@ annotate OrdersService.Orders with @( ], FieldGroup#Details: { Data: [ - {Value: currency.code, Label:'Currency'} + {Value: currency.code, Label:'{i18n>Currency}'} ] }, FieldGroup#Created: { @@ -73,15 +73,15 @@ annotate OrdersService.Orders with @( annotate OrdersService.Orders.Items with @( UI: { LineItem: [ - {Value: product_ID, Label:'Product ID'}, - {Value: title, Label:'Product Title'}, - {Value: price, Label:'Unit Price'}, - {Value: quantity, Label:'Quantity'}, + {Value: product_ID, Label:'{i18n>ProductID}'}, + {Value: title, Label:'{i18n>ProductTitle}'}, + {Value: price, Label:'{i18n>UnitPrice}'}, + {Value: quantity, Label:'{i18n>Quantity}'}, ], Identification: [ //Is the main field group - {Value: quantity, Label:'Quantity'}, - {Value: title, Label:'Product'}, - {Value: price, Label:'Unit Price'}, + {Value: quantity, Label:'{i18n>Quantity}'}, + {Value: title, Label:'{i18n>Product}'}, + {Value: price, Label:'{i18n>UnitPrice}'}, ], Facets: [ {$Type: 'UI.ReferenceFacet', Label: '{i18n>OrderItems}', Target: '@UI.Identification'}, From 2a6fca177bac5b505f21e4a228ed73ef73baa0f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Nov 2022 13:40:10 +0000 Subject: [PATCH 12/15] Bump axios from 1.1.2 to 1.1.3 Bumps [axios](https://github.com/axios/axios) from 1.1.2 to 1.1.3. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.1.2...v1.1.3) --- updated-dependencies: - dependency-name: axios dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ed067ab8..613855dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -610,9 +610,9 @@ "dev": true }, "node_modules/axios": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.2.tgz", - "integrity": "sha512-bznQyETwElsXl2RK7HLLwb5GPpOLlycxHCtrpDR/4RqqBzjARaOTo3jz4IgtntWUYee7Ne4S8UHd92VCuzPaWA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", + "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -3424,9 +3424,9 @@ "dev": true }, "axios": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.2.tgz", - "integrity": "sha512-bznQyETwElsXl2RK7HLLwb5GPpOLlycxHCtrpDR/4RqqBzjARaOTo3jz4IgtntWUYee7Ne4S8UHd92VCuzPaWA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", + "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", "dev": true, "requires": { "follow-redirects": "^1.15.0", From e6584c4c154246f1e0bd11c7a8b45696ed10170f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Nov 2022 13:44:13 +0000 Subject: [PATCH 13/15] Bump chai from 4.3.6 to 4.3.7 Bumps [chai](https://github.com/chaijs/chai) from 4.3.6 to 4.3.7. - [Release notes](https://github.com/chaijs/chai/releases) - [Changelog](https://github.com/chaijs/chai/blob/4.x.x/History.md) - [Commits](https://github.com/chaijs/chai/compare/v4.3.6...v4.3.7) --- updated-dependencies: - dependency-name: chai dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 613855dd..2d3ab96d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -787,14 +787,14 @@ } }, "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -976,15 +976,15 @@ } }, "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz", + "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==", "dev": true, "dependencies": { "type-detect": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=6" } }, "node_modules/delayed-stream": { @@ -3568,14 +3568,14 @@ } }, "chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -3707,9 +3707,9 @@ } }, "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz", + "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==", "dev": true, "requires": { "type-detect": "^4.0.0" From d07b20a6893700fde159da54cacdd3073a5705b2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 28 Nov 2022 17:54:32 +0100 Subject: [PATCH 14/15] Added loggers sample --- .eslintrc | 1 + hello/srv/world.js | 6 ++- loggers/app/loggers.html | 76 ++++++++++++++++++++++++++++++++++++++ loggers/package.json | 22 +++++++++++ loggers/readme.md | 11 ++++++ loggers/srv/dummy.cds | 3 ++ loggers/srv/loggers.cds | 20 ++++++++++ loggers/srv/loggers.js | 56 ++++++++++++++++++++++++++++ loggers/test/requests.http | 18 +++++++++ package.json | 1 + 10 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 loggers/app/loggers.html create mode 100644 loggers/package.json create mode 100644 loggers/readme.md create mode 100644 loggers/srv/dummy.cds create mode 100644 loggers/srv/loggers.cds create mode 100644 loggers/srv/loggers.js create mode 100644 loggers/test/requests.http diff --git a/.eslintrc b/.eslintrc index 3589f2c5..abab857f 100644 --- a/.eslintrc +++ b/.eslintrc @@ -13,6 +13,7 @@ "globals": { "SELECT": true, "INSERT": true, + "UPSERT": true, "UPDATE": true, "DELETE": true, "CREATE": true, diff --git a/hello/srv/world.js b/hello/srv/world.js index ff1a370e..c5cd2495 100644 --- a/hello/srv/world.js +++ b/hello/srv/world.js @@ -1,3 +1,7 @@ module.exports = class say { - hello(req) { return `Hello ${req.data.to}!` } + hello(req) { + let {to} = req.data + if (to === 'me') to = require('os').userInfo().username + return `Hello ${to}!` + } } diff --git a/loggers/app/loggers.html b/loggers/app/loggers.html new file mode 100644 index 00000000..2d588e7b --- /dev/null +++ b/loggers/app/loggers.html @@ -0,0 +1,76 @@ + + + + + cds.log + + + + + + + +
+

Log Levels

+ + + + + + + + + + +
Module ID Log Level
{{ each.id }} +
+

Log Format:

+ [ + | + | + | + | + ] - log message ... +
+ + + + + diff --git a/loggers/package.json b/loggers/package.json new file mode 100644 index 00000000..4f76f7f2 --- /dev/null +++ b/loggers/package.json @@ -0,0 +1,22 @@ +{ + "name": "@capire/loggers", + "version": "1.0.0", + "description": "Simple sample on how to dynamically set cds.log levels and formats.", + "files": [ + "app", + "srv" + ], + "dependencies": { + "@sap/cds": ">=5.9", + "express": "^4.17.1" + }, + "scripts": { + "start": "cds run", + "watch": "cds watch" + }, + "cds": { + "requires": { + "db": "sql" + } + } +} diff --git a/loggers/readme.md b/loggers/readme.md new file mode 100644 index 00000000..c030f889 --- /dev/null +++ b/loggers/readme.md @@ -0,0 +1,11 @@ +# Dynamically Set `cds.log` Levels and Formats + +### Run + +```sh +cds watch +``` + +### Test + +Either using the UI through http://localhost:4004/loggers.html, or try the requests in `test/requests.http` diff --git a/loggers/srv/dummy.cds b/loggers/srv/dummy.cds new file mode 100644 index 00000000..7ed8e09d --- /dev/null +++ b/loggers/srv/dummy.cds @@ -0,0 +1,3 @@ +service Sue { + entity Dummy { key ID: UUID; title: String; } +} diff --git a/loggers/srv/loggers.cds b/loggers/srv/loggers.cds new file mode 100644 index 00000000..280ca33b --- /dev/null +++ b/loggers/srv/loggers.cds @@ -0,0 +1,20 @@ +@rest service LogService { + + @readonly entity Loggers : Logger {}; + entity Logger { + key id : String; + level : String; + } + + action format ( + timestamp : Boolean, + level : Boolean, + tenant : Boolean, + reqid : Boolean, + id : Boolean, + ); + + action debug (logger : String) returns Logger; + action reset (logger : String) returns Logger; + +} diff --git a/loggers/srv/loggers.js b/loggers/srv/loggers.js new file mode 100644 index 00000000..7d0473b8 --- /dev/null +++ b/loggers/srv/loggers.js @@ -0,0 +1,56 @@ +const cds = require ('@sap/cds/lib') +const LOG = cds.log('cds.log') + +module.exports = class LogService extends cds.Service { + init(){ + + this.on('GET','Loggers', (req)=>{ + let loggers = Object.values(cds.log.loggers).map (_logger) + let {$search} = req._.req.query + if ($search) { + const re = RegExp($search,'i') + loggers = loggers.filter (l => re.test(l.id) || re.test(l.level)) + } + return loggers + }) + + this.on('PUT','Logger', (req)=>{ + const {id} = req.params[0] || req.data + if (!id) return req.reject('No logger id specified in request') + return _logger (cds.log (id, req.data)) + }) + + this.on('debug', (req)=>{ + const {logger:id} = req.params[0] || req.data + if (!id) return req.reject('No logger id specified in request') + return _logger (cds.log (id, {level:'debug'})) + }) + + this.on('reset', (req)=>{ + const {logger:id} = req.params[0] || req.data + if (!id) return req.reject('No logger id specified in request') + return _logger (cds.log (id, {level:'info'})) + }) + + this.on('format', (req)=>{ + const $ = req.data; LOG.info('format:',$) + // Set format for new loggers constructed subsequently + cds.log.format = (id, level, ...args) => { + const fmt = [] + if ($.timestamp) fmt.push ('|', (new Date).toISOString()) + if ($.level) fmt.push ('|', _levels[level].padEnd(5)) + if ($.tenant) fmt.push ('|', cds.context && cds.context.tenant) + if ($.reqid) fmt.push ('|', cds.context && cds.context.id) + if ($.id) fmt.push ('|', id) + fmt[0] = '[', fmt.push ('] -', ...args) + return fmt + } + // Apply this format to all existing loggers + Object.values(cds.log.loggers).forEach (l => l.setFormat (cds.log.format)) + }) + } + +} + +const _logger = ({id,level}) => ({id, level:_levels[level] }) +const _levels = [ 'SILENT', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE' ] diff --git a/loggers/test/requests.http b/loggers/test/requests.http new file mode 100644 index 00000000..904d44bf --- /dev/null +++ b/loggers/test/requests.http @@ -0,0 +1,18 @@ +http://localhost:4004/loggers.html +@body: = Content-Type: application/json\n\n + +### +GET http://localhost:4004/log/Loggers + +### +PUT http://localhost:4004/log/Logger/sqlite +{{body:}} { "level": "debug" } + +### +POST http://localhost:4004/log/debug(logger='sqlite') + +### +POST http://localhost:4004/log/reset(logger='sqlite') + +### Dummy request to see sqlite debug output +GET http://localhost:4004/sue/Dummy diff --git a/package.json b/package.json index 1d0bd55e..f2001e6f 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "./hello", "./media", "./orders", + "./loggers", "./reviews" ], "devDependencies": { From ed1510d17325fc60a465d845e77b583df9eeaa6d Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 30 Nov 2022 17:37:51 +0100 Subject: [PATCH 15/15] sorting loggers --- loggers/srv/loggers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loggers/srv/loggers.js b/loggers/srv/loggers.js index 7d0473b8..5fcd7226 100644 --- a/loggers/srv/loggers.js +++ b/loggers/srv/loggers.js @@ -11,7 +11,7 @@ module.exports = class LogService extends cds.Service { const re = RegExp($search,'i') loggers = loggers.filter (l => re.test(l.id) || re.test(l.level)) } - return loggers + return loggers.sort ((a,b) => a.id < b.id ? -1 : 1) }) this.on('PUT','Logger', (req)=>{