diff --git a/app/src/data/mock/data.js b/app/src/data/mock/data.js index b331257..24969ad 100644 --- a/app/src/data/mock/data.js +++ b/app/src/data/mock/data.js @@ -15,7 +15,8 @@ export const terms = { name: 'Grippe', alias: [], types: [termTypes.disease], - weight: 0.000035, + weight: -10.68959934320834, + url: 'https://fr.wikipedia.org/wiki/Grippe', }, Q154882: { id: 'Q154882', @@ -24,14 +25,16 @@ export const terms = { 'Maladie des légionnaires', ], types: [termTypes.disease], - weight: 0.000015, + weight: -11.05394782419729, + url: 'https://fr.wikipedia.org/wiki/Légionellose', }, Q155098: { id: 'Q155098', name: 'Leptospirose', alias: [], types: [termTypes.disease], - weight: 0.00001, + weight: -11.3969031483456 , + url: 'https://fr.wikipedia.org/wiki/Leptospirose', }, Q326663: { id: 'Q326663', @@ -47,23 +50,28 @@ export const terms = { 'Maladie de Kumlinge', ], types: [termTypes.disease], - weight: 0.000001, + weight: -13.862833353191204, + url: 'https://fr.wikipedia.org/wiki/Encéphalite_à_tiques', }, Q133780: { id: 'Q133780', name: 'Peste', alias: [], types: [termTypes.disease], - weight: 0.000032, + weight: -10.356303313736584, + url: 'https://fr.wikipedia.org/wiki/Peste', }, Q38933: { id: 'Q38933', name: 'Fièvre', alias: [ 'Pyrexie', + 'Hyperthermie', + 'État fébrile', ], types: [termTypes.symptom], - weight: 0, + weight: -10.83729224261442, + url: 'https://wikimedi.ca/wiki/Fièvre', }, Q474959: { id: 'Q474959', @@ -72,7 +80,8 @@ export const terms = { 'Douleur musculaire', ], types: [termTypes.symptom], - weight: 0, + weight: -12.475240614075794, + url: 'https://fr.wikipedia.org/wiki/Myalgie', }, Q86: { id: 'Q86', @@ -81,7 +90,8 @@ export const terms = { 'Mal de tête', ], types: [termTypes.sign], - weight: 0, + weight: -11.042885864744003, + url: 'https://wikimedi.ca/wiki/C%C3%A9phal%C3%A9e', }, Q1115038: { id: 'Q1115038', @@ -91,14 +101,16 @@ export const terms = { 'Écoulement nasal', ], types: [termTypes.symptom], - weight: 0, + weight: -13.291547222741679, + url: 'https://fr.wikipedia.org/wiki/Rhinorrh%C3%A9e', }, Q9690: { id: 'Q9690', name: 'Fatigue', alias: [], types: [termTypes.symptom], - weight: 0, + weight: -12.8932707907014, + url: 'https://wikimedi.ca/wiki/Fatigue', }, Q127076: { id: 'Q127076', @@ -109,7 +121,8 @@ export const terms = { 'Vomir', ], types: [termTypes.symptom, termTypes.sign], - weight: 0, + weight: -11.76320423121043, + url: 'https://fr.wikipedia.org/wiki/Vomissement', }, Q178061: { id: 'Q178061', @@ -118,7 +131,8 @@ export const terms = { 'Insuffisance circulatoire aiguë', ], types: [termTypes.disease], - weight: 0.000038, + weight: -12.48541367835562, + url: 'https://fr.wikipedia.org/wiki/État_de_choc_circulatoire', }, Q35805: { id: 'Q35805', @@ -128,53 +142,64 @@ export const terms = { 'Toussote', ], types: [termTypes.symptom, termTypes.sign], - weight: 0, + weight: -12.62883965458582, + url: 'https://wikimedi.ca/wiki/Toux', }, Q647099: { id: 'Q647099', name: 'Hémoptysie', alias: [ 'Expectoration sanglante', + 'Crachat sanguin', ], types: [termTypes.symptom], - weight: 0, + weight: -11.816428715881282, + url: 'https://wikimedi.ca/wiki/Hémoptysies', }, Q653197: { id: 'Q653197', name: 'Rash', - alias: [], + alias: [ + 'Éruption cutanée', + ], types: [termTypes.symptom, termTypes.sign], - weight: 0, + weight: -13.089336365426849, + url: 'https://fr.wikipedia.org/wiki/Rash_(médecine)', }, Q160796: { id: 'Q160796', name: 'Syndrome confusionnel', alias: [ 'Confusion mentale', + 'Délirium', ], types: [termTypes.disease], - weight: 0.000004, + weight: -12.406564919730442, + url: 'https://wikimedi.ca/wiki/Délirium', }, Q186235: { id: 'Q186235', name: 'Myocardite', alias: [], types: [termTypes.disease], - weight: 0.0000075, + weight: -11.874480758774315, + url: 'https://fr.wikipedia.org/wiki/Myocardite', }, Q476921: { id: 'Q476921', name: 'Insuffisance rénale', alias: [], types: [termTypes.disease], - weight: 0.0000046, + weight: -12.359763775778456, + url: 'https://fr.wikipedia.org/wiki/Insuffisance_rénale', }, Q281289: { id: 'Q281289', name: 'Photophobie', alias: [], types: [termTypes.sign], - weight: 0, + weight: -12.568109501931065, + url: 'https://fr.wikipedia.org/wiki/Photophobie', }, Q159557: { id: 'Q159557', @@ -185,7 +210,8 @@ export const terms = { 'Perte de connaissance', ], types: [termTypes.sign], - weight: 0, + weight: -11.415040299689283, + url: 'https://wikimedi.ca/wiki/Coma', }, }; diff --git a/app/src/data/model.js b/app/src/data/model.js index 61d886f..c16121d 100644 --- a/app/src/data/model.js +++ b/app/src/data/model.js @@ -14,36 +14,102 @@ export const termTypes = { sign: 'Signe', }; +/** + * Crée un valideur de type de propriété React supportant l’extension + * `.isRequired` pour marquer une propriété comme requise. + * + * @param basicValidator Fonction basique de validation. + * @return Fonction augmentée supportant l’extension `.isRequired`. + */ +const makePropType = basicValidator => +{ + const validator = (props, propName, componentName) => + { + // Version optionnelle : on n’appelle le valideur que si la propriété a + // été passée + if (propName in props) + { + return basicValidator(props, propName, componentName); + } + }; + + validator.isRequired = (props, propName, componentName) => + { + // Version obligatoire : on jette une erreur si la propriété n’a pas + // été passée puis on procède à la validation + if (!(propName in props)) + { + return new Error( + `Missing prop “${propName}” in props supplied to ` + + `${componentName}.` + ); + } + + return basicValidator(props, propName, componentName); + }; + + return validator; +}; + /** * Type de terme. */ export const TermType = PropTypes.oneOf(Object.values(termTypes)); +/** + * URL. + */ +const URL = makePropType((props, propName, componentName) => +{ + const value = props[propName]; + + if (typeof value !== 'string') + { + return new Error( + `URL passed as ${componentName}’s ${propName} prop must be ` + + `a string, not a ${typeof value}.` + ); + } + + if (!value.startsWith('http://') && !value.startsWith('https://')) + { + return new Error( + `URL “${value}”, passed as ${componentName}’s ${propName} ` + + `prop, does not start with “http://” or “https://”.` + ); + } +}); + /** * Terme. * * Peut être une maladie, un symptôme ou un signe. */ export const Term = PropTypes.exact({ + // Identifiant unique id: PropTypes.string.isRequired, + + // Nom canonique name: PropTypes.string.isRequired, + + // Noms alternatifs alias: PropTypes.arrayOf(PropTypes.string).isRequired, + + // Types (maladie, symptôme, signe) types: PropTypes.arrayOf(TermType).isRequired, + + // Facteur d’importance weight: PropTypes.number.isRequired, + + // Adresse de la ressource de référence + url: URL.isRequired, }); /** * Relation entre deux termes. */ -export const Relation = (props, propName, componentName) => +export const Relation = makePropType((props, propName, componentName) => { - if (!(propName in props)) - { - return new Error( - `Missing ${propName} in props supplied to ${componentName}.` - ); - } - const value = props[propName]; if (!Array.isArray(value)) @@ -59,14 +125,4 @@ export const Relation = (props, propName, componentName) => `Relation ${propName} must contain exactly two entries.` ); } - - if ( - typeof value[0] !== 'string' - || typeof value[1] !== 'string' - ) - { - return new Error( - `Entries of relation ${propName} must be string IDs.` - ); - } -}; +});