Source: plateform/Tag/index.js

import { _httpCallAuthenticated } from "../main/3dexperience_api";
import { _3DSpace_get_docInfo } from "../main/3dspace_api";
import { UUID } from "../../api/index";

// LINK - https://media.3ds.com/support/documentation/developer/Cloud/en/English/CAA3DSpaceREST/CAA6WRestServicePrinciples.htm
// Doc de test sur tenant BEAM3 PROD
const objIDTEST = "B70C12CDAE0415006579A93200061A14";
// Doc de test sur tenant Pivetau TEST
const objIDTEST2 = "FA35FB9B177A28006580190400193C20";
const objIDTEST3 = "FA35FB9B177A280065800EA0000F599C";

const sourcesSearching = [
  "swym",
  "3dspace",
  "drive",
  "usersgroup",
  "3dplan",
  "dashboard",
];

const listPredicates = {
  how: "ds6w:how",
  what: "ds6w:what",
  when: "ds6w:when",
  where: "ds6w:where",
  who: "ds6w:who",
  why: "ds6w:why",
};
const objToTag = {
  objId: objIDTEST3,
  pred: "who",
  order_by: "desc",
  tag: "testTag",
};

/**
 * @description La fonction `addTagToDoc` est utilisée pour ajouter une balise à un document dans un espace 3D en
 * utilisant les informations d'identification et les informations sur l'objet 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, 3DCompass...)
 * @param {Object} credentials.currentUser.username - Le paramètre `currentUser` est un qui contient les informations de l'utilisateur qui envoie le message(appeler depuis la fonction `_3DSwym_get_currentuser`), une chaîne de caractère contenant le nom d'utilisateur.
 *
 * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)
 * @param {Object} obj - Le paramètre `obj` est un objet qui contient les propriétés suivantes :
 * @param {String} obj.info.name - L'identifiant de l'objet que vous souhaitez marquer. (ex: B70C12CDAE0415006579A93200061A14)
 * @param {String} obj.pred - La propriété de l'objet que vous souhaitez marquer. (ex: how, what, when, where, who, why)
 * @param {String} obj.tag - Le tag que vous souhaitez ajouter à l'objet.
 * @param {String} obj.order_by - L'ordre de la balise que vous souhaitez ajouter à l'objet. (ex: asc, desc)
 * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque
 * l'opération de marquage sera terminée avec succès. La réponse du serveur lui sera transmise en
 * 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 `addTagToDoc`. Il vous permet de gérer et de traiter
 * l'erreur de manière personnalisée.
 * @example credentials={space: "https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia", currentUser: { username: "Yan" }, tenant: "R1132100968447"}
 * @example obj={objId: "B70C12CDAE0415006579A93200061A14", pred: "what", tag: "testTag"}
 *
 */
export function addTagToDoc(
  credentials,
  obj,
  onDone = undefined,
  onError = undefined,
) {
  const { space, tenant } = credentials;
  const { objId, pred, tag } = obj;

  const URL = {
    uri: "/resources/6w/tags",
    otpCTX: "SecurityContext=preferred",
    optTenant: `tenant=${tenant}`,
  };
  const url = `${space}${URL.uri}?${URL.otpCTX}&${URL.optTenant}`;
  const dataTest = {
    tag: [
      {
        subject: [
          {
            uri: `pid://${objId}`,
          },
        ],
        predicate: listPredicates[pred],
        object: {
          literal: tag,
        },
      },
    ],
  };

  _httpCallAuthenticated(url, {
    method: "PUT",
    headers: {
      "Content-Type": "application/json",
      Accept: "application/json",
    },
    data: JSON.stringify(dataTest),
    onComplete(response) {
      const resp = JSON.parse(response);
      const info = {};
      setTimeout(() => {
        _3DSpace_get_docInfo(
          credentials,
          objId,
          (rep) => {
            const docName = rep.data[0].dataelements.title;
            const docExt =
              rep.data[0].dataelements.fileExtension !== undefined
                ? rep.data[0].dataelements.fileExtension
                : "";
            const createBy =
              rep.data[0].relateddata.ownerInfo[0].dataelements.name;
            info["name"] = docName;
            info["ext"] = docExt;
            info["createBy"] = createBy;
            obj.info = { ...info };
            getActualTagsOnDoc(
              credentials,
              obj,
              (rep) => {
                if (onDone) onDone(rep);
              },
              (err) => {
                if (onError) onError(err);
              },
            );
          },
          (response, headers) => {
            const info = response;
            info["msg"] = headers.errormsg;
            info["errCode"] = headers.errorcode;
            console.log("❌ sendDirectMessage => ", info);
            if (onError) onError(info);
          },
        );
      }, 2000);
    },
    onFailure(response, headers) {
      const info = response;
      info["msg"] = headers.errormsg;
      info["errCode"] = headers.errorcode;
      console.log("❌ sendDirectMessage => ", info);
      if (onError) onError(info);
    },
  });
}
/**
 * @description La fonction `getActualTagsOnDoc` récupère les balises réelles d'un document en utilisant les
 * informations d'identification et les informations sur l'objet fournies. Appeler depuis `addTagToDoc()`
 * @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, 3DCompass...)
 * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)
 * @param {Object} credentials.currentUser.username - 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} credentials.ctx  - L'ID du contexte de travail.
 * @param obj - Le paramètre `obj` est un objet qui contient des informations sur le document. Il
 * possède les propriétés suivantes :
 * @param {String} obj.info.name - Le nom du document.
 * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque
 * l'opération de marquage sera terminée avec succès. La réponse du serveur lui sera transmise en
 * 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 `addTagToDoc`. Il vous permet de gérer et de traiter
 * l'erreur de manière personnalisée.
 */
