
  
mdEdit 3

Opérations de base.
1. Installer et mettre à jour l'application
2. Charger les fichiers de configuration
3. Charger une fiche modèle (XML)
4. Charger une fiche de donnée (XML) 
5. Fusionner la fiche modèle et la fiche données
6. Travailler sur les opérations de base (à partir des contacts - object le plus complexe à gérer)

- Lire un élément:
    - md.getObjects(mdjs, xpath) : récupérer tous les contacts
    - md.getObject(mdjs, xpath, id) => md.getObjects(mdjs, xpath)[id] : récupérer le contact n°3 
    - md.getValues(mdjs, xpath) : récupérer tous les organismes de tous les contacts ou tous les emails d'un contact (mdjs = contacts)
    - md.getValue(mdjs, xpath, id) => md.getValues(mdjs, xpath)[id] : récupèrer un email d'un contact (mdjs = contact)
- Ajouter un élément à une liste:
    - md.addObject(objects, xpath, value) => md.addObject(contact, contacts) : ajouter un contact à la liste des contacts. Attention, cela doit se faire de façon récursive sur mdjs. Dans le détail:
        - Créer l'objet de base: object = md.setObject({}, xpath, value)
        - Ajouter l'objet à la liste des autres objets: objects.push(object)
        - Cas particulier si la liste n'existe pas?
- Mettre à jour un élément dans une liste:
    - md.updateObject(objects, id, xpath, value) => md.updateObject(contacts, 3, contact) : met à jour le contact n°3 de la liste des contacts. Dans le détail:
        - Récupérer la liste et l'objet concerné: object = md.getObject(mdjs, xpath, id)
        - Modifier l'objet avec sa nouvelle valeur: md.setObject(object, xpath, value)
        - Modifier la liste: objects[id] = object
- Supprimer un élément dans une liste:
    - md.deleteObject(objects, id)
        
A analyser plus finement: le lien entre objet et valeur. 
Ajouter un email à un contact revient à:
    - Récupérer la liste des contacts et le contact correspondant dans le fiche de métadonnées
    - Récupérer la liste des emails du contact
    - * Créer un objet email avec la valeur correspondante
    - * Ajouter le nouvel objet email à la liste des emails du contact
    - Mettre à jour la liste des emails du contact avec la nouvelle liste d'emails
    - Mettre à jour la liste des contacts avec le contact modifié
    - Mettre à jour la fiche de métadonnées avec la nouvelle liste de contacts 
Mettre à jour un email revient à:
    - Récupérer la liste des contacts et le contact correspondant dans le fiche de métadonnées
    - Récupérer la liste des emails du contact
    - * Mettre à jour l'email dans la liste des emails du contact
    - Mettre à jour la liste des emails du contact avec la nouvelle liste d'emails
    - Mettre à jour la liste des contacts avec le contact modifié
    - Mettre à jour la fiche de métadonnées avec la nouvelle liste de contacts
Supprimer un email revient à:
    - Récupérer la liste des contacts et le contact correspondant dans le fiche de métadonnées
    - Récupérer la liste des emails du contact
    - * Supprimer l'email dans la liste des emails du contact
    - Mettre à jour la liste des emails du contact avec la nouvelle liste d'emails
    - Mettre à jour la liste des contacts avec le contact modifié
    - Mettre à jour la fiche de métadonnées avec la nouvelle liste de contacts
    
    
    
Analyse des bibliothèques disponibles:
- Conversion XML <=> JS
    - xml2js
    - fast-xml-parser
    - xml-js
- Utilisation des xpaths
    - json-path
    - jsonpath-plus
    - lodash.get()
- Set value à partir d'un xpath 
    - lodash.set()
    
    
    
Test de lodash (simulation)

Objectif:
    1. Lister les contacts (organisme)
    2. Lister les emails d'un contact
    3. Lister les emails de tous les contacts
    4. Mettre à jour l'organisme d'un contact
    5. Mettre à jour l'email d'un contact
    6. Supprimer l'eamil d'un contact
    

La variable "mdjs" est l'objet représentant le XML.

