Source: plateform/Usersgroup/index.js

import { _httpCallAuthenticated } from "../main/3dexperience_api";

//LINK - https://media.3ds.com/support/documentation/developer/Cloud/en/English/CAAi3DXUGREST/UsersGroup_v1.htm#
//!SECTION, Pour faire des modification de UG il faut être OWNER

// URI de test sur le tenant PIVETEAU_TEST:
const _uri = "uuid:3fcb61f2-6417-476d-8a9c-a16fb888771e";

const topHeader = {
  "Content-Type": "application/json",
  Accept: "application/json,text/javascript,*/*",
};

/**
 * @description La fonction `createUserGroups` crée un nouveau groupe d'utilisateurs avec les détails et les membres
 * spécifiés. Attention, l'indexation du UserGroup met du temps.

 * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier
 * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».
 * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)
 * @param {Object} credentials.currentUser.email - Le paramètre `currentUser` est un qui contient les informations de l'utilisateur qui envoie le message(appeler depuis la fonction `_3DSwym_get_currentuser`).
 * 
 * @param {Object} datas - Les informations du groupe d'utilisateurs.
 * @param {String} datas.title - Le titre du groupe d'utilisateurs. Entre 3 et 128 caractères, obligatoire.
 * @param {String} datas.description - La description du groupe d'utilisateurs. 512 caractères max.
 * @param {Array} datas.members - Un tableau d'emails des membres du groupe d'utilisateurs. 100 max email par groupe.
 * @param {String} datas.sharing - Le droit de partage du groupe d'utilisateurs. owner/manager/viewer
 * @param {String} datas.visibility - La visibilité du groupe d'utilisateurs. public/private
 * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque l'appel d'API réussit et que les
 * groupes d'utilisateurs sont créés. Il recevra les données de réponse comme argument.
 * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une
 * erreur lors de l'exécution de la fonction `createUserGroups`. Il vous permet de gérer et de traiter
 * l'erreur de manière personnalisée.
 */
export function createUserGroups(
  credentials,
  datas,
  onDone = undefined,
  onError = undefined,
) {
  const { space, currentUser } = credentials;
  const URL = {
    URIUGr: "/3drdfpersist/resources/v1/usersgroup",
  };
  const url = `${space}${URL.URIUGr}`;

  const templateData = {
    groups: [
      {
        title: datas.title,
        description: datas.description,
        members: datas.members || [currentUser.email, "samuel.mureau@beam3.fr"],
        pending_members: [],
        sharing: datas.sharing,
        visibility: datas.visibility,
      },
    ],
  };

  _httpCallAuthenticated(url, {
    method: "POST",
    headers: topHeader,
    data: JSON.stringify(templateData),
    onComplete(response) {
      if (onDone) onDone(JSON.parse(response));
    },
    onFailure(err, headers) {
      console.log(err);
      const info = err;
      info["msg"] = headers.errormsg;
      info["errCode"] = headers.errorcode;
      console.log("❌ sendDirectMessage => ", info);
      if (onError) onError(info);
    },
  });
}

/**
 * @description La fonction `getComplementUG` effectue une requête GET vers un URI spécifié avec les informations
 * d'authentification et renvoie la réponse.
 * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier
 * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».
 * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)
 * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)
 * @param {String} [uri] - Le paramètre `uri` est l'identifiant de la ressource dont vous souhaitez récupérer le
 * complément. (ex: uuid:dcad14cc-5bcd-45fd-a54d-246b95047d45)
 * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la
 * requête HTTP sera terminée avec succès. Il prend un argument, qui correspond aux données de réponse
 * de la requête.
 * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une
 * erreur lors de l'exécution de la fonction `getComplementUG`. Il vous permet de gérer et de traiter
 * les informations d'erreur.
 */
export function getComplementUG(
  credentials,
  uri,
  onDone = undefined,
  onError = undefined,
) {
  const { space, tenant } = credentials;
  const baseURL = space;
  const URI = `/3drdfpersist/v1/resources/${uri}`;
  const OPTs = `?$mask=dsaccess:Mask.GroupUI.Properties&tenant=dstenant:${tenant}`;
  const URL = `${baseURL}${URI}${OPTs}`;

  const headers = {
    "Content-Type": "application/json",
    Accept: "application/json,text/javascript,*/*",
  };
  const opts = {
    method: "GET",
    headers: headers,
  };

  _httpCallAuthenticated(URL, {
    opts,
    onComplete(response) {
      if (onDone) onDone(JSON.parse(response));
    },
    onFailure(err, headers) {
      const info = err;
      info["msg"] = headers.errormsg;
      info["errCode"] = headers.errorcode;

      if (onError) onError(info);
    },
  });
}

