API REST - 404 Photo produit

Bonjour,

Je suis actuellement en plein développement d’un site pour un projet de cours et j’utilise l’API de Dolibarr V13.0.0.

L’API REST répond bien, j’arrive à avoir ma liste de produits mais cependant en utilisant l’URL /api/index.php/documents?modulepart=product&id=1 j’ai une erreur 404 m’indiquant qu’il n’y a pas de fichier lié à ce produit.
Hors j’ai bien mis des fichiers en ligne, il s’agit de la photo du produit.

Si quelqu’un a déjà rencontré ce problème / a une solution je suis preneur.

Ci-joint un screen de la partie fichiers joints de la fiche produit.

Merci d’avance pour ceux qui répondront !

Cordialement,
Sandro

Bonjour @BestShuffle
Question bête mais tu es sûr que ton produit a bien l’id 1 ?

Cordialement
Eric

Bonjour,

Je pense que oui, l’API me retourne que l’id 1 ou que le ref epi01 n’a pas de document, et effectivement le produit d’id 1 a bien comme ref « epi01 ». De même avec les autres id il me retourne les ref associés.
Puis mes requêtes API sur la table produit me retournent bien celui que je souhaite avec son id

Merci pour votre réponse rapide.

Cordialement,
Sandro

J’ai exactement le même problème avec la version 13.0.1 sur le site de IONOS.
Je suis preneur pour un solution.

Je suis également à la recherche d’une telle solution

Bonjour à tous,

Je suis exactement dans la même situation en mars 2022 avec la version 14.0.5. Le système semble bien retrouver le produit, mais impossible de récupérer les documents qui lui sont liés.

Voici ma requête, soit avec l’id du produit :

/api/index.php/documents?modulepart=product&ref=1252522

Soit avec la référence :

/api/index.php/documents?modulepart=product&ref=1252522

Et la réponse :

{
  "error": {
    "code": 404,
    "message": "Not Found: Search for modulepart product with Id 13242 or Ref 1252522 does not return any document."
  },
  "debug": {
    "source": "api_documents.class.php:467 at call stage",
    "stages": {
      "success": [
        "get",
        "route",
        "negotiate",
        "authenticate",
        "validate"
      ],
      "failure": [
        "call",
        "message"
      ]
    }
  }
}

Le message indique bien que le produit a été trouvé (id et référence à l’appui) mais qu’aucun document n’existe pour celui-ci.

Nous sommes bien d’accord que cette requête devrait retourner tous les fichiers joints attachés à ce produit ? Ou existe t’il un autre moyen de récupérer les photos de produits par l’API ?

Je dois développer un outil de synchronisation entre Dolibarr et un autre CMS et j’ai absolument besoin de pouvoir récupérer les photos produit.

Merci d’avance pour votre aide !

Un ticket a été ouvert sur github

@newslang Oups, j’avais pas vu que c’est toi qui l’avais ouvert.
Enfin, bon, en fait ce que je voulais dire, c’est que je bosse sur ce ticket…

Merci @emheyarssi pour ta réponse ! C’est donc bien un bug qui nécessite une correction ?

Bah je n’en ai pas l’impression.

J’ai testé avec htdocs/api/index.php/documents?modulepart=product&id=1 sur le swagger (le testeur d’API) htdocs/api/index.php/explorer/

J’arrive à reproduire le message que tu as mais seulement quand je n’ai vraiment pas de fichier. Sinon, ça fonctionne correctement.

Mais est-ce qu’il y a eu des modifications dans la manière de récupérer ces informations depuis la version 14.0.5 ? Je n’ai rien trouvé dans le changelog.

Et je garanties que j’ai testé ça avec plusieurs produits, qui ont bien des images jointes, et que ça ne fonctionne pas. Donc le problème initial mentionné par @BestShuffle existe bel et bien (ou a existé).

Si nécessaire je peux demander au client de faire la mise à jour pour faire de nouveaux tests, en espérant que ça sera possible pour lui.

Je n’ai pas trouvé de correction non plus. Mais il est possible que ça a été corrigé lors de la correction d’un autre bug ou de l’ajout d’une fonctionnalité.
Pour mes tests, je suis parti de la branche 14.0.5 des sources sur github.
C’est peut-être la raison (que je vois) qui pourrait expliquer que ça fonctionne chez moi.

Merci du retour ! Je vais voir avec mon client s’il peut faire la mise à jour. Par curiosité ça serait possible de savoir où se trouve le code qui va récupérer la liste de fichiers joints d’un produit depuis l’API ?

Ou au moins le fichier de l’API REST qui s’occupe d’exécuter l’endpoint « documents » ? Je pourrais peut-être jeter un œil à la source Github en comparaison avec la version installée chez le client.

Je pense que tu trouveras toutes les informations sur ce sujet ici :

C’est sûrement beaucoup mieux que tout ce que je pourrais te dire :grin:

D’ailleurs, si tu trouves la différence, je serais aussi intéressé. Juste par curiosité.

Entre deux, le client a pu me faire la mise à jour vers la version 15.0.1 : toujours le même problème.
J’ai testé plusieurs produits et aucun ne renvoie des documents alors qu’ils en ont tous.

Est-ce que j’ai un moyen de voir dans la base si un produit a bien un document lié ? Je vais creuser le code, mais je trouve fou que ça marche de ton côté et que de mon côté : rien a faire.