// xpaths
xpaths.mdContacts = 'gmd:MD_Metadata[0].gmd:contact';
xpaths.contact.organisationName = 'gmd:CI_ResponsibleParty[0].gmd:organisationName[0].gco:CharacterString[0]._text[0]';
xpaths.contact.emails = 'gmd:CI_ResponsibleParty[0].gmd:contactInfo[0].gmd:CI_Contact[0].gmd:address[0].gmd:CI_Address[0].gmd:electronicMailAddress[*]';
xpaths.contact.email = 'gco:CharacterString[0]._text[0]';

// Lister les contacts (organismes)
// md.getValues(mdjs, [xpaths.mdContacts, xpaths.contact.organisationName])
var contacts = lodash.get(mdjs, xpaths.mdContacts, []);
var organisationNames = [];
for (var i=0; i<contacts.lenght; i++) {
    organisationNames.push(lodash.get(contacts[i], xpaths.contact.organisationName, []))
}

// Lister les emails d'un contact
// md.getValues(mdjs, [xpaths.mdContacts + '[2]', xpaths.contact.emails])
var contacts = lodash.get(mdjs, xpaths.mdContacts, []);
var contact = contacts[2];
var emails = lodash.get(contact, xpaths.contact.emails, []);
var emailsList = [];
for (var i=0; i<emails.lenght; i++) {
    emailsList.push(lodash.get(emails[i], xpaths.contact.emails, []))
}

// Lister les emails de tous les contacts
// md.getValue(mdjs, [xpaths.mdContacts, xpaths.contact.emails], xpaths.contact.email)
var contacts = lodash.get(mdjs, xpaths.mdContacts, []);
var emailsList = [];
for (var i=0; i<contacts.lenght; i++) {
    var emails = lodash.get(contacts[i], xpaths.contact.emails, []);
    for (var j=0; j<emails.lenght; j++) {
        emailsList.push(lodash.get(emails[i], xpaths.contact.email, []))
    }
}

// Récupérer un contact par la valeur de son email (ex.: 'test@test.fr')
// md.getObject(mdjs, [xpaths.mdContacts, xpaths.contact.emails], [xpaths.contact.email], 'test@test.fr')
var contacts = lodash.get(mdjs, xpaths.mdContacts, []);
contact = contacts.filter(c => {
    var emails = lodash.get(c, xpaths.contact.emails, []);
    for (var j=0; j<emails.lenght; j++) {
        emailsList.push(lodash.get(emails[i], xpaths.contact.email))
    }
    return emailsList.includes('test@test.fr');
})

// Mettre à jour l'organisme d'un contact
var contacts = lodash.get(mdjs, xpaths.mdContacts, []);
contacts[2] = lodash.set(contact[2], xpaths.contact.organisationName, 'New name');
mdjs = lodash.set(mdjs, xpaths.mdContacts, contacts);

// Mettre à jour l'email d'un contact
var contacts = lodash.get(mdjs, xpaths.mdContacts, []);
var emails = lodash.get(contacts[2], xpaths.contact.emails, []);
emails[1] = lodash.set(emails[1], xpaths.contact.email, 'newEmailValue');
contacts[2] = lodash.set(contacts[2], xpaths.contact.emails, emails);
mdjs = lodash.set(mdjs, xpaths.mdContacts, contacts);

// Autre possibilité
var contacts = lodash.get(mdjs, xpaths.mdContacts, []);
var contact = contacts[2];
var emails = lodash.get(contact, xpaths.contact.emails, []);
emails[1] = lodash.set({}, xpaths.contact.email, 'newEmailValue');
contact = lodash.set(contact, xpaths.contact.emails, emails);
contacts[2] = contact;
mdjs = lodash.set(mdjs, xpaths.mdContacts, contacts);

// Ajouter un nouveau contact (organisme + email)
var contacts = lodash.get(mdjs, xpaths.mdContacts, []);
var contact = {};
var email = lodash.set({}, xpaths.contact.email, 'newEmailValue');
contact = lodash.set(contact, xpaths.contact.emails, [email]);
contact = lodash.set(contact, xpaths.contact.organisationName, 'newOrgValue');
contacts.push(contact);
mdjs = lodash.set(mdjs, xpaths.mdContacts, contacts);

// Supprimer l'email d'un contact
var contacts = lodash.get(mdjs, xpaths.mdContacts, []);
var emails = lodash.unset(contacts[2], xpaths.contact.emails + '[2]', []);
mdjs = lodash.set(mdjs, xpaths.mdContacts, contacts);