/**
 * @description La fonction `getUsersGroupRules` effectue une requête HTTP GET pour récupérer une liste de
 * responsabilités de groupe pour un groupe d'utilisateurs.
 * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier
 * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».
 * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)
 * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)
 * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la
 * requête HTTP sera terminée avec succès. Il faut un argument, qui correspond aux données de réponse
 * analysées au format JSON.
 * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une
 * erreur lors de l'exécution de la fonction `getUsersGroupRules`. C'est un paramètre facultatif, donc
 * s'il n'est pas fourni, la fonction ne fera rien en cas d'erreur.
 */
export function getUsersGroupRules(
  credentials,
  onDone = undefined,
  onError = undefined,
) {
  const { space, tenant } = credentials;
  const baseURL = space;
  const URI =
    "/3drdfpersist/resources/v1/option-sets/dsusergroup:ListOfGroupResponsibilities/options";
  const OPTS = `?tenant=dstenant:${tenant}`;
  const OPTsH = {
    method: "GET",
    Accept: "application/json,*/*,test/javascript",
  };
  const URL = `${baseURL}${URI}${OPTS}`;

  _httpCallAuthenticated(URL, {
    OPTsH,
    onComplete(response) {
      if (onDone) onDone(JSON.parse(response));
    },
    onFailure(err, headers) {
      const info = err;
      info["msg"] = headers.errormsg;
      info["errCode"] = headers.errorcode;

      if (onError) onError(info);
    },
  });
}

/**
 * @description La fonction « getUserGroupsList » récupère une liste de groupes d'utilisateurs d'un serveur en
 * utilisant les informations d'identification fournies et appelle la fonction de rappel « onDone »
 * avec la réponse.
 * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier
 * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».
 * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)
 * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)
 * @param {Object} credentials.currentUser.email - Le paramètre `currentUser` est un qui contient les informations de l'utilisateur qui envoie le message(appeler depuis la fonction `_3DSwym_get_currentuser`)
 * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque l'opération sera terminée avec
 * succès. Il recevra la réponse en paramètre.
 * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une
 * erreur lors de l'exécution de la fonction `getUserGroupsList`. Il vous permet de gérer et de
 * répondre à toute erreur qui se produit.
 */
export function getUserGroupsList(
  credentials,
  onDone = undefined,
  onError = undefined,
) {
  const { space, currentUser } = credentials;
  const URI = "/3drdfpersist/resources/v1/usersgroup";
  const opt =
    "?select=uri,title,description,owner,members,pending_members,creation_date,modification_date,visibility";
  const url = `${space}${URI}${opt}`;
  const header = {
    "Content-Type": "application/json",
    Accept: "application/json,text/javascript,*/*",
  };
  const opts = { method: "GET", headers: header };
  try {
    _httpCallAuthenticated(url, {
      opts,
      onComplete(response) {
        const repUG = JSON.parse(response);
        const reponse = {};
        const UG = repUG.groups.filter((element) => {
          return element.uri.startsWith("uuid:");
        });

        if (currentUser && Object.keys(currentUser).length > 0) {
          const iamOwner = UG.filter((element) => {
            return element.owner === currentUser.email;
          });
          const iamMember = UG.filter((element) => {
            return element.members.includes(currentUser.email);
          });
          const iam = iamOwner.concat(iamMember);
          reponse["iam"] = iam;
          reponse["UG"] = UG;
          reponse["iamMember"] = iamMember;

          getUsersGroupRules(
            credentials,
            (rules) => {
              reponse["rules"] = rules;
              if (onDone) onDone(reponse);
            },
            (err) => {
              if (onError) onError(err);
            },
          );
        }
      },
      onFailure(err) {
        if (onError) onError(err);
      },
    });
  } catch (error) {
    console.log(error);
  }
}

