Source: plateform/main/3dexperience_api.js

import { widget, requirejs } from "@widget-lab/3ddashboard-utils";

/**
 * @description Cette fonction effectue un appel HTTP authentifié à l'aide de la bibliothèque WAFData en de la plateforme.
 * @param {String} url - L'URL du point de terminaison de l'API que la fonction appellera.
 * @param {object} options - Le paramètre `options` est un objet qui contient diverses options pour la requête
 * HTTP, telles que la méthode de requête (GET, POST, etc.), les en-têtes, le corps, etc. Ces options
 * sont généralement transmises à l'API `fetch` ou `XMLHttpRequest` pour effectuer la requête HTTP
 * réelle.
 */
export function _httpCallAuthenticated(url, options) {
  requirejs(["DS/WAFData/WAFData"], (WAFData) => {
    WAFData.authenticatedRequest(url, options);
  });
}

/**
 * @description Cette fonction définit un élément comme étant déplaçable et transmet des données et une fonction de
 * rappel à exécuter lorsque le glissement commence (drag and drop).
 * @param elem - L'élément HTML qui doit être rendu déplaçable.
 * @param strData - strData est une chaîne qui représente les données associées à l'élément déplaçable.
 * Ces données sont accessibles lors des opérations de glisser-déposer pour fournir des informations
 * supplémentaires sur l'élément déplacé.
 * @param onDrag - onDrag est une fonction de rappel qui sera exécutée au début de l'opération de
 * glissement. Il peut être utilisé pour effectuer toutes les actions nécessaires avant le début de
 * l'opération de glissement, telles que la configuration des données à transférer ou la mise à jour de
 * l'apparence de l'élément déplaçable.
 */
export function _setDraggable(elem, strData, onDrag) {
  requirejs(["DS/DataDragAndDrop/DataDragAndDrop"], (DataDragAndDrop) => {
    DataDragAndDrop.draggable(elem, {
      data: strData,
      start: onDrag,
    });
  });
}

/**
 * @description Cette fonction configure un proxy de navigateur de balises avec des balises spécifiées et un événement de filtre facultatif.
 *
 * @param tags - Le paramètre tags est un tableau de chaînes représentant les balises qui seront
 * utilisées pour filtrer les sujets dans le widget TagNavigatorProxy.
 * @param [onTaggerFilter] - Le paramètre onTaggerFilter est une fonction de rappel qui sera exécutée
 * lorsque l'utilisateur filtrera les sujets dans le tagger. Il recevra les sujets filtrés en argument.
 */
export function _setupTagger(tags, onTaggerFilter = undefined) {
  requirejs(["DS/TagNavigatorProxy/TagNavigatorProxy"], (TagNavigatorProxy) => {
    let taggerProxy;
    if (taggerProxy === undefined) {
      taggerProxy = TagNavigatorProxy.createProxy({
        widgetId: widget.id,
        filteringMode: "WithFilteringServices",
      });

      if (onTaggerFilter !== undefined)
        taggerProxy.addEvent("onFilterSubjectsChange", onTaggerFilter);
    }
    taggerProxy.setSubjectsTags(tags);
  });
}

/**
 * Cette fonction définit un élément comme pouvant être déposé à l'aide de la bibliothèque
 * DataDragAndDrop.
 * @param elem - L'élément HTML qui doit être rendu déposable.
 * @param drop - Le paramètre `drop` est une fonction qui sera appelée lorsqu'un élément déplaçable est
 * déposé sur l'élément déplaçable. Il prend généralement l'élément supprimé comme argument et exécute
 * une action basée sur celui-ci.
 */
export function _setDroppable(elem, drop) {
  requirejs(["DS/DataDragAndDrop/DataDragAndDrop"], (DataDragAndDrop) => {
    DataDragAndDrop.droppable(elem, {
      drop,
    });
  });
}

/**
 * @description Cette fonction asynchrone obtient les services de la plateforme à l'aide de la bibliothèque i3DXCompassServices et appelle les fonctions onComplete ou onFailure en fonction du résultat.
 *
 * @param platformId - ID de la plate-forme pour laquelle les services sont demandés. Si aucun ID de
 * plate-forme n'est fourni, la fonction tentera de récupérer l'ID à partir d'une valeur de widget. Si
 * aucun ID n'est trouvé, il sera défini sur `undefined`.
 * @param onComplete - Une fonction de rappel qui sera exécutée lorsque les services de la plateforme
 * seront récupérés avec succès. Il prend les services de plateforme récupérés comme argument.
 * @param onFailure - Le paramètre onFailure est une fonction de rappel qui sera exécutée en cas
 * d'erreur ou d'échec dans l'exécution de la fonction getPlatformServices. Il permet de gérer les
 * erreurs et de fournir un retour d'information approprié à l'utilisateur.
 */