export function getActualTagsOnDoc(
  credentials,
  obj,
  onDone = undefined,
  onError = undefined,
) {
  // const nomFichier = "beam_cube_TEST_BDD";
  console.log("obj ", obj);
  const nomFichier = obj.info.name;
  const URL = {
    baseUrl: `https://${credentials.tenant.toLowerCase()}-eu1-fedsearch.3dexperience.3ds.com`,
    uri: "/federated/search",
  };
  const url = `${URL.baseUrl}${URL.uri}`;
  const headers = {
    "Content-Type": "application/json",
    Accept: "application/json,text/javascript,*/*",
  };
  const uuid = UUID();
  const dataPattern = {
    with_indexing_date: true,
    with_synthesis: true,
    with_nls: false,
    label: `3DSearch-${credentials.currentUser.username}-AjoutDeTagBeam-${uuid}`,
    locale: "fr",
    select_predicate: [
      "ds6w:label",
      "ds6w:type",
      "ds6w:description",
      "ds6w:identifier",
      "ds6w:modified",
      "ds6w:created",
      "ds6wg:revision",
      "ds6w:status",
      "ds6w:responsible",
      "owner",
      "ds6w:responsibleUid",
      "ds6wg:filesize",
      "ds6w:project",
      "ds6w:dataSource",
      "ds6w:community",
      "ds6w:originator",
      "dsgeo:referential",
      "ds6w:lastModifiedBy",
      "ds6w:repository",
      "dcterms:title",
      "dcterms:description",
      "ds6w:containerUid",
    ],
    with_synthesis_hierarchical: true,
    select_file: ["icon", "thumbnail_2d"],
    query: nomFichier,
    specific_source_parameter: {
      "3dspace": {
        additional_query:
          ' AND NOT (owner:"ENOVIA_CLOUD" OR owner:"Service Creator" OR owner:"Corporate" OR owner:"User Agent" OR owner:"SLMInstallerAdmin" OR owner:"Creator" OR owner:"VPLMAdminUser") AND (ds6w_58_islastrevisionperstate:true OR NOT listoffields:ds6w_58_islastrevisionperstate)',
      },
      drive: {
        additional_query:
          ' AND NOT ([flattenedtaxonomies]:"types/DriveNode" AND ( [current]:"Trashed" OR [policy]:"Drive File Iteration") )',
      },
    },
    select_exclude_synthesis: ["ds6w:what/ds6w:topic"],
    order_by: objToTag.order_by,
    order_field: "relevance",
    select_snippets: [
      "ds6w:snippet",
      "ds6w:label:snippet",
      "ds6w:responsible:snippet",
      "ds6w:community:snippet",
      "swym:message_text:snippet",
    ],
    nresults: 40,
    start: "0",
    source: sourcesSearching,
    tenant: credentials.tenant,
    login: {
      "3dspace": {
        SecurityContext: credentials.ctx,
      },
    },
  };
  console.log("dataPattern => ", dataPattern);
  _httpCallAuthenticated(url, {
    method: "POST",
    headers: headers,
    data: JSON.stringify(dataPattern),
    onComplete(response) {
      const info = JSON.parse(response);
      onDone(info);
    },
    onFailure(err, headers) {
      const info = err;
      info["msg"] = headers.errormsg;
      info["errCode"] = headers.errorcode;
      console.log("❌ sendDirectMessage => ", info);
      if (onError) onError(info);
      console.log("Erreur de recuperation d'id du doc et des tags", err);
    },
  });
}