/**
 * @description La fonction deleteUserGroups est utilisée pour supprimer des groupes d'utilisateurs à l'aide des
 * informations d'identification et de l'URI fournis.
 * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier
 * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».
 * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)
 * @param {String} [uri] - Le paramètre `uri` est l'identifiant du groupe d'utilisateurs que vous souhaitez
 * supprimer. Il est utilisé pour construire l'URL de la requête DELETE.(ex: uuid:dcad14cc-5bcd-45fd-a54d-246b95047d45)
 */

export function deleteUserGroups(credentials, uri) {
  const { space } = credentials;
  const URI = "/3drdfpersist/resources/v1/usersgroup";
  const url = `${space}${URI}/${uri}`;

  const opts = {
    method: "DELETE",
  };
  _httpCallAuthenticated(url, opts);
}

/**
 * @description La fonction `patchUserGroups` est utilisée pour mettre à jour les groupes d'utilisateurs en envoyant
 * une requête PATCH à un URI spécifié avec les données fournies.
 * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier
 * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».
 * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)
 * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)
 * @param uri - Le paramètre `uri` est une chaîne qui représente l'identifiant du groupe d'utilisateurs
 * que vous souhaitez corriger. Il est utilisé pour construire l'URL de la requête PATCH.(ex: uuid:dcad14cc-5bcd-45fd-a54d-246b95047d45)
 * @param {ArrayOfObjects} datas - Le paramètre `datas` est un tableau d'objets qui spécifient les modifications à
 * apporter aux groupes d'utilisateurs.(ex: datas[0].op, datas[0].field, datas[0].value)
 * @param {String} datas[0].op - l'opération à réaliser. (ex: "add", "remove", "replace")
 * @param {String} datas[0].field - Ce sur quoi agir (ex: members[], title, description, owner, visibility)
 * @param {StringOrArray} datas[0].value - La nouvelle valeur impactée. Si ce sont des membres value sera un Tableau de String.
 
 * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque la requête PATCH sera terminée
 * avec succès. Il recevra la réponse en paramètre.
 * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une
 * erreur lors de l'exécution de la fonction `patchUserGroups`. Il vous permet de gérer toutes les
 * erreurs qui se produisent et d’effectuer toute gestion ou journalisation des erreurs nécessaire.
 */
export function patchUserGroups(
  credentials,
  uri,
  datas,
  onDone = undefined,
  onError = undefined,
) {
  const { space, tenant } = credentials;
  const URL = {
    URITI: "/3drdfpersist/resources/v1/template-instances",
    URIUGr: "/3drdfpersist/resources/v1/usersgroup",
    nextURICh: "/characteristics",
    nextURIGr: "/group",
    nexURImem: "/members",
    OPTsTI: `?$mask=dsaccess:Mask.GroupUI.Properties`,
    OPTsTenant: `tenant=dstenant:${tenant}`,
  };

  // Le format des datas est obligatoire : [{}]
  // op : add, replace, remove
  // field : members[], pending_members[], title, description, owner, visibility
  // value : string ou array

  const dataMembers = datas;
  //  [
  //   {
  //     op: "add",
  //     field: "members",
  //     value: ["samuel.mureau@beam3.fr"],
  //   },
  //   {
  //     op: "replace",
  //     field: "title",
  //     value: "BEAM³ R&D - DEV",
  //   },
  // ];

  const baseURL = `${space}${URL.URIUGr}/${uri}`; // route de base pour le PATCH (DOC)

  const dataMembersSTR = JSON.stringify(dataMembers);

  _httpCallAuthenticated(baseURL, {
    headers: topHeader,
    method: "PATCH",
    data: dataMembersSTR,
    type: "json",
    onComplete(response) {
      if (onDone) onDone(response);
    },
    onFailure(err) {
      if (onError) onError(err);
    },
  });
}

//ANCHOR -  CONTROL (Gestion des propriétaires du groupe)