export async function _getPlatformServices(
  platformId,
  onComplete = undefined,
  onFailure = undefined
) {
  await requirejs(
    ["DS/i3DXCompassServices/i3DXCompassServices"],
    (i3DXCompassServices) => {
      if (!platformId || platformId === "") {
        platformId = widget.getValue("PlatFormInstanceId");
      }
      if (!platformId || platformId === "") {
        platformId = undefined;
      }
      if (onComplete) {
        onComplete(
          i3DXCompassServices.getPlatformServices({
            platformId,
            onComplete,
            onFailure,
          })
        );
      }
    }
  );
}

/**
 * @description
 *  La fonction `_getPlateformInfos` récupère les informations sur la plateforme à l'aide du module
 * PlatformAPI et renvoie les informations dans un objet.
 * @returns un objet appelé "retourAPI" qui contient les propriétés suivantes :
 * - {String} tenant, Le tenant de la plateforme sur lequel on travaille.
 * - {Object} user, L'utilisateur connecté à la plateforme...
 * - {ArrayOfObject} appsConfiguration, liste d'app auquel on accès.
 * - {String} appConf
 *
 */
export function _getPlateformInfos() {
  let retourAPI = {};

  requirejs(["DS/PlatformAPI/PlatformAPI"], (plAPI) => {
    const tenant = plAPI.getTenant();
    const user = plAPI.getUser();
    const appsConfiguration = plAPI.getAllApplicationConfigurations();
    const appConf = plAPI.getApplicationConfiguration(
      "com.3ds.wp.passport.cors"
    );
    retourAPI = {
      tenant,
      user,
      appsConfiguration,
      appConf,
    };
  });
  console.log("%cRETOUR API :", "color:blue", retourAPI);
  return retourAPI;
}

export function _getLoginTicket(credentials) {
  if (credentials.tenant) {
    const urlService = `https://${credentials.tenant}-eu1-apps.3dexperience.3ds.com/enovia/resources/AppsMngt/api/v1/services?tenant=${credentials.tenant}&cors=true&xrequestedwith=xmlhttprequest`;
    _httpCallAuthenticated(urlService, {
      onComplete(response) {
        const oResponse =
          typeof response === "string" ? JSON.parse(response) : response;
        if (oResponse && "platforms" in oResponse) {
          const listServiceUrl = oResponse.platforms.find(
            (platform) => platform.id === credentials.tenant.toUpperCase()
          );
          if (onDone && listServiceUrl) onDone(listServiceUrl);
          else if (onError)
            onError("_getLoginTicket return listServiceUrl = undefined");
        } else {
          if (onError) onError("_getLoginTicket return oResponse = undefined");
        }
      },
      onFailure(response) {
        if (onError) onError(response);
      },
    });
  }
}
export function _getMe(credentials, onDone = undefined, onError = undefined) {
  if (credentials.tenant) {
    const urlService = `https://${credentials.tenant}-eu1.iam.3dexperience.3ds.com/api/authenticated/user/me?xrequestedwith=xmlhttprequest`;
    _httpCallAuthenticated(urlService, {
      onComplete(response) {
        const oResponse =
          typeof response === "string" ? JSON.parse(response) : response;
        if (oResponse && "fields" in oResponse) {
          if (onDone) onDone(oResponse.fields);
        } else {
          if (onError) onError("_getMe return not find properties fields");
        }
      },
      onFailure(response) {
        if (onError) onError("_getMe return error",response);
      },
    });
  }
}

export function _getServiceUrl(
  credentials,
  onDone = undefined,
  onError = undefined
) {
  if (credentials.tenant) {
    const urlService = `https://${credentials.tenant}-eu1-apps.3dexperience.3ds.com/enovia/resources/AppsMngt/api/v1/services?tenant=${credentials.tenant}&cors=true&xrequestedwith=xmlhttprequest`;
    _httpCallAuthenticated(urlService, {
      onComplete(response) {
        const oResponse =
          typeof response === "string" ? JSON.parse(response) : response;
        if (oResponse && "platforms" in oResponse) {
          const listServiceUrl = oResponse.platforms.find(
            (platform) => platform.id === credentials.tenant.toUpperCase()
          );
          if (onDone && listServiceUrl) onDone(listServiceUrl);
          else if (onError)
            onError("_getServiceUrl return listServiceUrl = undefined");
        } else {
          if (onError) onError("_getServiceUrl return oResponse = undefined");
        }
      },
      onFailure(response) {
        if (onError) onError(response);
      },
    });
  }
}

export function _getServiceUrl_3DPassport(
  credentials,
  onDone = undefined,
  onError = undefined
) {
  if (credentials.tenant) {
    const urlService = `https://${credentials.tenant}-eu1-registry.3dexperience.3ds.com/api/v1/platform/service/instance?serviceId=3dpassport&platformId=${credentials.tenant}`;
    _httpCallAuthenticated(urlService, {
      onComplete(response) {
        const oResponse = JSON.parse(response);
        console.log("serviceId=3dpassport", oResponse);
        if (Array.isArray(oResponse) && oResponse.length > 0) {
          const urlServicePassport = `${oResponse[0].services[0].url}`;
          if (onDone) onDone(urlServicePassport);
        }
      },
      onFailure(response) {
        if (onError) onError(response);
      },
    });
  }
}