From 9c32654d038a288540846d92cf6fba77a5b771e6 Mon Sep 17 00:00:00 2001 From: Luca Maltagliati Date: Wed, 30 Oct 2024 13:03:54 +0100 Subject: [PATCH 01/17] fix: Custom Resources slug pointed to wrong page (#1755) --- docs/development_suite/monitoring/resources/custom-resources.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/development_suite/monitoring/resources/custom-resources.md b/docs/development_suite/monitoring/resources/custom-resources.md index ffaa3aec6d..7c30e4467e 100644 --- a/docs/development_suite/monitoring/resources/custom-resources.md +++ b/docs/development_suite/monitoring/resources/custom-resources.md @@ -2,7 +2,7 @@ id: custom-resources title: Monitor your Custom Kubernetes Resources sidebar_label: Monitor your Custom Kubernetes Resources -slug: "/development_suite/monitoring/resources/jobs" +slug: "/development_suite/monitoring/resources/custom-resources" --- From 286d599b3f42522c172dfe45a3b6573131bf14c2 Mon Sep 17 00:00:00 2001 From: epessina Date: Mon, 4 Nov 2024 17:13:07 +0100 Subject: [PATCH 02/17] Added documentation on components explorer --- .../external-components/bundling.md | 14 ++-- .../external-components/manifest.md | 76 +++++++------------ .../external-components/overview.md | 68 +++++++++++------ 3 files changed, 80 insertions(+), 78 deletions(-) diff --git a/docs/microfrontend-composer/external-components/bundling.md b/docs/microfrontend-composer/external-components/bundling.md index 7ba927ab42..533f11f3d7 100644 --- a/docs/microfrontend-composer/external-components/bundling.md +++ b/docs/microfrontend-composer/external-components/bundling.md @@ -1,13 +1,13 @@ --- id: bundling -title: Bundling your webcomponents with vite +title: Bundling your Web Components with vite sidebar_label: Bundling sidebar_position: 30 --- -The aim of this section is to highlight some features we found useful to bundle webcomponents together. +The aim of this section is to highlight some features we found useful to bundle Web Components together. -Let's say we have a bunch of webcomponents such as +Let's say we have a bunch of Web Components such as ```text ├── my-button @@ -23,7 +23,7 @@ Let's say we have a bunch of webcomponents such as | ``` -The most important thing to remember is that webcomponent definitions must appear once and they must not repeat themself even accidentally (the bundler might mess up with the tree of dependencies). +The most important thing to remember is that Web Component definitions must appear once and they must not repeat themself even accidentally (the bundler might mess up with the tree of dependencies). Another point of attention must be the desired output: whether the library will be consumed by browsers only or could be made available to Node.js environments as development resource, say by publishing an npm library. @@ -109,11 +109,11 @@ export default defineConfig({ }) ``` -Be aware that runtime loading of webcomponents is a key factor here. The browser `window` won't be able to follow dynamic imports in order to wait page `onload` event, which means that loading multiple webcomponents from different bundles might make them appear at different times. A consistent visualization is instead guaranteed when the components are loaded together, at least to a further degree. +Be aware that runtime loading of Web Components is a key factor here. The browser `window` won't be able to follow dynamic imports in order to wait page `onload` event, which means that loading multiple Web Components from different bundles might make them appear at different times. A consistent visualization is instead guaranteed when the components are loaded together, at least to a further degree. -This remark does not rule out separate bundles. For instance `micro-lc` is bundled separately with respect to its loading webcomponent, which by default shows spinning hexagons until `micro-lc` fires an `onload` event. `mlc-loading-animation` loads first and is safe to assume won't need `micro-lc` to be loaded to start its work. +This remark does not rule out separate bundles. For instance `micro-lc` is bundled separately with respect to its loading Web Component, which by default shows spinning hexagons until `micro-lc` fires an `onload` event. `mlc-loading-animation` loads first and is safe to assume won't need `micro-lc` to be loaded to start its work. -A components library providing buttons, tables, forms, is definitively an example of a set of webcomponents which must be bundled together: +A components library providing buttons, tables, forms, is definitively an example of a set of Web Components which must be bundled together: 1. they load together avoiding weird flashes 2. they reuse chunks of code like stylesheets diff --git a/docs/microfrontend-composer/external-components/manifest.md b/docs/microfrontend-composer/external-components/manifest.md index 126e847591..b2a1d92561 100644 --- a/docs/microfrontend-composer/external-components/manifest.md +++ b/docs/microfrontend-composer/external-components/manifest.md @@ -1,42 +1,31 @@ --- id: manifest -title: The Webcomponent Manifest +title: The Web Component Manifest sidebar_label: Manifest sidebar_position: 20 --- -Any webcomponent is or aims to be: +Any Web Component is or aims to be: 1. an HTML tag 2. a CSS encapsulated environment 3. a JS business logic unit -As HTML tag, a custom webcomponent has `attributes` and `properties`. Moreover a pair `attribute` and `property` can be coupled by reflecting changes: a change on the former is mirrored on the latter, and viceversa. +As HTML tag, a custom Web Component has `attributes` and `properties`. Moreover a pair `attribute` and `property` can be coupled by reflecting changes: a change on the former is mirrored on the latter, and viceversa. ## Basics -The Configurator layout section queries the webcomponents to discover their properties/attributes using a static getter promise called a _Manifest_. +The Configurator layout section queries the Web Components to discover their metadata and their properties/attributes using a static getter promise called a _Manifest_. + +The `__manifest` static getter must return a JavaScript object containing information on the component metadata, properties and attributes, and API mocks. :::tip -You can use the [JSON schema](https://raw.githubusercontent.com/micro-lc/compose-toolkit/main/schemas/manifest.schema.json) to check your components manifests. +You can use the [JSON schema](https://raw.githubusercontent.com/micro-lc/compose-toolkit/main/schemas/manifest.schema.json) to get information on the supported properties and to check your components manifests. ::: -The `__manifest` static getter must return a JavaScript object that has a key `type` which must be `object` (to be JSON schema compatible) and a map of `properties`. - -```typescript -const manifest = { - type: 'object', - properties: { - // list of properties - } -} -``` - -A custom button might look like: - -```typescript -// my-button.ts +As an example, consider the following custom button component +```typescript title=my-button.ts import { LitElement } from 'lit' class MyButton extends LitElement { @@ -48,14 +37,13 @@ class MyButton extends LitElement { } ``` -and thus will instruct the Configurator preview section with the following manifest +The component exposes the static getter `__manifest` thus instructing the Configurator preview section with the following manifest -```typescript -// manifest.ts +```typescript title=manifest.ts import type { Manifest } from '@micro-lc/compose-toolkit' const manifest = { - type: 'object', + label: 'My awesome button', properties: { hidden: { type: 'boolean' @@ -66,9 +54,11 @@ const manifest = { export default manifest ``` -In the outlined example, the Configurator layout section will provide its configuration form with a boolean toggle for the `hidden` property. +## Attribute and properties + +The component attributes and properties can be described using the `properties` key of the manifest, which should be an object mapping the component properties to a JSON schema. -Types can be **almost** anything that JSON schema provides: +Properties types can be **almost** anything that JSON schema provides: 1. `boolean` 2. `string` @@ -85,13 +75,11 @@ Complex properties such as objects and arrays are also handled in a `no-code` fa The most basic visualization for an `object` without a schema is an IDE-like editor, with basic JSON validation capabilities. Likewise an array has a `no-code` item selector, which again, without schema will spawn an IDE-like editor for each one of its items. -The owner/developer of custom webcomponents can enforce `no-code` configurability by nesting the component manifest. +The owner/developer of custom Web Components can enforce `no-code` configurability by nesting the component manifest. For instance: -```typescript -// my-button.ts - +```typescript title=my-button.ts import { LitElement } from 'lit' interface Action { @@ -110,12 +98,10 @@ class MyButton extends LitElement { can be described by the following manifest -```typescript -// manifest.ts +```typescript title=manifest.ts import type { Manifest } from '@micro-lc/compose-toolkit' const manifest: Manifest = { - type: 'object', properties: { action: { type: 'object', @@ -132,17 +118,15 @@ export default manifest Despite the `action` being an object, the Configurator layout section will spawn a modal (which can have potentially infinite levels of nesting) to configure `type` as a string with at most 2 fixed values and `url` as a string. -## Mia's Configuration Advanced +### Mia's Configuration Advanced -The Webcomponent manifest is a superset of a compliant draft-07 JSON schema. The Configurator guarantees to display a `no-code` comfortable version of each property. +The Web Component manifest is a superset of a compliant draft-07 JSON schema. The Configurator guarantees to display a `no-code` comfortable version of each property. -Beside this specification, Configurator can enforce some extra logic using a special property, available to any webcomponent property or nested property: `__mia_configuration`. +Beside this specification, Configurator can enforce some extra logic using a special property, available to any Web Component property or nested property: `__mia_configuration`. Let's consider a custom button -```typescript -// my-button.ts - +```typescript title=my-button.ts import { LitElement } from 'lit' class MyButton extends LitElement { @@ -156,12 +140,10 @@ class MyButton extends LitElement { with manifest -```typescript -// manifest.ts +```typescript title=manifest.ts import type { Manifest } from '@micro-lc/compose-toolkit' const manifest = { - type: 'object', properties: { hidden: { type: 'boolean' @@ -231,16 +213,14 @@ export interface MiaConfiguration { } ``` -### The `oneOfGuard` key +#### The `oneOfGuard` key Suppose your property is a JSON `oneOf` an there's a guard key which allows to distinguish non-overlapping types. For instance: -```typescript -// manifest.ts +```typescript title=manifest.ts import type { Manifest } from '@micro-lc/compose-toolkit' const manifest = { - type: 'object', properties: { action: { type: 'object', @@ -273,7 +253,7 @@ By using `oneOfGuard` set to `type` Configurator layout section is able to provi If the user selects `http-post` then 2 string input will appear in order to configure `url` and `payload`, otherwise an IDE-like editor will allow to type directly the `payload` property since no schema was provided. -### The `schema-hint` key +#### The `schema-hint` key Configurator provides some types that are well known and often used in order to avoid writing down a repeating JSON schema multiple times. @@ -290,7 +270,7 @@ Configurator provides some types that are well known and often used in order to projection, or a Fast Data Single View. 10. A `micro-lc/applications` is the list of currently configured applications in the Configurator initial section. -### The `shared-key` key +#### The `shared-key` key JSON schema supports referencing of property definitions. Despite not being a fixed pattern there's a recommendation for draft-07 which suggests to use the key `definitions` at the first level of your JSON configuration. In the most recent drafts it will be substituted by the `$defs` keyword. diff --git a/docs/microfrontend-composer/external-components/overview.md b/docs/microfrontend-composer/external-components/overview.md index 82af3de709..91a80b0de6 100644 --- a/docs/microfrontend-composer/external-components/overview.md +++ b/docs/microfrontend-composer/external-components/overview.md @@ -5,7 +5,7 @@ sidebar_label: Overview sidebar_position: 10 --- -The Configurator layout/advanced sections provide tools to visualize [composable pages](/microfrontend-composer/composer/20_compose_pages.md) which are made of webcomponents. For instance, the Configurator [main layout](/microfrontend-composer/composer/10_structure.md#layout) is a web page build with webcomponents. +The Configurator layout/advanced sections provide tools to visualize [composable pages](/microfrontend-composer/composer/20_compose_pages.md) which are made of Web Components. For instance, the Configurator [main layout](/microfrontend-composer/composer/10_structure.md#layout) is a web page build with Web Components. Components usually are provided by JavaScript libraries like: @@ -22,7 +22,7 @@ The `sources` field has its own [JSON schema](https://raw.githubusercontent.com/ for further references, check out the [micro-lc documentation](https://micro-lc.io/docs/guides/applications/compose#plugin-configuration) on composable page `sources`. -The only limitation, left to the user to check, is not to define the same webcomponent twice or more from different libraries. This might happen when different composable pages have different versions of the same library. The Configurator will not complain but errors might arise when the final website is deployed. +The only limitation, left to the user to check, is not to define the same Web Component twice or more from different libraries. This might happen when different composable pages have different versions of the same library. The Configurator will not complain but errors might arise when the final website is deployed. The default configuration of the Configurator section, once the [application](/runtime_suite_applications/microfrontend-composer-toolkit/10_overview.md) is added to your Console project, on the branch you're currently working on, is preset to use the components library [@micro-lc/bk-web-components](https://www.jsdelivr.com/package/npm/@micro-lc/bk-web-components), which is well-suited to visualize data through tables, cards and galleries. @@ -153,21 +153,21 @@ The following actions need to be addressed: ## No/Low-code Components Configuration -```tip -To view your external components, you may need to [configure](/microfrontend-composer/composer/30_configurator_settings.md#source-maps) the correct reverse proxying in the Configurator Service Worker . -``` +:::tip +To view your external components, you may need to [configure](/microfrontend-composer/composer/30_configurator_settings.md#source-maps) the correct reverse proxying in the Configurator Service Worker. +::: -Any HTML tag (native or custom) is eligible to be configured in the `low-code` configuration section, which is label by the tab `Advanced`. +Any HTML tag (native or custom) is eligible to be configured in the `low-code` configuration section, which is label by the tab _Advanced_. -Any custom webcomponent must be defined in at most one of the `sources` entries to be displayed in the preview otherwise it will not render anything beside an empty tag. +Any custom Web Component must be defined in at most one of the `sources` entries to be displayed in the preview otherwise it will not render anything beside an empty tag. -The absence of a custom webcomponent definition does not break the preview of a compose page, but somewhat limits the user experience of the whole section. +The absence of a custom Web Component definition does not break the preview of a compose page, but somewhat limits the user experience of the whole section. -Any `low-code` configuration can be performed in the `Advanced` section in the form of plain JSON editing. Such editing is guided by the basic schema of a [compose page](https://github.com/micro-lc/micro-lc/blob/main/packages/interfaces/schemas/v2/plugin.schema.json), and is embedded in the editing IDE of the `Advanced` section. +Any `low-code` configuration can be performed in the _Advanced_ section in the form of plain JSON editing. Such editing is guided by the basic schema of a [compose page](https://github.com/micro-lc/micro-lc/blob/main/packages/interfaces/schemas/v2/plugin.schema.json), and is embedded in the editing IDE of the _Advanced_ section. -`no-code` section, labelled by the tab `Layout` is aware of any defined custom webcomponent. To configure a webcomponent using the `no-code` section, the component itself must provide a dynamically imported manifest which describe itself to the configurator and allows the spawning of forms and modals apt to the task of filling webcomponent properties according to the proper type and schema validation. +The `no-code` section, labelled by the tab _Layout_, is aware of any defined custom Web Component. To configure a Web Component using the `no-code` section, the component itself must provide a dynamically imported manifest which describe itself to the configurator and allows the spawning of forms and modals apt to the task of filling Web Component properties according to the proper type and schema validation. -There are different layers of integration for custom webcomponents with the `no-code` Configurator section: +There are different layers of integration for custom Web Components with the `no-code` Configurator section: 1. editing properties using forms and modals 2. open/show when selected on the [left components list](/microfrontend-composer/composer/10_structure.md#layout) @@ -175,7 +175,7 @@ There are different layers of integration for custom webcomponents with the `no- ### No-Code Properties Editing: `__manifest` -A webcomponent must explain to the configurator how it can be configured. Roughly any webcomponent scaffolding looks like: +A Web Component must explain to the configurator how it can be configured. Roughly any Web Component scaffolding looks like: ```typescript class MyCustomComponent extends HTMLElement { @@ -185,7 +185,7 @@ class MyCustomComponent extends HTMLElement { } ``` -A webcomponent which exposes a static getter `__manifest` as per the following snippet: +A Web Component which exposes a static getter `__manifest` as per the following snippet: ```typescript import type { Manifest } from '@micro-lc/compose-toolkit' @@ -208,21 +208,21 @@ static get __manifest(): Promise { } ``` -The **manifest** file, after JSON-stringify process, must validate an [extension](https://raw.githubusercontent.com/micro-lc/compose-toolkit/main/schemas/template.schema.json) of a draft-07 [JSON schema](https://json-schema.org) where the `type` is always `object` and the field `properties` is an object listing the configurable properties of the custom webcomponent. +The **manifest** file, after JSON-stringify process, must validate an [extension](https://raw.githubusercontent.com/micro-lc/compose-toolkit/main/schemas/template.schema.json) of a draft-07 [JSON schema](https://json-schema.org) where the `type` is always `object` and the field `properties` is an object listing the configurable properties of the custom Web Component. -Any object property has also a _special_ key `__mia_configuration` which allows to customize labels in the Configurator `Layout` section. The `__mia_configuration` key is not mandatory and does not affect the no-code configuration features on custom webcomponents. +Any object property has also a _special_ key `__mia_configuration` which allows to customize labels in the Configurator _Layout_ section. The `__mia_configuration` key is not mandatory and does not affect the no-code configuration features on custom Web Components. -Check out [the webcomponent manifest](/microfrontend-composer/external-components/manifest.md) for further details. +Check out [the Web Component manifest](/microfrontend-composer/external-components/manifest.md) for further details. ### Open/Show On Select: `__focus_handler`, `__unfocus_handler` -When a custom webcomponent has an open/close, hidden/shown behavior, like a modal or a collapsible drawer, the Configurator previews must be informed on how to make such item to appear and disappear. Considering the case of a modal, its initial state could be `closed`. A user interaction is often required to trigger its opening. +When a custom Web Component has an open/close, hidden/shown behavior, like a modal or a collapsible drawer, the Configurator previews must be informed on how to make such item to appear and disappear. Considering the case of a modal, its initial state could be `closed`. A user interaction is often required to trigger its opening. -When clicking the webcomponent label on the left menu list corresponding to the modal, the presence of a `__focus_handler` function allows to mock the user action needed to open the component real context. +When clicking the Web Component label on the left menu list corresponding to the modal, the presence of a `__focus_handler` function allows to mock the user action needed to open the component real context. Once left menu selection is over, an `__unfocus_handler` is called to perform cleanup operations. -The webcomponent must implement the following interface: +The Web Component must implement the following interface: ```typescript @@ -242,9 +242,31 @@ class MyCustomComponent extends HTMLElement implements FocusableComponent { ``` +### List custom components in Components Explorer + +The [Components Explorer](/microfrontend-composer/composer/10_structure.md#components-explorer) section of the configurator is instructed to try and list all the Web Components libraries that appear in the Composer `sources`. + +For a library to be visualized in the explorer, its entry point has to declare a **default export** with the following type: + +```typescript +type LibraryMeta = { + /** Name of the library */ + libraryName: string + + /** List of the library Web Component tags */ + components: string[] +} +``` + +:::tip +If you are bundling your library with Vite, make sure to set the property `build.rollupOptions.preserveEntrySignatures` to `allow-extension` in your Vite config file. +::: + +The explorer will list all the components in library meta and will show for each of them information taken from their [manifests](/microfrontend-composer/external-components/manifest.md) (if present). + ## Bundling -As previously mentioned, webcomponents are served to the Configurator via library bundles. The recommended way to proceed is: +As previously mentioned, Web Components are served to the Configurator via library bundles. The recommended way to proceed is: 1. either an ESM bundle @@ -252,11 +274,11 @@ As previously mentioned, webcomponents are served to the Configurator via librar Due to the nature of [manifests](/microfrontend-composer/external-components/manifest.md) and their retrieval dynamic policy, the ESM option is more than recommended. -Webcomponents can be build with any library (lit, stencil, and so on...) or going fully native. Examples with `lit` are provided [`@micro-lc/layout`](https://github.com/@micro-lc/layout) library while `micro-lc` [itself](https://github.com/micro-lc/micro-lc/main/packages/orchestrator/src/web-component/micro-lc.ts) is an example of a native webcomponent. +Web Components can be build with any library (lit, stencil, and so on...) or going fully native. Examples with `lit` are provided [`@micro-lc/layout`](https://github.com/@micro-lc/layout) library while `micro-lc` [itself](https://github.com/micro-lc/micro-lc/main/packages/orchestrator/src/web-component/micro-lc.ts) is an example of a native Web Component. -`vite` turned out to be very natural and comfortable tool to bundle and inspect webcomponents by embedding them in a test html page. The bundler, which is `rollup` provides the capabilities to: +`vite` turned out to be very natural and comfortable tool to bundle and inspect Web Components by embedding them in a test html page. The bundler, which is `rollup` provides the capabilities to: -1. select which sources to use as entry points. For instance, webcomponents can be bundled separately or all together in a unique bundle. Your use case is the only reference on whether to go the former or the latter way; +1. select which sources to use as entry points. For instance, Web Components can be bundled separately or all together in a unique bundle. Your use case is the only reference on whether to go the former or the latter way; 2. separate external sources, like manifests; 3. add external assets like images, fonts and so on... From ff38902116abd857d93789dffa9cf8ce60dd0859 Mon Sep 17 00:00:00 2001 From: Bot-targa Date: Tue, 5 Nov 2024 18:14:47 +0100 Subject: [PATCH 03/17] chore(docs): update Teleconsultation Service Frontend documentation (#1744) * chore(docs): update Teleconsultation Service Frontend documentation * chore(docs): update Teleconsultation Service Frontend documentation * chore(docs): update Teleconsultation Service Frontend documentation * chore(docs): update Teleconsultation Service Frontend documentation * chore(docs): update Teleconsultation Service Frontend documentation * chore(docs): update Teleconsultation Service Frontend documentation * chore(docs): update Teleconsultation Service Frontend documentation * chore(docs): update Teleconsultation Service Frontend documentation --- .../teleconsultation-service-frontend/changelog.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/runtime_suite/teleconsultation-service-frontend/changelog.md b/docs/runtime_suite/teleconsultation-service-frontend/changelog.md index 4297189cf9..cdc49fae6f 100644 --- a/docs/runtime_suite/teleconsultation-service-frontend/changelog.md +++ b/docs/runtime_suite/teleconsultation-service-frontend/changelog.md @@ -15,6 +15,15 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 2.0.1 2024-10-29 + +- Fixed restart call button copy and style +- Fixed CSP configuration + +## 2.0.0 2024-10-15 + +- Upgrade dependencies and CI/CD pipeline + ## 1.5.1 2024-03-13 - Added spanish locale From a487949d5ffb3926880a0d12dc8cfddb4354a4f1 Mon Sep 17 00:00:00 2001 From: Bot-targa Date: Tue, 5 Nov 2024 18:27:11 +0100 Subject: [PATCH 04/17] chore(docs): update Messaging Service documentation (#1747) * chore(docs): update Messaging Service documentation * chore(docs): update Messaging Service documentation * chore(docs): update Messaging Service documentation * chore(docs): update Messaging Service documentation * chore(docs): update Messaging Service documentation * chore(docs): update Messaging Service documentation * chore(docs): update Messaging Service documentation --- docs/runtime_suite/messaging-service/changelog.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/runtime_suite/messaging-service/changelog.md b/docs/runtime_suite/messaging-service/changelog.md index b1b9c5e844..46953ef3a0 100644 --- a/docs/runtime_suite/messaging-service/changelog.md +++ b/docs/runtime_suite/messaging-service/changelog.md @@ -15,6 +15,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.7.1] 2024-10-25 + +### Fixed + +- Replace newline escape sequences (`\n`, `\n\r`, `\r` and `\r\n`) with `
` tag in HTML email messages + ## [1.7.0] 2024-05-23 - Update Node.js to v20 (LTS) From ad42c0a88a62140503fc7b32cd144bc01576c772 Mon Sep 17 00:00:00 2001 From: Bot-targa Date: Tue, 5 Nov 2024 18:29:36 +0100 Subject: [PATCH 05/17] chore(docs): update Notification Manager Service documentation (#1753) * chore(docs): update Notification Manager Service documentation * chore(docs): update Notification Manager Service documentation * chore(docs): update Notification Manager Service documentation * chore(docs): update Notification Manager Service documentation * chore(docs): update Notification Manager Service documentation --- .../10_overview.md | 9 ++ .../20_configuration.md | 92 ++++++++++- .../notification-manager-service/30_usage.md | 152 +++++++----------- .../notification-manager-service/changelog.md | 17 ++ 4 files changed, 172 insertions(+), 98 deletions(-) diff --git a/docs/runtime_suite/notification-manager-service/10_overview.md b/docs/runtime_suite/notification-manager-service/10_overview.md index d0fd981365..3f08f5ace4 100644 --- a/docs/runtime_suite/notification-manager-service/10_overview.md +++ b/docs/runtime_suite/notification-manager-service/10_overview.md @@ -119,6 +119,15 @@ If you need to customize the requests sent to the external services, you should ::: +## Providers + +| Provider | Email | SMS | Push Notifications | Voice calls | WhatsApp messages | +|------------|-------|-----|--------------------|-------------|-------------------| +| Amazon SES | ✓ | | | | | +| Firebase | | | ✓ | | | +| Kaleyra | | ✓ | | ✓ | ✓ | +| Twilio | | ✓ | | | | + ## Channels Each channel has external dependencies, including other Mia-Platform plugins, service providers accounts and specific fields on the message templates and users CRUD collections. diff --git a/docs/runtime_suite/notification-manager-service/20_configuration.md b/docs/runtime_suite/notification-manager-service/20_configuration.md index 35c1603b76..0d0737d5a7 100644 --- a/docs/runtime_suite/notification-manager-service/20_configuration.md +++ b/docs/runtime_suite/notification-manager-service/20_configuration.md @@ -345,6 +345,85 @@ The properties used by the service are the following. | emitters | `Array of string` | No | List of emitters that should trigger the sending of notifications. | | reminders | `Array of string` | No | List of reminders to set, expressed as [ISO 8601 duration][iso-8601-duration] strings (for example, `P1D` for one day and `PT1H` for an hour before). | +## Views + +### Notification messages view + +:::info + +This view is required by the following endpoints and must be enabled explicitly by setting the [`NOTIFICATIONS_MESSAGES_VIEW_NAME` environment variable][environment-variables]: + +- [GET /notification-messages/count][get-notification-messages-count] +- [GET /notification-messages/][get-notification-messages] + +By default, the view is not enabled and these endpoints are not available. + +::: + +This [MongoDB view][mongodb-view] runs an aggregation pipeline on the [notifications CRUD collection][crud-notifications] to return a distinct document for each message sent, i.e. each element in the notification `messages` array field. + +The MongoDB view must have the properties listed in the following table. + +| Name | Type | Required | Description | +|----------------|----------|----------|------------------------------------------------------------------------| +| notificationId | `String` | No | CRUD _id of the notification. | +| recipient | `String` | No | ID of the user the message was sent to. | +| event | `String` | No | The name of the event. | +| date | `Date` | No | When the message was sent. | +| status | `String` | No | If the message was processed correctly (`SUCCESS`) or not (`FAILURE`). | +| channel | `String` | No | Name of the channel the message was sent on. | +| templateName | `String` | No | Name of the template used to send the message on the channel. | +| message | `Object` | No | The details about the message sent (title, subtitle, body, etc.) | + +This is the aggregation pipeline, that you can customize for example by adding additional fields. + +```json +[ + { + "$match": { + "__STATE__": "PUBLIC" + } + }, + { + "$unwind": { + "path": "$messages" + } + }, + { + "$project": { + "_id": { + "$concat": [ + { + "$toString": "$_id" + }, + "-", + "$messages.channel", + "-", + "$messages.templateName" + ] + }, + "creatorId": "$creatorId", + "createdAt": "$createdAt", + "updaterId": "$updaterId", + "updatedAt": "$updatedAt", + "__STATE__": "$__STATE__", + "notificationId": { + "$toString": "$_id" + }, + "recipient": "$recipient", + "event": "$event.name", + "date": "$createdAt", + "status": "$messages.status", + "channel": "$messages.channel", + "templateName": "$messages.templateName", + "message": "$messages.service.message" + } + } +] +``` + +The `_id` field is computed dinamically based on the notification `_id` and is unique across all messages. + ## Environment variables :::info @@ -385,6 +464,7 @@ If `USERS_API_ENDPOINT` is not set, the users data is retrieved as in previous v | **EVENTS_SETTINGS_CRUD_NAME** | Yes | - | * | Name of the CRUD collection containing event settings. | | **NOTIFICATIONS_CRUD_NAME** | Yes | - | * | Name of the CRUD collection containing statistics about notifications sent. | | **NOTIFICATIONS_SETTINGS_CRUD_NAME** | Yes | - | * | Name of the CRUD collection containing the notifications settings. | +| **NOTIFICATIONS_MESSAGES_VIEW_NAME** | No | - | >= 2.4.0 | Name of the MongoDB view containing the notification messages. | | **MAIL_SERVICE_URL** | Email notifications | - | * | URL of the SES Mail Notification Service. Required if you want to send e-mails. | | **SMS_SERVICE_URL** | SMS notifications | - | * | URL of the SMS Service. Required if you want to send SMS. | | **FILE_SERVICE_URL** | Email attachments | - | * | URL of the File Service. Required if you want to send emails with attachments. | @@ -392,11 +472,11 @@ If `USERS_API_ENDPOINT` is not set, the users data is retrieved as in previous v | **KAFKA_CLIENT_ID** | Push notifications | - | * | Required if you want to send push notifications. | | **KAFKA_BROKERS** | Push notifications | - | * | List of comma separated brokers address. Required if you want to send push notifications. | | **KAFKA_TOPICS** | Push notifications | - | * | List of comma separated topics. Required if you want to send push notifications. | -| **KAFKA_AUTH_MECHANISM** | Push notifications | - | * | Authentication mechanism, used only if `KAFKA_USERNAME` and `KAFKA_PASSWORD` have a value. Defaults to `PLAIN`. | +| **KAFKA_AUTH_MECHANISM** | Push notifications | PLAIN | * | Authentication mechanism, used only if `KAFKA_USERNAME` and `KAFKA_PASSWORD` have a value. | | **KAFKA_USERNAME** | Push notifications | - | * | | | **KAFKA_PASSWORD** | Push notifications | - | * | | -| **KAFKA_CONNECTION_TIMEOUT** | Push notifications | - | * | Time in milliseconds to wait for a successful connection. Defaults to 1000. | -| **KAFKA_AUTHENTICATION_TIMEOUT** | Push notifications | - | * | Time in milliseconds to wait for a successful authentication. Defaults to 1000. | +| **KAFKA_CONNECTION_TIMEOUT** | Push notifications | 1000 | * | Time in milliseconds to wait for a successful connection. | +| **KAFKA_AUTHENTICATION_TIMEOUT** | Push notifications | 1000 | * | Time in milliseconds to wait for a successful authentication. | | **KAFKA_EVENTS_TOPIC_NAME** | No | - | * | Name of the Kafka topic for incoming events. If not set, automatic notifications via Kafka are disabled. | | **KAFKA_ERRORS_TOPIC_NAME** | No | - | * | Name of the Kafka topic for unknown events. If not set, automatic notifications via Kafka are disabled. | | **KAFKA_CONSUMER_GROUP** | No | - | * | Name of the Kafka consumer group for Kafka topic for incoming events. | @@ -406,7 +486,7 @@ If `USERS_API_ENDPOINT` is not set, the users data is retrieved as in previous v | **CUSTOM_HANDLERS_FOLDER** | Custom handlers | - | * | The path to the directory containing the definitions (i.e. the configmaps) of the custom handlers. | | **GOOGLE_APPLICATION_CREDENTIALS** | Push notifications | - | >= 2.2.0 | The application credentials given by Firebase. Must be loaded from a [secret][service-secrets]. | | **DEFAULT_LOCALE** | No | - | >= 2.3.0 | A [BCP 47 language tag][bcp-47-language-tag] used as default locale by [`toLocale` custom helper][message-interpolation] in message templates. | -| **USERS_API_ENDPOINT** | No | - | >= 2.3.0 | The url of the API queried to fetch users data. | +| **USERS_API_ENDPOINT** | No | - | >= 2.3.0 | The url of the API queried to fetch users data. | ## Channels configuration @@ -817,6 +897,7 @@ The following default reminder event handlers both filter the notification setti [rond]: https://rond-authz.io/ [twilio-invalid-number]: https://www.twilio.com/docs/api/errors/21212 +[mongodb-view]: /development_suite/api-console/api-design/mongo_views.md [appointment-manager]: /runtime_suite/appointment-manager/10_overview.md [files-service]: /runtime_suite/files-service/configuration.mdx [localized-strings]: /microfrontend-composer/back-kit/40_core_concepts.md @@ -829,6 +910,7 @@ The following default reminder event handlers both filter the notification setti [crud-events]: #events-crud [crud-events-settings]: #event-settings-crud [crud-notification-settings]: #notification-settings-crud +[crud-notifications]: #notifications-crud [crud-users]: #users-crud [environment-variables]: #environment-variables [service-configuration]: #service-configuration @@ -840,3 +922,5 @@ The following default reminder event handlers both filter the notification setti [patch-event-settings]: ./30_usage.md#patch-event-settingsid [post-event-settings]: ./30_usage.md#post-event-settings [delete-event-settings]: ./30_usage.md#delete-event-settingsid +[get-notification-messages-count]: ./30_usage.md#get-notification-messagescount +[get-notification-messages]: ./30_usage.md#get-notification-messages diff --git a/docs/runtime_suite/notification-manager-service/30_usage.md b/docs/runtime_suite/notification-manager-service/30_usage.md index 6937e22c9e..0748ea04a5 100644 --- a/docs/runtime_suite/notification-manager-service/30_usage.md +++ b/docs/runtime_suite/notification-manager-service/30_usage.md @@ -618,121 +618,79 @@ Please check the CHANGELOG before upgrading. :::info +**v2.4.0**. This endpoint requires the [Notification Messages MongoDB view][notification-messages-mongodb-view]. + +::: + +:::info + **v2.3.0**. This endpoint is available only since v2.3.0. ::: -This endpoint is a proxy to the `GET /notifications` endpoint of the [templates CRUD][crud-templates], and it returns the messages of the queried notifications. See [notifications CRUD][crud-notification] and [messages CRUD][crud-notification-messages]. +This endpoint is a proxy to the `GET /` of [Notification Messages MongoDB view][notification-messages-mongodb-view] and returns the messages matching the given query. -If the queried notifications look like these: +Given a notification like this: ```json -[ - { - "_id": "663ccd65dee93b2a6a6885d1", - "event": { - "_id": "663ccd63dee93b2a6a6885d0", - "name": "Update appointment", - "payload": { - "recipient": "663ccce5dee93b2a6a6885ty", - "templateName": "update-appointment" - }, - "source": { - "channel": "http", - "requestId": "6e4ddc4eda4ce1f422b285a80da3128a" - }, - "status": "RECEIVED" +{ + "_id": "663ccd65dee93b2a6a6885d1", + "event": "Update appointment"{ + "_id": "663ccd63dee93b2a6a6885d0", + "name": , + "payload": { + "recipient": "663ccce5dee93b2a6a6885ty", + "templateName": "update-appointment" }, - "recipient": "663ccce5dee93b2a6a6885ty", - "messages": [ - { - "channel": "email", - "templateName": "new-appointment", - "status": "SUCCESS" - }, - { - "channel": "sms", - "templateName": "new-appointment", - "status": "FAILED" - } - ] + "source": { + "channel": "http", + "requestId": "6e4ddc4eda4ce1f422b285a80da3128a" + }, + "status": "RECEIVED" }, - { - "_id": "812rcd65dee93b2a6a9845z98", - "event": { - "_id": "758acd63dee93b2a6a68125a", - "name": "New appointment", - "payload": { - "recipient": "recipient-2", - "templateName": "new-appointment" - }, - "source": { - "channel": "http", - "requestId": "6e4ddc4eda4ce1f422b285a80da3128a" - }, - "status": "RECEIVED" + "recipient": "663ccce5dee93b2a6a6885ty", + "messages": [ + { + "channel": "email", + "templateName": "new-appointment", + "status": "SUCCESS" }, - "recipient": "675cdse5dee93b2a6a64565rf", - "messages": [ - { - "channel": "email", - "templateName": "new-appointment", - "status": "SUCCESS" - } - ] - } -] - + { + "channel": "sms", + "templateName": "new-appointment", + "status": "FAILED" + } + ] +} ``` -the response with the messages looks like the following: +the following messages would be returned: ```json [ { - "_id": "663ccd65dee93b2a6a6885d1-m1", - "event": { - "_id": "663ccd63dee93b2a6a6885d0", - "name": "Update appointment", - "payload": {}, - "source": {} - }, + "_id": "663ccd65dee93b2a6a6885d1-fea80f2db003d4ebc4536023814aa885", + "event": "Update appointment", "recipient": "663ccce5dee93b2a6a6885ty", - "message": { - "channel": "email", - "templateName": "new-appointment", - "status": "SUCCESS" - } + "channel": "email", + "templateName": "new-appointment", + "status": "SUCCESS" }, { - "_id": "663ccd65dee93b2a6a6885d1-m2", - "event": { - "_id": "663ccd63dee93b2a6a6885d0", - "name": "Update appointment", - "payload": {}, - "source": {} - }, + "_id": "663ccd65dee93b2a6a6885d1-0956d2fbd5d5c29844a4d21ed2f76e0c", + "event": "Update appointment", "recipient": "663ccce5dee93b2a6a6885ty", - "message": { - "channel": "sms", - "templateName": "new-appointment", - "status": "FAILED" - } + "channel": "sms", + "templateName": "new-appointment", + "status": "FAILED" }, { - "_id": "812rcd65dee93b2a6a9845z98-m1", - "event": { - "_id": "758acd63dee93b2a6a68125a", - "name": "New appointment", - "payload": {}, - "source": {} - }, + "_id": "812rcd65dee93b2a6a9845z98-3a685826dee20d9afd3bc637b0615adb", + "event": "New appointment", "recipient": "675cdse5dee93b2a6a64565rf", - "message": { - "channel": "email", - "templateName": "new-appointment", - "status": "SUCCESS" - } + "channel": "email", + "templateName": "new-appointment", + "status": "SUCCESS" } ] ``` @@ -748,12 +706,17 @@ Please check the CHANGELOG before upgrading. :::info -**v2.3.0**. This endpoint is available only since v2.3.0. +**v2.4.0**. This endpoint requires the [Notification Messages MongoDB view][notification-messages-mongodb-view]. ::: -This endpoint is a proxy to the `GET /notifications` endpoint of the [templates CRUD][crud-templates], and it returns the number of messages of the queried notifications. See [notifications CRUD][crud-notification] and [messages CRUD][crud-notification-messages]. +:::info + +**v2.3.0**. This endpoint is available only since v2.3.0. + +::: +This endpoint is a proxy to the `GET /count` endpoint of the [Notification Messages MongoDB view][notification-messages-mongodb-view] and returns the number of messages matching the given query. ## Custom handler API @@ -2039,6 +2002,7 @@ When the handler receives such an event it performs the following operations: [crud-users]: ./20_configuration.md#users-crud [crud-templates]: ./20_configuration.md#templates-crud [service-configuration]: ./20_configuration.md#service-configuration +[notification-messages-mongodb-view]: 20_configuration.md#notification-messages-view [build-messages]: #buildmessages [build-reminders]: #buildreminders diff --git a/docs/runtime_suite/notification-manager-service/changelog.md b/docs/runtime_suite/notification-manager-service/changelog.md index 91ad49d2e8..7f522af3c9 100644 --- a/docs/runtime_suite/notification-manager-service/changelog.md +++ b/docs/runtime_suite/notification-manager-service/changelog.md @@ -15,6 +15,23 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.4.0] 2024-10-29 + +### Added + +- Add notification messages MongoDB view +- Add `NOTIFICATIONS_MESSAGES_VIEW_NAME` environment variable to configure the notification messages MongoDB view + +### Changed + +- `GET /notification-messages/count` is a proxy to the `GET /count` endpoint of the notification messages MongoDB view +- `GET /notification-messages/` is a proxy to the `GET /` endpoint of the notification messages MongoDB view + +### Fixed + +- Sanitize logs that could leak sensitive or personal information +- Replace newline escape sequences (`\n`, `\n\r`, `\r` and `\r\n`) with `
` tag in HTML email messages + ## [2.3.0] 2024-06-11 ### Fixed From f6516eef30c180d0affebec048cce70bfd76681a Mon Sep 17 00:00:00 2001 From: Bot-targa Date: Tue, 5 Nov 2024 18:29:51 +0100 Subject: [PATCH 06/17] chore(docs): update Teleconsultation Service Backend documentation (#1754) * chore(docs): update Teleconsultation Service Backend documentation * chore(docs): update Teleconsultation Service Backend documentation * chore(docs): update Teleconsultation Service Backend documentation * chore(docs): update Teleconsultation Service Backend documentation * chore(docs): update Teleconsultation Service Backend documentation --- .../teleconsultation-service-backend/changelog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/runtime_suite/teleconsultation-service-backend/changelog.md b/docs/runtime_suite/teleconsultation-service-backend/changelog.md index 4ba4d2b286..f7859f3e0b 100644 --- a/docs/runtime_suite/teleconsultation-service-backend/changelog.md +++ b/docs/runtime_suite/teleconsultation-service-backend/changelog.md @@ -15,6 +15,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.0.1] 2024-10-29 + +- Removed unused configuration variables `environment` and `mode` + ## [2.0.0] 2024-10-10 ### BREAKING CHANGES From 3adea9a300b6649dd8a7c0894c468b98b60b338c Mon Sep 17 00:00:00 2001 From: Bot-targa Date: Tue, 5 Nov 2024 18:30:12 +0100 Subject: [PATCH 07/17] chore(docs): update Therapy and Monitoring Manager documentation (#1756) * chore(docs): update Therapy and Monitoring Manager documentation * chore(docs): update Therapy and Monitoring Manager documentation * chore(docs): update Therapy and Monitoring Manager documentation * chore(docs): update Therapy and Monitoring Manager documentation --- .../10_overview.md | 44 ++++++++++++ .../20_configuration.md | 34 +++++++--- .../30_usage.md | 39 +++++++---- .../40_migration.md | 44 ++++++++++++ .../changelog.md | 12 ++++ .../detections.json | 68 +++++++++++++------ 6 files changed, 194 insertions(+), 47 deletions(-) create mode 100644 docs/runtime_suite/therapy-and-monitoring-manager/40_migration.md diff --git a/docs/runtime_suite/therapy-and-monitoring-manager/10_overview.md b/docs/runtime_suite/therapy-and-monitoring-manager/10_overview.md index adf9e20e49..6c6cf741d0 100644 --- a/docs/runtime_suite/therapy-and-monitoring-manager/10_overview.md +++ b/docs/runtime_suite/therapy-and-monitoring-manager/10_overview.md @@ -177,6 +177,7 @@ For each prototype you need to define: - the name; - the schema; - the labels for the schema fields (**required** only if you use the TMM with the companion FE component); +- the values for the schema fields (**required** only if you use the TMM with the companion FE component); - the hints for the schema fields (only for therapy directives, should provide a list of admitted or suggested values for a schema field). TMM supports localization for `name`, `labels` and `hints`, using a syntax like the following (`en` is ISO 639-1 language code for English, `it` for Italian): @@ -197,6 +198,14 @@ TMM supports localization for `name`, `labels` and `hints`, using a syntax like "it": "Dieta" } }, + "values": { + "bodyTemperature": { + "path": "observations[0].value" + }, + "diet": { + "path": "observations[1].value" + } + }, "hints": { "diet": [ { @@ -414,6 +423,41 @@ The integrated validation system currently supports the following threshold vali } ``` +:::warning + +The value of the `propertyName` should be the path to the value of the specific attributes in the prototype schema. If your schema is not a plan object you can use the `values` on the prototype to specify the path. +Here you can find the examples: + +- If you have a plane object the `propertyName` will be simply equal to that record like `systolicBloodPresure` or `diastolicBloodPresure`. +```json +{ + "systolicBloodPresure": 120, + "diastolicBloodPresure": 66 +} +``` + +- If you have a a complicated schema the `propertyName` should be equal to that path of the value like `observations[0].value` for `systolicBloodPresure` and `observations[1].value` for the value of `diastolicBloodPresure`. +```json +{ + "period": { + "startDate": "2024-01-01" + }, + "observations": [ + { + "code": "systolicBloodPresure", + "unit": "mmHg", + "value": 120 + }, + { + "code": "diastolicBloodPresure", + "unit": "mmHg", + "value": 66 + } + ] +} +``` +::: + :::danger The integrated validation system is designed under the assumption that the property of the detection value referred by a threshold contains one or two numeric values. If the value is not a number or an array of two numbers, depending on the operator, an error is returned. diff --git a/docs/runtime_suite/therapy-and-monitoring-manager/20_configuration.md b/docs/runtime_suite/therapy-and-monitoring-manager/20_configuration.md index 483eca608e..47a3226e13 100644 --- a/docs/runtime_suite/therapy-and-monitoring-manager/20_configuration.md +++ b/docs/runtime_suite/therapy-and-monitoring-manager/20_configuration.md @@ -88,7 +88,15 @@ A prototype example can be used to validate detections related to blood pressure "en": "Maximum pressure", "it": "Pressione massima" } - } + }, + "values": { + "minimumBloodPressure": { + "path": "observations[0].value" + }, + "maximumBloodPressure": { + "path": "observations[1].value" + } + }, } ``` @@ -174,6 +182,8 @@ Note that, modifying an identifier in an already running system can lead to inco * **Labels**: the labels for the schema fields, each one can be a string or translation object. +* **values**: the values for the schema fields, each one must be an object containing the path of the field in the detection value containing the corresponding value to compare against the thresholds. + * **Hints**: the hints for the schema fields, each one can be a string or translation object. This is only supported by therapy directives, to provide a list of admitted or suggested values for the field. ## CRUD collections @@ -319,16 +329,18 @@ If you use the integrated validation service, field names in the `value` object ::: -| Name | Type | Required (Yes/No) | Nullable (Yes/No) | -|-------------|-----------|-------------------|-------------------| -| planType | `string` | Yes | No | -| planId | `string` | Yes | No | -| value | `Object` | No | No | -| observedAt | `Date` | Yes | No | -| doctorId | `string` | No | No | -| patientId | `string` | Yes | No | -| isCompliant | `boolean` | No | No | -| deviceId | `string` | No | No | +| Name | Type | Required (Yes/No) | Nullable (Yes/No) | +|--------------------|-------------------|-------------------|-------------------| +| planType | `String` | Yes | No | +| planId | `String` | Yes | No | +| value | `Object` | No | No | +| observedAt | `Date` | Yes | No | +| doctorId | `String` | No | No | +| patientId | `String` | Yes | No | +| isCompliant | `Boolean` | No | No | +| deviceId | `String` | No | No | +| thresholds | `Array of object` | No | No | +| thresholdsExceeded | `Boolean` | No | No | ## Thresholds validation diff --git a/docs/runtime_suite/therapy-and-monitoring-manager/30_usage.md b/docs/runtime_suite/therapy-and-monitoring-manager/30_usage.md index 6779e780e2..7a968ef70b 100644 --- a/docs/runtime_suite/therapy-and-monitoring-manager/30_usage.md +++ b/docs/runtime_suite/therapy-and-monitoring-manager/30_usage.md @@ -361,18 +361,21 @@ These endpoints return 404 if no therapy or monitoring with given id is found. Detections represent tasks performed by the patient and are related to therapies or monitorings. The data model is the following: -| Name | Required (Yes/No) | Description | -|-------------|---------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| planType | Yes | Type of plan - `therapy` or `monitoring` - the detection refers to. | -| planId | Yes | Identifier of the therapy or monitoring plan the detection refers to. | -| value | Only for monitoring | The detection value is an arbitrary object and must match the validation schema defined by the associated prototype. Note that the association between the prototype and the detection is not available in the detection data model, but it is defined at the therapy or monitoring level. | -| planId | Yes | Identifier of the therapy or monitoring plan the detection refers to. | -| observedAt | Yes | Date/time at which the detection has been performed. | -| isCompliant | No | It indicates if the detection is compliant to what the physician has descripted in the plan. This value is submitted by the patient. | -| doctorId | No | Identifier of the doctor that creates the detection. Note that the doctor that creates the detection can be different from the physician that created the monitoring or therapy plan. | -| patientId | Yes | Identifier of the patient that creates the detection. | +| Name | Required (Yes/No) | Description | +|--------------------|---------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| planType | Yes | Type of plan - `therapy` or `monitoring` - the detection refers to. | +| planId | Yes | Identifier of the therapy or monitoring plan the detection refers to. | +| value | Only for monitoring | The detection value is an arbitrary object and must match the validation schema defined by the associated prototype. Note that the association between the prototype and the detection is not available in the detection data model, but it is defined at the therapy or monitoring level. | +| planId | Yes | Identifier of the therapy or monitoring plan the detection refers to. | +| observedAt | Yes | Date/time at which the detection has been performed. | +| isCompliant | No | It indicates if the detection is compliant to what the physician has descripted in the plan. This value is submitted by the patient. | +| doctorId | No | Identifier of the doctor that creates the detection. Note that the doctor that creates the detection can be different from the physician that created the monitoring or therapy plan. | +| patientId | Yes | Identifier of the patient that creates the detection. | +| thresholds | No | The list of thresholds the detection was validated against. | +| thresholdsExceeded | No | If the detection exceeds one or more thresholds. | If the **NOTIFICATION_MANAGER_URL** environment variable is correctly set, the handler will send a request to the `POST /notification-events/` endpoint of the Notification Manager, including the following information in the request body: + - **key** (string): the identifier of the deleted therapy or monitoring. - **name** (string): the event name, which is `TMM/TherapyDeleted/v1` for therapies and `TMM/MonitoringDeleted/v1` for monitorings. - **payload**(*object*): the deleted therap or monitoring. @@ -512,7 +515,7 @@ These endpoints return 200 and the number of detections matching the query. Insert a new detection in the CRUD and performs the following operations: -- if the [`VALIDATION_SERVICE` environment variable][environment-variables] is set, check if the detection exceeds any of the monitoring thresholds; +- if the [`VALIDATION_SERVICE` environment variable][environment-variables] is set, check if the detection exceeds any of the monitoring thresholds and store the results in the CRUD `thresholds` and `thresholdsExceeded` fields; - if the [`NOTIFICATION_MANAGER_URL` environment variable][environment-variables] is set, send a notification to the physician through the Notification Manager service. This endpoint is a proxy to the CRUD `POST /` endpoint. @@ -568,7 +571,7 @@ This endpoint returns 400 and a body with the structure shown below if the detec Insert multiple detection in the CRUD and, for each detection, performs the following operations: -- if the [`VALIDATION_SERVICE` environment variable][environment-variables] is set, check if the detection exceeds any of the monitoring thresholds; +- if the [`VALIDATION_SERVICE` environment variable][environment-variables] is set, check if the detection exceeds any of the monitoring thresholds and store the results in the CRUD `thresholds` and `thresholdsExceeded` fields; - if the [`NOTIFICATION_MANAGER_URL` environment variable][environment-variables] is set, send a notification to the physician through the Notification Manager service. This endpoint is a proxy to the CRUD `POST /bulk` endpoint. @@ -637,7 +640,7 @@ In such scenario the endpoint returns 400 and a body with the structure shown be Update an existing detection identified by the `:id` path parameter and performs the following operations: -- if the [`VALIDATION_SERVICE` environment variable][environment-variables] is set, check if the detection exceeds any of the monitoring thresholds; +- if the [`VALIDATION_SERVICE` environment variable][environment-variables] is set, check if the detection exceeds any of the monitoring thresholds and update the results in the CRUD `thresholds` and `thresholdsExceeded` fields; - if the [`NOTIFICATION_MANAGER_URL` environment variable][environment-variables] is set, send a notification to the physician through the Notification Manager service. This endpoint is a proxy to the CRUD `PATCH /:id` endpoint. @@ -847,7 +850,15 @@ This endpoint returns 200 and a list of the prototypes matching the query. "en": "maximum pressure", "it": "pressione massima" } - } + }, + "values": { + "minimumBloodPressure": { + "path": "observations[0].value" + }, + "maximumBloodPressure": { + "path": "observations[1].value" + } + }, }] ``` diff --git a/docs/runtime_suite/therapy-and-monitoring-manager/40_migration.md b/docs/runtime_suite/therapy-and-monitoring-manager/40_migration.md new file mode 100644 index 0000000000..daf97bd726 --- /dev/null +++ b/docs/runtime_suite/therapy-and-monitoring-manager/40_migration.md @@ -0,0 +1,44 @@ +--- +id: migration +title: Migration +sidebar_label: Migration +--- + + + +This document provides information to migrate from a previous version of the service. + +## 0.5.0 + +### CRUD collections + +Add the following fields to the [detections CRUD collection][crud-detections]: + +| Name | Type | Required (Yes/No) | Nullable (Yes/No) | +|--------------------|-------------------|-------------------|-------------------| +| thresholds | `Array of object` | No | No | +| thresholdsExceeded | `Boolean` | No | No | + +## 0.4.0 + +### CRUD collections + +- Add the following fields to the [detections CRUD collection][crud-detections]: + +| Name | Type | Required (Yes/No) | Nullable (Yes/No) | +|----------|----------|-------------------|-------------------| +| deviceId | `String` | No | No | + +- Add the following fields to the [monitorings CRUD collection][crud-monitorings]: + +| Name | Type | Required (Yes/No) | Nullable (Yes/No) | +|-----------------|-------------------|-------------------|-------------------| +| assignedDevices | `Array of string` | No | No | + + +[crud-detections]: ./20_configuration.md#detections +[crud-monitorings]: 20_configuration.md#monitorings diff --git a/docs/runtime_suite/therapy-and-monitoring-manager/changelog.md b/docs/runtime_suite/therapy-and-monitoring-manager/changelog.md index 7a1613537f..16c3a6ee37 100644 --- a/docs/runtime_suite/therapy-and-monitoring-manager/changelog.md +++ b/docs/runtime_suite/therapy-and-monitoring-manager/changelog.md @@ -15,6 +15,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.5.0] 2024-10-30 + +### Changed + +- Save thresholds validation results when detection is created or updated +- Add `values` to the prototypes schema. +- Upgrade `custom-plugin-lib` to version `7.0.0` and `fastify-cron` to `1.3.1` and add default error handler. + +### Fixed + +- Fix bug causing detections reported as OK if a threshold field is not found in the detection value. + ## [0.4.0] 2024-09-11 - Update Node.js to v20 (LTS) diff --git a/static/docs_files_to_download/therapy-and-monitoring-manager/detections.json b/static/docs_files_to_download/therapy-and-monitoring-manager/detections.json index fe5e7a429e..8b241c66a6 100644 --- a/static/docs_files_to_download/therapy-and-monitoring-manager/detections.json +++ b/static/docs_files_to_download/therapy-and-monitoring-manager/detections.json @@ -1,39 +1,45 @@ [ - { "name": "_id", "description": "_id", "type": "ObjectId", "required": true, "nullable": false }, + { + "name": "_id", + "type": "ObjectId", + "required": true, + "nullable": false, + "description": "_id" + }, { "name": "creatorId", - "description": "creatorId", "type": "string", "required": true, - "nullable": false + "nullable": false, + "description": "creatorId" }, { "name": "createdAt", - "description": "createdAt", "type": "Date", "required": true, - "nullable": false + "nullable": false, + "description": "createdAt" }, { "name": "updaterId", - "description": "updaterId", "type": "string", "required": true, - "nullable": false + "nullable": false, + "description": "updaterId" }, { "name": "updatedAt", - "description": "updatedAt", "type": "Date", "required": true, - "nullable": false + "nullable": false, + "description": "updatedAt" }, { "name": "__STATE__", - "description": "__STATE__", "type": "string", "required": true, - "nullable": false + "nullable": false, + "description": "__STATE__" }, { "name": "planType", @@ -62,15 +68,6 @@ "encryptionEnabled": false, "encryptionSearchable": false }, - { - "name": "observedAt", - "type": "Date", - "required": true, - "nullable": false, - "sensitivityValue": 0, - "encryptionEnabled": false, - "encryptionSearchable": false - }, { "name": "doctorId", "type": "string", @@ -98,13 +95,40 @@ "encryptionEnabled": false, "encryptionSearchable": false }, + { + "name": "observedAt", + "type": "Date", + "required": true, + "nullable": false, + "sensitivityValue": 0, + "encryptionEnabled": false, + "encryptionSearchable": false + }, { "name": "deviceId", "type": "string", - "required": true, + "required": false, + "nullable": false, + "sensitivityValue": 0, + "encryptionEnabled": false, + "encryptionSearchable": false + }, + { + "name": "thresholds", + "type": "Array_RawObject", + "required": false, + "nullable": false, + "sensitivityValue": 0, + "encryptionEnabled": false, + "encryptionSearchable": false + }, + { + "name": "thresholdsExceeded", + "type": "boolean", + "required": false, "nullable": false, "sensitivityValue": 0, "encryptionEnabled": false, "encryptionSearchable": false } -] +] \ No newline at end of file From 4fcccba6cab65858fbec4e7af10a41d1f4a1dade Mon Sep 17 00:00:00 2001 From: Bot-targa Date: Tue, 5 Nov 2024 18:30:45 +0100 Subject: [PATCH 08/17] chore(docs): update SMS Service documentation (#1763) --- docs/runtime_suite/sms-service/10_overview.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/runtime_suite/sms-service/10_overview.md b/docs/runtime_suite/sms-service/10_overview.md index 58ba0ef7d3..a20302f807 100644 --- a/docs/runtime_suite/sms-service/10_overview.md +++ b/docs/runtime_suite/sms-service/10_overview.md @@ -52,7 +52,8 @@ This section provides a security checklist to configure providers in order for a #### Twilio - [ ] Disable automatic recharge of the account balance under the *Billing Overview* section of the Twilio project console -- [ ] Configure SMS Geo-Permissions in the Twilio project console, on the [Messaging Geographic Permissions][twilio-geo-permissions] page. +- [ ] Configure SMS Geo-Permissions in the Twilio project console, on the [Messaging Geographic Permissions][twilio-geo-permissions] page. +- [ ] Enable [SMS Pumping Protection for Programmable Messaging][twilio-sms-pumping-protection-programmable-messaging] (this is a paid feature, check official [Twilio pricing page][twilio-pricing] for more details) #### Kaleyra @@ -71,5 +72,7 @@ This section provides a security checklist to configure providers in order for a [twilio-sms-fraud]: https://support.twilio.com/hc/en-us/articles/8360406023067-SMS-Traffic-Pumping-Fraud "Twilio sms pumping fraud" [twilio-balance-api]: https://support.twilio.com/hc/en-us/articles/360025294494-Check-Your-Twilio-Account-Balance "Twilio balance api" [twilio-geo-permissions]: https://console.twilio.com/us1/develop/sms/settings/geo-permissions?frameUrl=%2Fconsole%2Fsms%2Fsettings%2Fgeo-permissions%3Fx-target-region%3Dus1 "Twilio Geo Permissions" +[twilio-pricing]: https://www.twilio.com/en-us/sms/pricing/ +[twilio-sms-pumping-protection-programmable-messaging]: https://www.twilio.com/docs/messaging/features/sms-pumping-protection-programmable-messaging [environment-variables]: ./20_configuration.md#Environment-variables "Environment variables | Configuration" From b832a579e23b19e9f590fe119746492fc0724038 Mon Sep 17 00:00:00 2001 From: Bot-targa Date: Wed, 6 Nov 2024 09:43:17 +0100 Subject: [PATCH 09/17] chore(docs): update Care Kit documentation (#1741) * chore(docs): update Care Kit documentation * chore(docs): update Care Kit documentation * chore(docs): update Care Kit documentation * chore(docs): update Care Kit documentation * Fix mispells * chore(docs): update Care Kit documentation * chore(docs): update Care Kit documentation * chore(docs): update Care Kit documentation * chore(docs): update Care Kit documentation * chore(docs): update Care Kit documentation * chore(docs): update Care Kit documentation --------- Co-authored-by: Nicola Moretto --- .../150_ck_roles_and_permissions.md | 169 ++++++++++++++++++ docs/runtime_suite/care-kit/changelog.md | 10 +- .../img/ck-roles-and-permissions-modal.png | Bin 0 -> 42217 bytes 3 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 docs/runtime_suite/care-kit/20_components/150_ck_roles_and_permissions.md create mode 100644 docs/runtime_suite/care-kit/img/ck-roles-and-permissions-modal.png diff --git a/docs/runtime_suite/care-kit/20_components/150_ck_roles_and_permissions.md b/docs/runtime_suite/care-kit/20_components/150_ck_roles_and_permissions.md new file mode 100644 index 0000000000..4d3c8280ea --- /dev/null +++ b/docs/runtime_suite/care-kit/20_components/150_ck_roles_and_permissions.md @@ -0,0 +1,169 @@ +--- +id: ck_roles_and_permissions +title: ck-roles-and-permissions-modal +sidebar_label: Ck roles and permissions +--- + + + +The `ck-roles-and-permissions-modal` web component facilitates the management of roles and their associated permissions. It allows you to create, edit and manage roles assigning permissions using a **tree structure**, where each node represents a permission. + +* **Internal nodes**: represent categories or groups of permissions. They are parent nodes that can have child nodes (either other internal nodes or leaf nodes). When an internal node is selected, it implies that all its descendant nodes (both internal and leaf) are also selected. +* **Leaf nodes**: are the specific permissions themselves. These nodes represent actionable permissions (like "read", "edit", or "delete") and cannot have child nodes. +Selecting an internal node grants all the permissions contained within its child nodes, while selecting a leaf node grants only that specific permission. + + + +## Example +An example of the permissions tree structure: +```mermaid +graph TD + A[Users] + B[Patient] + C[Devices] + D[Delete] + E[Edit] + F[Read] + G[Delete] + + A --> B + B --> E + B --> F + A --> D + C --> G +``` + +The web component will follow this structure and allow you to check the permissions of the role you are creating. if you check an internal node it actually means that all the leaf nodes connected to that node have been checked. + +![ck-roles-and-permissions-modal](../img/ck-roles-and-permissions-modal.png) + +## Usage + +To integrate the `ck-roles-and-permissions-modal` into a Microfrontend Composer page, include the component in the page configuration. +Below is an example configuration: + +```json +{ + "type": "element", + "url": "/mia-care-web-components/mia-care-web-components.esm.js", + "tag": "ck-roles-and-permissions-modal", +} +``` + +Upon completing an action, a feedback message will be displayed, indicating success or failure. + +## Properties & Attributes + +| property | type | required | default | description | +|-------------------------|----------|----------|---------|-------------------------------------------------------------------------------------------------| +| `rolesManagementEndpoint` | `string` | false | /roles/ | Endpoint used to retrieve data of the roles. (See [Roles endpoint schema](#roles-endpoint-schema) for more information). | +| `permissionsManagementEndpoint` | `string` | false | /permissions/ | Endpoint used to retrieve data of the permissions. (See [Permissions endpoint schema](#permissions-endpoint-schema) for more information). | +| `width` | `string` or `number` | false | 70% | The width of the modal. It must a valid CSS value. | +| `readOnly` | `boolean` | false | false | When set to `true`, this value ensures the modal is in read-only mode, preventing user input. | + + +## Listens to + +| event | action | payload | +|--------------------------------------------------------------------------------|---------------------------------------------------|----------| +| [selected-data](../../../microfrontend-composer/back-kit/events#selected-data) | Triggers the opening of the modal in edit mod | The data of the role. Please note that the `_id` is required. | +| [add-new](../../../microfrontend-composer/back-kit/events#add-new) | Listens to the add-new event to open modal | - | + + +## Communication with Endpoints + +### Roles Management Endpoint + + + +It retrieves the list of roles and it allows either to create a new role or to edit an existing one +The endpoint should expose these methods + +* **GET by id**: Retrieve a specific role with all schema information. +* **POST**: Create a new role with permissions selected assigned. +* **PATCH by id**: It allows to patch a specific role by changing either name or the list of permissions. + +#### Schema + +| property | type | required | description | +|-------------------------|----------|---------|-------------------------------------------------------------------------------------------------| +| `_id` | `string` | false | The ID of the permission. This field is auto-generated from the backend. | +| `label` | `string` | false | Readable name of the role. | +| `value` | `string` | false | Identifier that defines the role. | +| `permissions` | `string[]` | false | [Values of the permissions](#permissions-endpoint-schema) of the role. + + +### Permission Endpoint + + + +This endpoint manages the entire permission tree. It must serve all available permissions, both internal nodes and leaf nodes. This allows the web component to build the permission tree structure correctly. + +It should expose an **EXPORT** which retrieve the list of all permissions + + +#### Schema + +| property | type | required | description | +|-------------------------|----------|---------|-------------------------------------------------------------------------------------------------| +| `_id` | `string` | false | The ID of the permission. This field is auto-generated from the backend. | +| `label` | `string` | false | Readable name of the permission. | +| `value` | `string` | false | The format of this value is created by associating the value of the parent nodes and the identifier of the node. For example parent1.parent2 or parent1.parent2.leaf4 | +| `description` | `string` | false | Description of the permission. | +| `type` | `Enum`: `leaf` or `intenalNode` | false | This value indicates whether the permission type is a leaf or an internal node. + + +following this [example](#example) the expected data might look like this: +```json +[ + { "label": "Devices", "value": "parent2", "type": "internalNode" }, + { "label": "Edit", "value": "parent1.parent2.leaf3", "type": "leaf" }, + { "label": "Delete", "value": "parent2.leaf2", "type": "leaf" }, + { "label": "Users", "value": "parent1", "type": "internalNode" }, + { "label": "Patient", "value": "parent1.parent2", "type": "internalNode" }, + { "label": "Read", "value": "parent1.parent2.leaf4" }, + { "label": "Delete", "value": "parent1.leaf1", "type": "leaf"} +] +``` + +This would correspond to the following tree: + +```mermaid +graph TD + A["label: Users
value: parent1
type: internalNode"] + B["label: Patient
value: parent1.parent2
type: internalNode"] + D["label: Delete
value: parent1.leaf1
type: leaf"] + E["label: Edit
value: parent1.parent2.leaf3
type: leaf"] + F["label: Read
value: parent1.parent2.leaf4
type: leaf"] + C["label: Devices
value: parent2
type: internalNode"] + G["label: Delete
value: parent2.leaf2
type: leaf"] + + A --> B + B --> E + B --> F + A --> D + C --> G +``` + +### Notes + +Remember, the permissions for a role will always consist of the leaf node values, but the permissionsManagementEndpoint must provide the entire tree structure, including internal nodes, for the modal to work properly. + +When adding a new permission, such as "Read" under a new category "Documents" the permissionsManagementEndpoint must return: + +- An internal node for the "Documents" category with the value "documents". +- A leaf node for the "Read" permission with the value "documents.write". + +This ensures that the frontend can properly display the hierarchy of permissions. + +The expected response format in this case would be: +```json +[ + { "label": "Documents", "value": "documents", "type": "internalNode" }, + { "label": "Write", "value": "documents.write", "type": "leaf" } +] +``` diff --git a/docs/runtime_suite/care-kit/changelog.md b/docs/runtime_suite/care-kit/changelog.md index 1fc6ae6247..1d2ce5e046 100644 --- a/docs/runtime_suite/care-kit/changelog.md +++ b/docs/runtime_suite/care-kit/changelog.md @@ -15,6 +15,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [v2.9.0] + +- Added `roles-and-permissions-modal` web component +- Fix medical records loading data +- Fix `add-plan-modal` handling of adherence and compliance on edit + ## [v2.8.5] - Fix calendar event box width @@ -39,8 +45,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [v2.8.2] -- Update add-plan-modal to edit devices -- Update add-plan-modal to include devices on create +- Update `add-plan-modal` to edit devices +- Update `add-plan-modal` to include devices on create ## [v2.8.1] diff --git a/docs/runtime_suite/care-kit/img/ck-roles-and-permissions-modal.png b/docs/runtime_suite/care-kit/img/ck-roles-and-permissions-modal.png new file mode 100644 index 0000000000000000000000000000000000000000..d91d68b9170872180b728c20d6a1d2f7362f0348 GIT binary patch literal 42217 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 jE=p#Hmt>H8`J%<=E Date: Fri, 8 Nov 2024 15:25:49 +0100 Subject: [PATCH 10/17] chore(docs): update Node.js Mia Care SaMD Template documentation (#1390) * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation * chore(docs): update Node.js Mia Care SaMD Template documentation --------- Co-authored-by: Nicola Moretto --- .../10_overview.md | 4 +- .../20_walkthrough.md | 96 ++++++++++++++++++- .../audit_logs.json | 1 + 3 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 static/docs_files_to_download/node.js-mia-care-samd-template/audit_logs.json diff --git a/docs/runtime_suite_templates/node.js-mia-care-samd-template/10_overview.md b/docs/runtime_suite_templates/node.js-mia-care-samd-template/10_overview.md index d345319701..9456953863 100644 --- a/docs/runtime_suite_templates/node.js-mia-care-samd-template/10_overview.md +++ b/docs/runtime_suite_templates/node.js-mia-care-samd-template/10_overview.md @@ -10,9 +10,9 @@ DO NOT MODIFY IT BY HAND. Instead, modify the source file and run the aggregator to regenerate this file. --> -`Node.js Mia-Care Template` is the best template to start creating a service in NodeJs, integrated inside your platform. This template contains tools to simplifying the building Software as a Medical Device (SaMD). +`Node.js Mia-Care Template` is the best template to start creating a service in Node.js integrated inside your platform. This template contains tools to simplify building Software as a Medical Device (SaMD). -This template leverages Mia Platform [custom-plugin-lib][custom-plugin-lib]. +This template leverages Mia Platform [custom-plugin-lib][custom-plugin-lib]. `custom-plugin-lib` is a [node.js][node.js] library developed by Mia-Platform. This library contains configurations and functions that will help you to modify your template with easiness. If you want to learn how to modify this template and create your node microservice with custom logic, follow this [walkthrough][walkthrough]. diff --git a/docs/runtime_suite_templates/node.js-mia-care-samd-template/20_walkthrough.md b/docs/runtime_suite_templates/node.js-mia-care-samd-template/20_walkthrough.md index d4d93a7401..50b99fe21b 100644 --- a/docs/runtime_suite_templates/node.js-mia-care-samd-template/20_walkthrough.md +++ b/docs/runtime_suite_templates/node.js-mia-care-samd-template/20_walkthrough.md @@ -60,6 +60,9 @@ const customService = require('@mia-platform/custom-plugin-lib')(envVarsSchema) const getHelloWorld = require('./src/endpoints/hello-world/get') +const { logMethod } = require('./src/lib/utils') +const { AUDIT_TRAIL_LOG_LEVEL } = require('./src/lib/constants') + module.exports = customService(async function index(service) { service.register(getHelloWorld) @@ -73,16 +76,29 @@ module.exports = customService(async function index(service) { decorateRequestWithBuildErrorResponse(service) }) + +module.exports.options = { + logger: { + customLevels: { + audit: AUDIT_TRAIL_LOG_LEVEL, + }, + hooks: { + logMethod, + }, + }, +} ``` The `index.js` file already contains: -- the definition of an simple endpoint `GET /hello-world`; +- the definition of a simple endpoint `GET /hello-world`; - the definition of the Reply Fastify decorators for the error management; -- the definition of the Request Fastify decorators to enrich the request object. +- the definition of the Request Fastify decorators to enrich the request object; +- the logger configuration options to enable audit logs. Wonderful! You are now ready to start customizing your service! Read next section to learn how. ### Folder structure + The folder structure should follow this pattern: . @@ -165,6 +181,7 @@ It creates: - the `handler.test.js` file, that contains the Jest unit tests for the handler. ### Decorators + The template includes a set of default of request and reply decorators. The [decorators API][fastify-decorators] allows customization of the core Fastify objects, such as the server instance itself and any request and reply objects used during the HTTP request lifecycle. The decorators can be modified and extended with domain-specific notation. The template contains request and reply decorators for, respectively, enrichment of the request object with additional metadata (e.g. `requestId`) and error management. The template implements the formatter for the most common HTTP errors, allowing to have a common format for the error response that, by default, is the following: @@ -189,6 +206,80 @@ async function handler(request, reply) { } ``` +### Audit Trail + +This template provides out-of-the-box support for audit logs, which are designed to track meaningful events happening inside and across your microservices for auditing purposes. + +Audit logs are a subset of application logs with a custom logging level and expected to contain structured information, that can be later queried to answer common questions about systems and users activities and behaviors. + +The audit log configuration is specified at the bottom of the `index.js` file: + +```js +module.exports.options = { + logger: { + customLevels: { + audit: AUDIT_TRAIL_LOG_LEVEL, + }, + }, +} +``` + +The exported options enable you to generate audit logs by calling the `audit` logging method on the logger instance inside your handlers: + +```js +async function handler(request, reply) { + request.log.audit({ event: 'MiaCare/HelloWorld/v1', severity: 'INFO' }, 'Hello World Audit Log') +} +``` + +The first argument should be an object containing event metadata, that are persisted on MongoDB to performs advanced queries. + +Under the hood, audit logs have a custom log level which is used to filter them from other application logs. +By default, the log level is named `audit` and has `1100` as numeric value. +Setting a log level strictly greater than 1000 serves the purpose of avoid conflicts with existing log levels and ensure the audit logs are correctly filtered downstream and forwarded to MongoDB. + +:::danger + +Be careful when setting the `LOG_LEVEL` environment variable of your service: you must ensure that the numeric value associated to the chosen log level is lower than the one chosen for the audit log level, otherwise the audit logs will not be generated. + +::: + +So, given the example above, the resulting log on MongoDB will have a structure looking like this: + +```json +{ + "version": "1.0.0", + "timestamp": "2024-04-30T09:12:06.095Z", + "checksum": { + "algorithm": "sha512", + "value": "e474e95adfb31ef4cac7d992732a43d65e3313c852bd5e318dd84087b39ab62b19ff4c5590a6d5d5055ee5e3669c384c55eff0f36fe090205bd67d92d4aa9381" + }, + "metadata": { + "level": 1100, + "msg": "Hello World Audit Log", + "event": "MiaCare/HelloWorld/v1", + "severity": "INFO" + }, + "message": "Hello World Audit Log", + "rawLog": "{\"level\":1100,\"msg\":\"Hello World Audit Log\", ...}" +} +``` + +The audit logs are enriched with several fields and converted to a canonical form before being stored into MongoDB: + +- `version`: the version of the audit logs reference schema; +- `timestamp`: when the audit log was recorded; +- `checksum`: this checksum is generated automatically from the original log (available in the `rawLog` field); +- `metadata`: this field contains all the log fields, including the ones passed as first argument to the logger; +- `message`: this field contains the original log message (currently the message must be in the log `msg` field); +- `rawLog`: the original log, as emitted by the application logger. + +:::tip + +If you need to record when the even occurred, you should pass it explicitly as field of the object passed as first argument to the logger, so it's recorded in the metadata and available later for querying. + +::: + ## Expose an endpoint to your microservice In order to access to your new microservice it is necessary to create an endpoint that targets it. Follow [this link][mia-console-design-endpoints] to learn how to create an endpoint from the DevOps Console. @@ -228,6 +319,7 @@ Congratulations! You can now start developing your own NodeJS microservice! [fastify-plugins]: https://www.fastify.io/docs/latest/Reference/Plugins/ [github-jira-prepare-commit-msg]: https://github.com/bk201-/jira-prepare-commit-msg [husky]: https://typicode.github.io/husky/ + [mia-console-paas]: https://console.cloud.mia-platform.eu/login [mia-console-create-microservice]: /development_suite/api-console/api-design/services.md#how-to-create-a-microservice-from-an-example-or-from-a-template [mia-console-deploy]: /development_suite/deploy/overview.md diff --git a/static/docs_files_to_download/node.js-mia-care-samd-template/audit_logs.json b/static/docs_files_to_download/node.js-mia-care-samd-template/audit_logs.json new file mode 100644 index 0000000000..3e3b093c1a --- /dev/null +++ b/static/docs_files_to_download/node.js-mia-care-samd-template/audit_logs.json @@ -0,0 +1 @@ +[{"name":"_id","description":"_id","type":"ObjectId","required":true,"nullable":false},{"name":"creatorId","description":"creatorId","type":"string","required":true,"nullable":false},{"name":"createdAt","description":"createdAt","type":"Date","required":true,"nullable":false},{"name":"updaterId","description":"updaterId","type":"string","required":true,"nullable":false},{"name":"updatedAt","description":"updatedAt","type":"Date","required":true,"nullable":false},{"name":"__STATE__","description":"__STATE__","type":"string","required":true,"nullable":false},{"name":"version","type":"string","required":false,"nullable":false,"sensitivityValue":0,"encryptionEnabled":false,"encryptionSearchable":false},{"name":"timestamp","type":"Date","required":false,"nullable":false,"sensitivityValue":0,"encryptionEnabled":false,"encryptionSearchable":false},{"name":"severity","type":"string","required":false,"nullable":false,"sensitivityValue":0,"encryptionEnabled":false,"encryptionSearchable":false},{"name":"metadata","type":"RawObject","required":false,"nullable":false,"sensitivityValue":0,"encryptionEnabled":false,"encryptionSearchable":false},{"name":"checksum","type":"RawObject","required":false,"nullable":false,"sensitivityValue":0,"encryptionEnabled":false,"encryptionSearchable":false},{"name":"message","type":"string","required":false,"nullable":false,"sensitivityValue":0,"encryptionEnabled":false,"encryptionSearchable":false}] \ No newline at end of file From 9f472805a2bf97156a3711a65fde8dddcf1be72d Mon Sep 17 00:00:00 2001 From: Bot-targa Date: Fri, 8 Nov 2024 15:26:16 +0100 Subject: [PATCH 11/17] chore(docs): update Auth0 Client documentation (#1746) * chore(docs): update Auth0 Client documentation * chore(docs): update Auth0 Client documentation * chore(docs): update Auth0 Client documentation * chore(docs): update Auth0 Client documentation * chore(docs): update Auth0 Client documentation * chore(docs): update Auth0 Client documentation * chore(docs): update Auth0 Client documentation * chore(docs): update Auth0 Client documentation * chore(docs): update Auth0 Client documentation * chore(docs): update Auth0 Client documentation --- docs/runtime_suite/auth0-client/20_configuration.md | 2 ++ docs/runtime_suite/auth0-client/changelog.md | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/docs/runtime_suite/auth0-client/20_configuration.md b/docs/runtime_suite/auth0-client/20_configuration.md index 60c83732a4..dd95e7bf4b 100644 --- a/docs/runtime_suite/auth0-client/20_configuration.md +++ b/docs/runtime_suite/auth0-client/20_configuration.md @@ -25,6 +25,8 @@ The Auth0-Client service accepts the following environment variables: - __REDIS_USERNAME__: defines the redis username to be used for authentication - __REDIS_PASSWORD__: defines the redis password to be used for authentication - __REDIS_HOSTS__ (__required__): defines the redis hosts +- __REDIS_TLS__ (__default: `false`__): when `true`, enables the TLS connection to Redis +- __REDIS_TLS_CACERT__: defines the path to the Redis server CA, if not public (this is effective only if `REDIS_TLS` is set to `true`) - __ORIGINAL_PROTOCOL_HEADER__ (__required__): defines the original protocol header - __SERVICE_CONFIG_FILE_NAME__ (__required__): defines the service config name - __SERVICE_CONFIG_PATH__ (__required__): defines the service config path diff --git a/docs/runtime_suite/auth0-client/changelog.md b/docs/runtime_suite/auth0-client/changelog.md index 904a2fef26..8004a004ac 100644 --- a/docs/runtime_suite/auth0-client/changelog.md +++ b/docs/runtime_suite/auth0-client/changelog.md @@ -15,6 +15,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 3.7.1 - 07-11-2024 + +### Fixed + +- logout redirect when a query params set in the redirect path + +## 3.7.0 - 30-10-2024 + +### Added + +- add TLS connection support for Redis in normal and sentinel mode + ## 3.6.0 - 26-02-2024 ### Added From 3d74ae3ab84aaa4210f60fd3ab24d5e0b0709dc6 Mon Sep 17 00:00:00 2001 From: Bot-targa Date: Fri, 8 Nov 2024 15:56:55 +0100 Subject: [PATCH 12/17] chore(docs): update Form Service Frontend documentation (#1764) * chore(docs): update Form Service Frontend documentation * chore(docs): update Form Service Frontend documentation --- docs/runtime_suite/form-service-frontend/changelog.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/runtime_suite/form-service-frontend/changelog.md b/docs/runtime_suite/form-service-frontend/changelog.md index 441cbeacd3..70c7949fd0 100644 --- a/docs/runtime_suite/form-service-frontend/changelog.md +++ b/docs/runtime_suite/form-service-frontend/changelog.md @@ -15,6 +15,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 2.1.0 2024-11-06 + +- Upgrade dependencies and CI/CD pipeline +- Added custom title to the expired Modal + ## 2.0.5 2024-05-23 - fixed bug on expired form behavior From 05512bfe8ef5753bc5951c59003f74cd7e04becb Mon Sep 17 00:00:00 2001 From: Bot-targa Date: Thu, 14 Nov 2024 17:45:01 +0100 Subject: [PATCH 13/17] chore(docs): update Care Kit documentation (#1771) * chore(docs): update Care Kit documentation * chore(docs): update Care Kit documentation --- docs/runtime_suite/care-kit/changelog.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/runtime_suite/care-kit/changelog.md b/docs/runtime_suite/care-kit/changelog.md index 1d2ce5e046..13def1f559 100644 --- a/docs/runtime_suite/care-kit/changelog.md +++ b/docs/runtime_suite/care-kit/changelog.md @@ -15,6 +15,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [v2.9.1] + +- Upgrade Node.js to v20 and remove unused dependencies +- Fix regression in `ck-threshold-modal` component caused by `values` field in prototypes, which are now ignored + ## [v2.9.0] - Added `roles-and-permissions-modal` web component From fe85c643dad15f85ba1dcfab10480dfa824b2847 Mon Sep 17 00:00:00 2001 From: Bot-targa Date: Thu, 14 Nov 2024 17:45:14 +0100 Subject: [PATCH 14/17] chore(docs): update FHIR Adapter documentation (#1772) * chore(docs): update FHIR Adapter documentation * chore(docs): update FHIR Adapter documentation --- .../fhir-adapter/10_overview_and_usage.md | 2 +- docs/runtime_suite/fhir-adapter/changelog.md | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/docs/runtime_suite/fhir-adapter/10_overview_and_usage.md b/docs/runtime_suite/fhir-adapter/10_overview_and_usage.md index 09103efc36..55821e3dd2 100644 --- a/docs/runtime_suite/fhir-adapter/10_overview_and_usage.md +++ b/docs/runtime_suite/fhir-adapter/10_overview_and_usage.md @@ -113,7 +113,7 @@ curl --request POST \ --header 'accept: application/json' \ --header 'content-type: application/json' \ --header 'client-key: client-key' \ - --data '{"firstName":"Mario","lastName":"Rossi","birthDate":"12-03-1987"}' + --data '{"firstName":"John","lastName":"Doe","birthDate":"12-03-1987"}' ``` in response, you will get a JSON object like this: diff --git a/docs/runtime_suite/fhir-adapter/changelog.md b/docs/runtime_suite/fhir-adapter/changelog.md index 5adc1e1bdd..dbc1696242 100644 --- a/docs/runtime_suite/fhir-adapter/changelog.md +++ b/docs/runtime_suite/fhir-adapter/changelog.md @@ -15,24 +15,39 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.0.2] 2024-06-25 +## [1.0.4] 2024-11-12 + +## Changed + +- Update Node.js to v20 (LTS) and dependencies + +## [1.0.3] 2024-06-25 ## Changed - Node version updated to lts/hydrogen -- Untracked: Fix endpoint tags for API Portal documentation +- Fix endpoint tags for API Portal documentation + +## [1.0.2] 2023-05-16 + +## Changed + +- Update dependencies ## [1.0.1] 2023-02-01 ### Fixed + - Minor vulnerability fix. ## [1.0.0] 2022-09-28 ### Added + - Update `json-schema-converter` version to `2.2.0`. ### Removed + - Removed custom error management in file upload and download. ## [0.1.1] 2022-07-07 From 2121ddc8f7f90095c2f37ec8d6308cd124930bba Mon Sep 17 00:00:00 2001 From: Marco Filippi <108082959+marcofilippi@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:32:12 +0100 Subject: [PATCH 15/17] RN 13.3.0 in Prod --- docs/release-notes/v13.3.0.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/docs/release-notes/v13.3.0.md b/docs/release-notes/v13.3.0.md index 032393b807..805b7dfda3 100644 --- a/docs/release-notes/v13.3.0.md +++ b/docs/release-notes/v13.3.0.md @@ -17,15 +17,7 @@ export const Highlight = ({children, color}) => ( ); -_October 24th, 2024_ - -:::info -Mia-Platform Console v13.3.0 - Fall Release is **now in Preview** and will be generally available on November 21st. - -Console SaaS users can try out v13.3.0 - Fall Release latest improvements in Preview! Open a Service Request to ask for the creation of a sandbox Company in case you do not have access to any Company. - -For self-hosted installations, please read the [following guidelines](#how-to-update-your-console). -::: +_November 18th, 2024_ ## Support to all Infrastructure Resources in Design @@ -167,5 +159,5 @@ In this minor version, we’ve added a new feature to the `FormModal` component. ## How to update your Console -For self-hosted installations, please head to the [self hosted upgrade guide](/infrastructure/self-hosted/installation-chart/100_how-to-upgrade.md) or contact your Mia-Platform referent and upgrade to _Console Helm Chart_ `v13.7.5-beta.1`. +For self-hosted installations, please head to the [self hosted upgrade guide](/infrastructure/self-hosted/installation-chart/100_how-to-upgrade.md) or contact your Mia-Platform referent and upgrade to _Console Helm Chart_ `v13.7.5`. From 6b52a0248cf1ad00fd8093d2d691e668733f06e5 Mon Sep 17 00:00:00 2001 From: jacoposte <100678585+jacoposte@users.noreply.github.com> Date: Mon, 18 Nov 2024 15:17:23 +0100 Subject: [PATCH 16/17] scratch_info --- docs/development_suite/monitoring/resources/custom-resources.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/development_suite/monitoring/resources/custom-resources.md b/docs/development_suite/monitoring/resources/custom-resources.md index 7c30e4467e..bfd3c83fac 100644 --- a/docs/development_suite/monitoring/resources/custom-resources.md +++ b/docs/development_suite/monitoring/resources/custom-resources.md @@ -12,6 +12,8 @@ If deployed, the information on the [Custom Resources](/console/design-your-proj If you created one or more Custom Kubernetes Resource from a marketplace template **prior** to Console release v13.3.0, the resources **will not be visible by default**. Please ensure to [update your resource](/marketplace/add_to_marketplace/add_item_by_type/add_custom_resource.md#update-a-custom-resource-to-the-console-v1330) version via [miactl](/cli/miactl/10_overview.md) to one that has the properties `resourceId` and `type` correctly set in the `runtime` object field of its definition, otherwise the Custom Kubernetes Resources won't be visible in the section even if the resource is active. + +Furthermore, for the moment the resources created **from scratch** will not be visible in the Runtime area. We will introduce support in future versions ::: From 79e7ba7c2afb098cd52384188174bdf3e34ae9ca Mon Sep 17 00:00:00 2001 From: jacoposte <100678585+jacoposte@users.noreply.github.com> Date: Mon, 18 Nov 2024 15:27:15 +0100 Subject: [PATCH 17/17] Update custom-resources.md --- docs/development_suite/monitoring/resources/custom-resources.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/development_suite/monitoring/resources/custom-resources.md b/docs/development_suite/monitoring/resources/custom-resources.md index bfd3c83fac..76ee079bf6 100644 --- a/docs/development_suite/monitoring/resources/custom-resources.md +++ b/docs/development_suite/monitoring/resources/custom-resources.md @@ -13,7 +13,7 @@ If you created one or more Custom Kubernetes Resource from a marketplace templat Please ensure to [update your resource](/marketplace/add_to_marketplace/add_item_by_type/add_custom_resource.md#update-a-custom-resource-to-the-console-v1330) version via [miactl](/cli/miactl/10_overview.md) to one that has the properties `resourceId` and `type` correctly set in the `runtime` object field of its definition, otherwise the Custom Kubernetes Resources won't be visible in the section even if the resource is active. -Furthermore, for the moment the resources created **from scratch** will not be visible in the Runtime area. We will introduce support in future versions +Furthermore, the resources created **from scratch** will not be visible in the Runtime area. We will introduce the support in future versions of the Console. :::