/**
 * @description La fonction `patchUserGroupsControl` est utilisée pour mettre à jour le contrôle des groupes
 * d'utilisateurs en envoyant une requête PATCH à un URI spécifié avec les informations
 * d'identification et les données fournies.
 * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier
 * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».
 * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)
 * @param {String} uri - Le paramètre `uri` est une chaîne qui représente l'identifiant du groupe d'utilisateurs
 * que vous souhaitez corriger. Il est utilisé pour construire l'URL de la requête PATCH.(ex: uuid:dcad14cc-5bcd-45fd-a54d-246b95047d45)
 * @param {ArrayOfObject} _datas - Le paramètre `datas` est un tableau d'objets qui contient les informations
 * nécessaires pour patcher le contrôle des groupes d'utilisateurs. (ex : datas[0].op,  datas[0].value)
 * @param {String}   op - L'opération de correctif. Il peut être 'add', 'replace', 'remove'.
 * @param {Object}   value -
 * @param {Array}   value.agents - Un tableau d’utilisateurs. Le 1er index doit être à vide. (ex : ["","Bob.Dylan@beam3.fr"]). 100 utilisateurs maximums.
 * @param {Array} value.responsibilities - Un tableau de responsibilités. (ex: ["dsaccess:Responsibility.Group.MainOwner", "dsaccess:Responsibility.Group.Owner", "dsaccess:Responsibility.Group.Viewer", "dsaccess:Responsibility.Group.Author", "dsaccess:Responsibility.GroupService.Administrator"])
 * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque
 * l'opération de patch sera terminée avec succès. Il faut un argument, qui est la réponse du serveur.
 * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une
 * erreur lors de l'exécution de la fonction `patchUserGroupsControl`. Il vous permet de gérer toutes
 * les erreurs qui se produisent et d’effectuer toute gestion ou journalisation des erreurs nécessaire.
 */
export function patchUserGroupsControl(
  credentials,
  uri,
  _datas,
  onDone = undefined,
  onError = undefined,
) {
  const { space } = credentials;
  const URI = "/3drdfpersist/resources/v1/usersgroup";

  const url = `${space}${URI}/${uri}/sharing`;
  //liste des responsabilités : ["dsaccess:Responsibility.Group.MainOwner", "dsaccess:Responsibility.Group.Owner", "dsaccess:Responsibility.Group.Viewer", "dsaccess:Responsibility.Group.Author", "dsaccess:Responsibility.GroupService.Administrator"]
  const datas = _datas;
  // [
  //   {
  //     op: "add", // add, replace, remove
  //     path: "/sharing",
  //     value: {
  //       agents: ["", "samuel.mureau@beam3.fr", "yan.coquoz@beam3.fr"],
  //       responsibilities: ["dsaccess:Responsibility.Group.Owner"],
  //     },
  //   },
  // ];

  _httpCallAuthenticated(url, {
    method: "PATCH",
    headers: topHeader,
    data: JSON.stringify(datas),
    type: "json",
    onComplete(response) {
      if (onDone) onDone(response);
    },
    onFailure(err) {
      if (onError) onError(err);
    },
  });
}

/**
 * @description La fonction « readUserGroupControl » est utilisée pour récupérer les informations de contrôle de
 * groupe d'utilisateurs à partir d'un URI spécifié à l'aide d'une requête HTTP GET.
 * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier
 * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».
 * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)
 * @param {String} uri - Le paramètre `uri` est une chaîne qui représente l'identifiant du groupe d'utilisateurs
 * pour lequel vous souhaitez récupérer les informations de contrôle. (ex: uuid:dcad14cc-5bcd-45fd-a54d-246b95047d45)
 * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la
 * requête HTTP sera terminée avec succès. Il prend un argument, qui correspond aux données de réponse
 * de la requête.
 * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une
 * erreur lors de l'exécution de la fonction `readUserGroupControl`. Il vous permet de gérer et de
 * répondre à toute erreur qui se produit.
 */
export function readUserGroupControl(
  credentials,
  uri,
  onDone = undefined,
  onError = undefined,
) {
  const { space } = credentials;
  const URI = "/3drdfpersist/resources/v1/usersgroup";

  const url = `${space}${URI}/${uri}/sharing`;

  const header = {
    "Content-Type": "application/json",
    Accept: "application/json,text/javascript,*/*",
  };
  const opts = {
    method: "GET",
    headers: header,
  };
  _httpCallAuthenticated(url, {
    opts,
    onComplete(_rep) {
      if (onDone) onDone(JSON.parse(_rep));
    },
    onFailure(err) {
      if (onError) onError(err);
    },
  });
}