/**
 * @description La fonction `removeTagToDoc` est utilisée pour supprimer une balise spécifique d'un document en
 * utilisant les informations d'identification et les informations sur l'objet 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, 3DCompass...)
 * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)
 *
 * @param {Object} obj - Le paramètre `obj` est un objet qui contient les propriétés suivantes :
 * @param {String} obj.objId - L'identifiant unique de l'objet pour lequel vous souhaitez supprimer la balise.
 * @param {String} obj.pred - L'identifiant de la relation entre l'objet et la balise. (ex: how, what, when, where, who, why).
 * @param {String} obj.tag - Le nom du tag à supprimer.
 * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la
 * suppression de la balise du document 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 `removeTagToDoc`. Il vous permet de gérer et de traiter
 * l'erreur de manière personnalisée.
 */
export function removeTagToDoc(
  credentials,
  obj,
  onDone = undefined,
  onError = undefined,
) {
  const { objId, pred, tag } = obj;

  const URL = {
    uri: "/resources/6w/tags",
    otpCTX: "SecurityContext=preferred",
    optTenant: `tenant=${credentials.tenant}`,
  };
  const url = `${credentials.space}${URL.uri}?${URL.otpCTX}&${URL.optTenant}`;
  const dataTest = {
    tag: [
      {
        subject: [
          {
            uri: `pid://${objId}`,
          },
        ],
        predicate: listPredicates[pred],
        object: {
          literal: tag,
        },
      },
    ],
  };
  _httpCallAuthenticated(url, {
    method: "DELETE",
    data: JSON.stringify(dataTest),
    headers: {
      "Content-Type": "application/json",
      Accept: "application/json,text/javascript,*/*",
    },
    onComplete(response) {
      if (onDone) onDone(response);
    },
    onFailure(err, headers) {
      const info = err;
      info["msg"] = headers.errormsg;
      info["errCode"] = headers.errorcode;
      console.log("❌ sendDirectMessage => ", info);
      if (onError) onError(info);
    },
  });
}

/**
 * @description La fonction « getInfoDocTags » effectue un appel HTTP pour récupérer des informations sur les
 * documents en fonction des informations d'identification et des identifiants de document 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 - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)
 * @param {String} str - Le paramètre `str` est une chaîne qui représente l'ID du documents pour lesquels
 * vous souhaitez récupérer des informations.
 * @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 `getInfoDocTags`. Il vous permet de gérer et de traiter
 * les informations d'erreur.
 * @returns La fonction ne renvoie explicitement rien.
 */
export function getInfoDocTags(
  credentials,
  str = "",
  onDone = undefined,
  onError = undefined,
) {
  const { space } = credentials;
  if (str === "") return;

  const URL = {
    uri: "/resources/v1/modeler/documents",
  };

  const headers = {
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    Accept: "application/json,text/javascript,*/*",
  };
  const url = `${space}${URL.uri}`;

  const dataTest = `$include=none,lockerInfo,ownerInfo,originatorInfo,files,ownerInfo,originatorInfo&$fields=none,title,name,typeNLS,collabSpaceTitle,revision,isLatestRevision,files,lockStatus,lockerInfo.name,lockerInfo.firstname,lockerInfo.lastname,owner,ownerInfo.name,ownerInfo.firstname,ownerInfo.lastname,stateNLS,modified,policy,state,organizationTitle,originator,originatorInfo.name,originatorInfo.firstname,originatorInfo.lastname,hasModifyAccess,fileExtension,files.name,files.title,files.revision,files.locker,ownerInfo,ownerInfo.name,ownerInfo.firstname,ownerInfo.lastname,originatorInfo,originatorInfo.name,originatorInfo.firstname,originatorInfo.lastname&$ids=${str}`;

  _httpCallAuthenticated(url, {
    method: "POST",
    headers: headers,
    data: dataTest,
    onComplete(response) {
      if (onDone) onDone(JSON.parse(response));
    },
    onFailure(err, header) {
      const info = err;
      info["msg"] = header.error;
      if (onError) onError(info);
    },
  });
}