Je suis admin donc ce n’est pas une question de droits…

@emheyarssi

Pas de stress, dans tous les cas merci de tes retours !

Entre deux, j’ai fouillé dans le code de l’API ce qui concerne les documents et la manière de récupérer la liste de fichiers joints d’un produit.

[github]/Dolibarr/dolibarr/blob/develop/htdocs/api/class/api_documents.class.php

(je ne peux pas inclure ce lien pour une raison inconnue, donc je vous met juste le chemin relatif à github)

Voici le code qui s’occupe déjà de récupérer le dossier d’upload de fichiers spécifique au produit (ligne 417) :

...
} elseif ($modulepart == 'produit' || $modulepart == 'product') {
			require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';

			if (!DolibarrApiAccess::$user->rights->produit->lire) {
				throw new RestException(401);
			}

			$object = new Product($this->db);
			$result = $object->fetch($id, $ref);
			if ($result == 0) {
				throw new RestException(404, 'Product not found');
			} elseif ($result < 0) {
				throw new RestException(500, 'Error while fetching object: '.$object->error);
			}

			$upload_dir = $conf->product->multidir_output[$object->entity].'/'.get_exdir(0, 0, 0, 1, $object, 'product');
		} elseif ($modulepart == 'agenda' || $modulepart == 'action' || $modulepart == 'event') {
...

Et là du coup j’ai regardé ce que retourne $upload_dir (en lui faisant retourner une erreur 404 REST avec le nom du chemin) comme valeur et voilà le chemin renvoyé :

…/dolibarr/documents/produit/1252522

Sauf que ce dossier n’existe pas, au sein du dossier …/dolibarr/documents/produit j’ai toute une série de dossiers 0 à 9, puis dans chacun d’entre eux un peu la même chose.

En fait les dossiers sont organisés pour refléter les 2 dernières valeurs des ids de produit. Dans mon cas, il semblerait que les photos pour le produit avec l’id 13242 se trouvent dans le dossier :

…/dolibarr/documents/produit/2/4/13242/photos

Pour 2/4 = 42 inversé.

Mais pour résumer, $upload_dir, ne semble pas avoir le bon chemin. Dans la ligne de code, $conf->product->multidir_output[$object->entity] renvoie bien /dolibarr/documents/produit mais get_exdir ne fonctionne pas correctement.

Est-ce que vous avez une idée de ce qui cloche ? C’est la config de Dolibarr chez le client qui n’est pas compatible avec l’API ? Ou c’est la méthode pour récupérer le chemin qui n’est pas la bonne ?

Merci, cette recherche va beaucoup m’aider.

Le système de stockage des documents a changé. Je suppose que lors d’une installation neuve de Dolibarr et le chargement de fichiers a postériori, ça fonctionne. Maintenant, je pense que la mise à jour vers une version récente, ne convertie pas la structure de stockage des documents.

Un test intéressant à faire serait d’uploader un nouveau fichier (celui-ci serait, à mon avis, stocker dans le nouveau modèle) et regarder si les API permettent d’y accéder. Cela confirmerai mon hypothèse.

Merci du retour !

Je viens de tester : j’ai créé un nouveau produit et je lui ai ajouté une image. J’ai essayé de récupérer l’info par l’API, mais j’ai toujours une erreur 404. Donc je ne pense pas qu’il crée une structure de dossiers différents après une update.

Il faudrait avoir un moyen de contrôle quelle structure de fichier est utilisée et construire le chemin sur cette base.

J’ai vu qu’il y avait une constante appelée $conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO et utilisée dans la méthode get_exdir qui va charger un autre chemin en fonction de ce réglage, mais vu le code en question, pas sûr que ça corrige la chose.

Vu la situation, est-ce que c’est quelque chose qu’on peut imaginer voir corriger rapidement ? Ou est-ce qu’avec un peu de code on peut passer outre ce problème en attendant une vraie update ?

Merci d’avance !

Je reviens sur cette question, est-ce qu’il faut que je détaille ça sur Github ? De mon côté je serais prêt à changer un peu le code source chez mon client pour faire fonctionner ça, mais ne connaissant pas Dolibarr, je ne sais pas vraiment :

  • Comment récupérer efficacement le chemin vers les documents, selon l’organisation actuelle chez mon client (cela dit, en fouillant je dois bien trouver un endroit où ce code existe puisque les documents sont bien visibles sur les produits)
  • S’il y a un moyen facile d’overrider des classes sans toucher à la source directement

Après, c’est clair que si mon client a ce problème, d’autres l’ont aussi, mais si ça peut demander pas mal de temps pour corriger le bug, c’est une alternative pour moi.

À voir ce que tu en penses @emheyarssi, encore merci pour ton aide.

Bonjour,

Je crois avoir donné tous les détails du problème dans ce thread je ne sais pas trop comment faire pour aller plus loin sans avoir un peu d’aide. J’ai mis à jour le bug sur Github et, je me répète, mais je ne suis pas l’instigateur de ce thread et d’autres ont certainement le même souci.

Je pense avoir mis le doigt sur le problème il faut juste m’aider à trouver un moyen de former le bon chemin. Je suis prêt à faire un dev et à partager le code sur Github pour corriger le problème.