diff --git a/src/app/medicament/[CIS]/page.tsx b/src/app/medicament/[CIS]/page.tsx index 06360c4..8171458 100644 --- a/src/app/medicament/[CIS]/page.tsx +++ b/src/app/medicament/[CIS]/page.tsx @@ -18,7 +18,6 @@ import liste_CIS_MVP from "@/liste_CIS_MVP.json"; import DsfrLeafletSection from "@/app/medicament/[CIS]/DsfrLeafletSection"; import { isHtmlElement } from "@/app/medicament/[CIS]/leafletUtils"; import { - atcToBreadcrumbs, dateShortFormat, displayComposants, formatSpecName, @@ -37,6 +36,7 @@ import { Specialite, SubstanceNom, } from "@/db/pdbmMySQL/types"; +import { getAtcLabels } from "@/data/atc"; export async function generateMetadata( { params: { CIS } }: { params: { CIS: string } }, @@ -311,7 +311,7 @@ export default async function Page({ await getSpecialite(CIS); const leaflet = await getLeaflet(CIS); const atc = getAtc(CIS); - const atcBreadcrumbs = atc ? atcToBreadcrumbs(atc) : null; + const atcBreadcrumbs = atc ? await getAtcLabels(atc) : null; return ( <> diff --git a/src/data/ATC-labels-1.json b/src/data/ATC-labels-1.json deleted file mode 100644 index 979eac3..0000000 --- a/src/data/ATC-labels-1.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "A": "Système digestif", - "B": "Système sanguin", - "C": "Système cardiovasculaire", - "D": "Peau", - "G": "Système génital, urinaire et hormones sexuelles", - "H": "Hormones, thyroïde, corticoïdes", - "J": "Antibiotiques, anti-virus, vaccins", - "L": "Anti-cancéreux, système immunitaire", - "M": "Muscles et os", - "N": "Système nerveux", - "P": "Antiparasitaires, insecticides et répulsifs", - "R": "Système respiratoire", - "S": "Yeux et oreilles", - "V": "Divers" -} \ No newline at end of file diff --git a/src/data/ATC-labels-2.json b/src/data/ATC-labels-2.json deleted file mode 100644 index 5269c15..0000000 --- a/src/data/ATC-labels-2.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "A01": "Bouche et dents", - "A02": "Troubles de l'acidité", - "A03": "Troubles gastro-intestinaux", - "A04": "Nausée et vomissement", - "A05": "Foie et bile", - "A06": "Troubles du transit (constipation, diarrhée)", - "A07": "Troubles du transit (constipation, diarrhée)", - "A08": "Aide à la digestion", - "A09": "Aide à la digestion", - "A10": "Diabète", - "A11": "Vitamines, suppléments, stimulants", - "A12": "Vitamines, suppléments, stimulants", - "A13": "Vitamines, suppléments, stimulants", - "A14": "Vitamines, suppléments, stimulants", - "A15": "Vitamines, suppléments, stimulants", - "A16": "Aide à la digestion", - "B01": "Caillots sanguins", - "B02": "Hémorragie", - "B03": "Anémie", - "B05": "Perfusion sanguine", - "B06": "Perfusion sanguine", - "C01": "Médicaments pour le cœur", - "C02": "Régulation de la tension", - "C03": "Médicaments pour le cœur", - "C04": "Médicaments pour les vaisseaux sanguins", - "C05": "Médicaments pour les vaisseaux sanguins", - "C07": "Médicaments pour les vaisseaux sanguins", - "C08": "Médicaments pour les vaisseaux sanguins", - "C09": "Médicaments pour les vaisseaux sanguins", - "C10": "Statines (cholestérol)", - "D01": "Anti-champignons de peau", - "D02": "Crèmes protectrices et apaisantes", - "D03": "Crèmes protectrices et apaisantes", - "D04": "Crèmes protectrices et apaisantes", - "D05": "Psoriasis", - "D06": "Produits de chimiothérapie dermato", - "D07": "Cicatrisants", - "D08": "Antiseptiques et désinfectants", - "D09": "Antiseptiques et désinfectants", - "D10": "Médicaments contre l'acné", - "D11": "Autres produits dermato", - "G01": "Anti-infectieux et antiseptiques gynéco", - "G02": "Autres produits gynéco", - "G03": "Hormones sexuelles, contraceptifs, troubles de l'érection, prostate", - "G04": "Problèmes urinaires", - "H01": "Hormones", - "H02": "Corticoïdes", - "H03": "Médicaments de la thyroïde", - "H04": "Hormones", - "H05": "Médicaments de la thyroïde", - "J01": "Antibiotiques", - "J02": "Anti-champignons", - "J04": "Antibiotiques", - "J05": "Anti-virus", - "J06": "Immunité et anticorps", - "J07": "Vaccins", - "L01": "Anticancéreux", - "L02": "Endocrinologie", - "L03": "Stimulation du système immunitaire", - "L04": "Médicaments pour les maladies auto-immune, anti-rejet lors de greffes", - "M01": "Anti-inflammatoires et antirhumatismaux", - "M02": "Problèmes musculaires", - "M03": "Problèmes musculaires", - "M04": "Traitement de la goutte", - "M05": "Problèmes d'os", - "M09": "Problèmes d'os", - "N01": "Anesthésie", - "N02": "Anti-douleur", - "N03": "Anti-épileptiques", - "N04": "Maladie de Parkinson", - "N05": "Médicaments qui apaisent le psychisme", - "N06": "Antidépresseurs et stimulants", - "N07": "Troubles de l'addiction", - "P01": "Anti-parasites", - "P02": "Vermifuges", - "P03": "Répulsifs", - "R01": "Décongestionnants pour le nez", - "R02": "Médicaments pour la gorge", - "R03": "Voies respiratoires", - "R05": "Rhume et toux", - "R06": "Allergies", - "R07": "Autres médicaments du système respiratoire", - "S01": "Médicaments pour les yeux", - "S02": "Médicaments pour les oreilles", - "S03": "Préparations pour yeux et oreilles", - "V01": "Non classés", - "V03": "Non classés", - "V04": "Produits pour examens", - "V06": "Non classés", - "V07": "Produits pour examens", - "V08": "Produits de radio", - "V09": "Non classés", - "V10": "Non classés", - "V20": "Non classés" -} \ No newline at end of file diff --git a/src/data/atc.ts b/src/data/atc.ts new file mode 100644 index 0000000..adc8995 --- /dev/null +++ b/src/data/atc.ts @@ -0,0 +1,62 @@ +import "server-only"; +import atcOfficialLabels from "@/data/ATC 2024 02 15.json"; + +async function getGristTableData(tableId: string) { + const response = await fetch( + `https://grist.numerique.gouv.fr/api/docs/${process.env.GRIST_DOC_ID}/tables/${tableId}/records`, + { + headers: { + Authorization: `Bearer ${process.env.GRIST_API_KEY}`, + }, + }, + ); + return await response.json(); +} + +async function getAtcLabel1(code: string): Promise { + const data = await getGristTableData("Table_Niveau_1"); + const record = data.records.find( + (record: any) => record.fields.Lettre_1_ATC_1 === code.slice(0, 1), + ); + if (!record) { + throw new Error(`ATC code not found: ${code.slice(0, 1)}`); + } + + return record.fields.Libelles_niveau_1; +} + +async function getAtcLabel2(code: string): Promise { + const atcData = await getGristTableData("Table_Niveau_2"); + const record = atcData.records.find( + (record: any) => record.fields.Lettre_2_ATC2 === code.slice(0, 3), + ); + if (!record) { + throw new Error(`ATC code not found: ${code.slice(0, 3)}`); + } + + const libeleId = record.fields.Libelles_niveau_2; + const libeleData = await getGristTableData("Intitules_possibles"); + const libeleRecord = libeleData.records.find( + (record: any) => record.id === libeleId, + ); + + if (!libeleRecord) { + throw new Error(`ATC code not found: ${code.slice(0, 3)}`); + } + + return libeleRecord.fields.Libelles_niveau_2; +} + +async function getAtcOfficialLabel(code: string): Promise { + if (!(code.slice(0, 7) in atcOfficialLabels)) { + throw new Error(`ATC code not found: ${code.slice(0, 7)}`); + } + + return (atcOfficialLabels as Record)[code.slice(0, 7)]; +} + +export async function getAtcLabels(atc: string): Promise { + return Promise.all( + [getAtcLabel1, getAtcLabel2, getAtcOfficialLabel].map((f) => f(atc)), + ); +} diff --git a/src/displayUtils.ts b/src/displayUtils.ts index 6acada5..d401779 100644 --- a/src/displayUtils.ts +++ b/src/displayUtils.ts @@ -4,9 +4,6 @@ import { Specialite, SubstanceNom, } from "@/db/pdbmMySQL/types"; -import atcLabels1 from "@/data/ATC-labels-1.json"; -import atcLabels2 from "@/data/ATC-labels-2.json"; -import atcOfficialLabels from "@/data/ATC 2024 02 15.json"; export const formatSpecName = (name: string): string => name @@ -116,19 +113,6 @@ export function displayComposants( .join("; "); } -export function atcToBreadcrumbs(atc: string): string[] { - return [ - [1, atcLabels1] as [number, Record], - [3, atcLabels2] as [number, Record], - [7, atcOfficialLabels] as [number, Record], - ].map(([i, labels]) => { - if (!(atc.slice(0, i) in labels)) { - throw new Error(`ATC code not found: ${atc.slice(0, i)}`); - } - return labels[atc.slice(0, i)]; - }); -} - export function dateShortFormat(date: Date): string { return date.toLocaleDateString("fr-FR", { year: "numeric",