From 652c9ff84298e903c65c0d7043a151b8bfa4c407 Mon Sep 17 00:00:00 2001 From: pawelPrzywara Date: Thu, 4 Dec 2025 17:16:39 +0100 Subject: [PATCH 1/5] feat: Cdc markdown messages --- src/features/cdc/services/messageService.ts | 97 +++++++++++++++++++ .../services/special/cdc-service.ts | 2 +- src/populate-persistence.ts | 5 +- 3 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 src/features/cdc/services/messageService.ts diff --git a/src/features/cdc/services/messageService.ts b/src/features/cdc/services/messageService.ts new file mode 100644 index 00000000..bcfbf1d9 --- /dev/null +++ b/src/features/cdc/services/messageService.ts @@ -0,0 +1,97 @@ +import { IoDevServerConfig } from "../../../types/config"; +import { CreatedMessageWithContentAndAttachments } from "../../../../generated/definitions/backend/CreatedMessageWithContentAndAttachments"; +import { nextMessageIdAndCreationDate } from "../../messages/utils"; +import { validatePayload } from "../../../utils/validator"; +import { cdcServiceId } from "../../services/persistence/services/special/cdc-service"; +import { CreatedMessageWithContent } from "../../../../generated/definitions/backend/CreatedMessageWithContent"; + +const successCtasMarkdown = `--- +it: + cta_2: + text: "Dove puoi usarla" + action: "iohandledlink://https://www.cartadellacultura.it/cartaculturaEsercente/#/doveUsareBuoni" + cta_1: + text: "Vai alla Carta della Cultura" + action: "ioit://main/wallet" +en: + cta_2: + text: "Dove puoi usarla" + action: "https://www.cartadellacultura.it/cartaculturaEsercente/#/doveUsareBuoni" + cta_1: + text: "Vai alla Carta della Cultura" + action: "iohandledlink://https://ec.europa.eu/eusurvey/runner/Questionario_comportamenti_giovanili" +---`; + +const createCdcMessageTemplates = [ + { + subject: "La tua Carta della Cultura è pronta!", + markdown: `${successCtasMarkdown} +Ciao! +Il tuo **nucleo familiare** ha ottenuto la Carta della Cultura per il: +* **202Y** +* **202Z** + +È disponibile ora nella sezione Portafoglio. + +Puoi usarla per acquistare libri, sia cartacei che digitali, generando uno o più buoni in base al credito disponibile. + +Vuoi avere più informazioni su come usare i buoni? [Leggi come fare](https://link.alla.guida.come.fare) +` + }, + { + subject: "Non è stato possibile assegnarti la Carta della Cultura", + markdown: `Ciao! +Purtroppo non è stato possibile assegnarti la Carta della Cultura. + +La richiesta non è stata accolta, ecco perché: +* **202X** : +* **202V** : +* **202K** : + +Grazie per aver partecipato all’iniziativa. +` + }, + { + subject: "Carta della Cultura: abbiamo aggiornamenti sulla tua richiesta", + markdown: `${successCtasMarkdown} +Ciao! +Ecco l’esito delle tue richieste per l’ottenimento della Carta della Cultura. + +Il tuo **nucleo familiare** ha ottenuto la Carta della Cultura per il: +* **202Y** +* **202Z** + +Per gli altri anni, invece, la richiesta non è stata accolta: +* **202X** : +* **202V** : +* **202K** : + +Puoi trovare la tua Carta nella sezione Portafoglio e usarla per acquistare libri, generando uno o più buoni in base al credito disponibile. +` + } +]; + +export const createCDCMessages = ( + customConfig: IoDevServerConfig +): CreatedMessageWithContentAndAttachments[] => { + // feature flag guard + if (!customConfig.features?.bonus?.cdc?.enabled) { + return []; + } + + const fiscalCode = customConfig.profile.attrs.fiscal_code; + + return createCdcMessageTemplates.map(template => { + const { id, created_at } = nextMessageIdAndCreationDate(); + + return validatePayload(CreatedMessageWithContent, { + content: template, + created_at, + fiscal_code: fiscalCode, + id, + message_title: template.subject ?? "This message has no title", + sender_service_id: cdcServiceId, + service_name: "Ministero della Cultura" + }); + }); +}; diff --git a/src/features/services/persistence/services/special/cdc-service.ts b/src/features/services/persistence/services/special/cdc-service.ts index 7b26b736..299b9c35 100644 --- a/src/features/services/persistence/services/special/cdc-service.ts +++ b/src/features/services/persistence/services/special/cdc-service.ts @@ -10,7 +10,7 @@ import { SpecialServiceCategoryEnum } from "../../../../../../generated/definiti import { SpecialServiceMetadata } from "../../../../../../generated/definitions/services/SpecialServiceMetadata"; import { ServiceId } from "../../../../../../generated/definitions/services/ServiceId"; -const cdcServiceId = "01G2AFTME08TS0QD2P2S682CJ0" as ServiceId; +export const cdcServiceId = "01G2AFTME08TS0QD2P2S682CJ0" as ServiceId; export const createCdcService: SpecialServiceGenerator = ( createService: (serviceId: string) => ServiceDetails, diff --git a/src/populate-persistence.ts b/src/populate-persistence.ts index 07984da5..c41d82cf 100644 --- a/src/populate-persistence.ts +++ b/src/populate-persistence.ts @@ -53,6 +53,7 @@ import { AggregatedMessage, productionMessagesFileRelativePath } from "./features/messages/routers/productionCrawlerRouter"; +import { createCDCMessages } from "./features/cdc/services/messageService"; const getServiceId = (): string => { const servicesSummaries = ServicesDB.getSummaries(true); @@ -487,7 +488,9 @@ const createMessages = ( ...createSENDOptInMessage(customConfig), ...createSENDMessagesOnIO(customConfig), - ...createMessagesWithRemoteContent(customConfig) + ...createMessagesWithRemoteContent(customConfig), + + ...createCDCMessages(customConfig) ]; }; From 7a0d38486665fd643c55219caa44850f817eea3b Mon Sep 17 00:00:00 2001 From: pawelPrzywara Date: Tue, 9 Dec 2025 12:50:46 +0100 Subject: [PATCH 2/5] fix: remove non-localized en ctas --- src/features/cdc/services/messageService.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/features/cdc/services/messageService.ts b/src/features/cdc/services/messageService.ts index bcfbf1d9..43691652 100644 --- a/src/features/cdc/services/messageService.ts +++ b/src/features/cdc/services/messageService.ts @@ -13,13 +13,6 @@ it: cta_1: text: "Vai alla Carta della Cultura" action: "ioit://main/wallet" -en: - cta_2: - text: "Dove puoi usarla" - action: "https://www.cartadellacultura.it/cartaculturaEsercente/#/doveUsareBuoni" - cta_1: - text: "Vai alla Carta della Cultura" - action: "iohandledlink://https://ec.europa.eu/eusurvey/runner/Questionario_comportamenti_giovanili" ---`; const createCdcMessageTemplates = [ From abda6fb52b989a9c8afa38d8167bb03544fed446 Mon Sep 17 00:00:00 2001 From: pawelPrzywara Date: Wed, 10 Dec 2025 09:13:15 +0100 Subject: [PATCH 3/5] chore: standard messages format --- src/features/cdc/services/messageService.ts | 69 +++++---------------- 1 file changed, 17 insertions(+), 52 deletions(-) diff --git a/src/features/cdc/services/messageService.ts b/src/features/cdc/services/messageService.ts index 43691652..ac446987 100644 --- a/src/features/cdc/services/messageService.ts +++ b/src/features/cdc/services/messageService.ts @@ -5,62 +5,27 @@ import { validatePayload } from "../../../utils/validator"; import { cdcServiceId } from "../../services/persistence/services/special/cdc-service"; import { CreatedMessageWithContent } from "../../../../generated/definitions/backend/CreatedMessageWithContent"; -const successCtasMarkdown = `--- -it: - cta_2: - text: "Dove puoi usarla" - action: "iohandledlink://https://www.cartadellacultura.it/cartaculturaEsercente/#/doveUsareBuoni" - cta_1: - text: "Vai alla Carta della Cultura" - action: "ioit://main/wallet" ----`; - const createCdcMessageTemplates = [ { - subject: "La tua Carta della Cultura è pronta!", - markdown: `${successCtasMarkdown} -Ciao! -Il tuo **nucleo familiare** ha ottenuto la Carta della Cultura per il: -* **202Y** -* **202Z** - -È disponibile ora nella sezione Portafoglio. - -Puoi usarla per acquistare libri, sia cartacei che digitali, generando uno o più buoni in base al credito disponibile. - -Vuoi avere più informazioni su come usare i buoni? [Leggi come fare](https://link.alla.guida.come.fare) -` + content: { + subject: "La tua Carta della Cultura è pronta!", + markdown: + '---\nit:\n cta_2:\n text: "Dove puoi usarla"\n action: "iohandledlink://https://www.cartadellacultura.it/cartaculturaEsercente/#/doveUsareBuoni"\n cta_1:\n text: "Vai alla Carta della Cultura"\n action: "ioit://main/wallet"\n---\nCiao!\nIl tuo **nucleo familiare** ha ottenuto la Carta della Cultura per il:\n* **202Y**\n* **202Z**\n\nÈ disponibile ora nella sezione Portafoglio.\n\nPuoi usarla per acquistare libri, sia cartacei che digitali, generando uno o più buoni in base al credito disponibile.\n\nVuoi avere più informazioni su come usare i buoni? [Leggi come fare](https://pagopa.zendesk.com/auth/v2/login/signin?auth_origin=30056501290385%2Ctrue%2Ctrue&brand_id=30056501290385&locale=22&return_to=https%3A%2F%2Fassistenza.ioapp.it%2Fhc&role=agent&theme=hc)\n' + } }, { - subject: "Non è stato possibile assegnarti la Carta della Cultura", - markdown: `Ciao! -Purtroppo non è stato possibile assegnarti la Carta della Cultura. - -La richiesta non è stata accolta, ecco perché: -* **202X** : -* **202V** : -* **202K** : - -Grazie per aver partecipato all’iniziativa. -` + content: { + subject: "Non è stato possibile assegnarti la Carta della Cultura", + markdown: + "Ciao!\nPurtroppo non è stato possibile assegnarti la Carta della Cultura.\n\nLa richiesta non è stata accolta, ecco perché:\n* **202X** : \n* **202V** : \n* **202K** : \n\nGrazie per aver partecipato all’iniziativa." + } }, { - subject: "Carta della Cultura: abbiamo aggiornamenti sulla tua richiesta", - markdown: `${successCtasMarkdown} -Ciao! -Ecco l’esito delle tue richieste per l’ottenimento della Carta della Cultura. - -Il tuo **nucleo familiare** ha ottenuto la Carta della Cultura per il: -* **202Y** -* **202Z** - -Per gli altri anni, invece, la richiesta non è stata accolta: -* **202X** : -* **202V** : -* **202K** : - -Puoi trovare la tua Carta nella sezione Portafoglio e usarla per acquistare libri, generando uno o più buoni in base al credito disponibile. -` + content: { + subject: "Carta della Cultura: abbiamo aggiornamenti sulla tua richiesta", + markdown: + '---\nit:\n cta_2:\n text: "Dove puoi usarla"\n action: "iohandledlink://https://www.cartadellacultura.it/cartaculturaEsercente/#/doveUsareBuoni"\n cta_1:\n text: "Vai alla Carta della Cultura"\n action: "ioit://main/wallet"\n---\nCiao!\nEcco l’esito delle tue richieste per l’ottenimento della Carta della Cultura.\n\nIl tuo **nucleo familiare** ha ottenuto la Carta della Cultura per il:\n* **202Y**\n* **202Z**\n\nPer gli altri anni, invece, la richiesta non è stata accolta:\n* **202X** : \n* **202V** : \n* **202K** : \n\nPuoi trovare la tua Carta nella sezione Portafoglio e usarla per acquistare libri, generando uno o più buoni in base al credito disponibile.' + } } ]; @@ -78,11 +43,11 @@ export const createCDCMessages = ( const { id, created_at } = nextMessageIdAndCreationDate(); return validatePayload(CreatedMessageWithContent, { - content: template, + content: template.content, created_at, fiscal_code: fiscalCode, id, - message_title: template.subject ?? "This message has no title", + message_title: template.content.subject ?? "This message has no title", sender_service_id: cdcServiceId, service_name: "Ministero della Cultura" }); From 040657b3a3d84b262922d1319e28a7bdfc959ba5 Mon Sep 17 00:00:00 2001 From: pawelPrzywara Date: Wed, 10 Dec 2025 16:06:24 +0100 Subject: [PATCH 4/5] chore: rename fiscalCode to fiscal_code --- src/features/cdc/services/messageService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/features/cdc/services/messageService.ts b/src/features/cdc/services/messageService.ts index ac446987..c98781bd 100644 --- a/src/features/cdc/services/messageService.ts +++ b/src/features/cdc/services/messageService.ts @@ -37,7 +37,7 @@ export const createCDCMessages = ( return []; } - const fiscalCode = customConfig.profile.attrs.fiscal_code; + const fiscal_code = customConfig.profile.attrs.fiscal_code; return createCdcMessageTemplates.map(template => { const { id, created_at } = nextMessageIdAndCreationDate(); @@ -45,7 +45,7 @@ export const createCDCMessages = ( return validatePayload(CreatedMessageWithContent, { content: template.content, created_at, - fiscal_code: fiscalCode, + fiscal_code, id, message_title: template.content.subject ?? "This message has no title", sender_service_id: cdcServiceId, From 90a00badc0a3f4264af34a7a0d5a8e45520c2a78 Mon Sep 17 00:00:00 2001 From: pawelPrzywara Date: Wed, 10 Dec 2025 16:28:15 +0100 Subject: [PATCH 5/5] chore: removed optional chaining --- src/features/cdc/services/messageService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/cdc/services/messageService.ts b/src/features/cdc/services/messageService.ts index c98781bd..4c02e962 100644 --- a/src/features/cdc/services/messageService.ts +++ b/src/features/cdc/services/messageService.ts @@ -33,7 +33,7 @@ export const createCDCMessages = ( customConfig: IoDevServerConfig ): CreatedMessageWithContentAndAttachments[] => { // feature flag guard - if (!customConfig.features?.bonus?.cdc?.enabled) { + if (!customConfig.features.bonus.cdc.enabled) { return []; }