Embedded lists dans les resultats des services REST mappés

Suite à demande par mail.

La possibilité d’embedder des listes d’objet liés sur les services REST mappés à été mise en place sur la bracnhe master(actuellement P24)

Une variante de la méthode addRefField a été ajoutée (cf. https://docs.simplicite.io/4.0/javadoc-alpha/com/simplicite/webapp/services/RESTMappedObjectsExternalObject.html#addRefField(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,boolean,java.lang.String)) qui permet de:

  1. nommer explicitement le lien (c’est optionnel, si on met null c’est le nommage de l’objet lié qui est utilisé), ce nommage spécifique du lien n’est utile que pour lever les ambiguïtés s’il y a 2 liens (ou plus) entre 2 mêmes objets…
  2. choisir le mode embedded ou non

Exemple d’utilisation (sur la démo):

Avec le mapping suivant

boolean embed = true; // or false

addObject("suppliers", "DemoSupplier");
addField("suppliers", "code", "demoSupCode");
addField("suppliers", "name", "demoSupName");

addObject("products", "DemoProduct", "Products");
addField("products", "reference", "demoPrdReference");
addField("products", "name", "demoPrdName");
addRefField("products", "suppliers", "supplierId", "demoPrdSupId", null, embed, null);

le resultat d’un search (filtré pour ne retourner qu’un record supplier pour plus de lisibilité /suppliers?code=PEAR ) est:

  • En mode non embedded (false):
{"suppliers": [{
  "row_id": "4",
  "code": "PEAR",
  "name": "Pear Inc",
  "_links": [{
    "rel": "products",
    "href": "suppliers/4/products"
  }]
}]}
  • Et en mode embedded (true):
{"suppliers": [{
  "row_id": "4",
  "code": "PEAR",
  "name": "Pear Inc",
  "products": [
    {
      "row_id": "7",
      "supplierId": "4",
      "reference": "REF001",
      "name": "Tablet"
    },
    {
      "row_id": "8",
      "supplierId": "4",
      "reference": "REF002",
      "name": "Smartphone"
    }
  ]
}]}

Le résultat d’un select (sur le même record supplier que ci-dessus /suppliers/4):

  • En mode non embedded (false):
{
  "row_id": "4",
  "code": "PEAR",
  "name": "Pear Inc",
  "_links": [{
    "rel": "products",
    "href": "suppliers/4/products"
  }]
}
  • Et en mode embedded (true):
{
  "row_id": "4",
  "code": "PEAR",
  "name": "Pear Inc",
  "products": [
    {
      "row_id": "7",
      "supplierId": "4",
      "reference": "REF001",
      "name": "Tablet"
    },
    {
      "row_id": "8",
      "supplierId": "4",
      "reference": "REF002",
      "name": "Smartphone"
    }
  ]
}

Bonjour @david, il semble que dans notre version actuelle (Version=4.0.P25 BuiltOn=2021-03-11 12:27 (revision 87c63edc550691b4a0f402a31d3841429a9e0476)), la fonctionnalité de “embedded link” ne fonctionne plus.

le code de mapping de relation est tel que ci-dessous :
addRefField("structuralUnits", "companies", "structuralUnitBelongsToCompanyId", "DepLegalEntityId", "isStructuredByStructuralUnits", true, "<p>Structural-units (department) structuring the legal entity (organization).</p>");

Voici le json obtenu en retour :

// 20210406190534
// https://bca.dok.intra.renault.fr/bcsi/legal/v1/companies

{
  "companies": [
    {
      "_links": [
        {
          "rel": "isStructuredByStructuralUnits",
          "href": "companies/73/isStructuredByStructuralUnits"
        }
      ],
      "companyCorporateName": "ACI – LE MANS",
      "countryCode": "FR",
      "countryNameFR": "France",
      "companyCountryGrouping": "IN_EU",
      "dataProcessingsCount": "0",
      "countryNameEN": "France",
      "rowId": "73"
    },
    ...
  ],
  "pageCount": 20,
  "count": 81,
  "page": 1,
  "maxPage": 5
}

Je déploie la dernière image P25 disponible afin de confirmer (nous n’avons pas encore pu réaliser notre upgrade en v5 :hot_face:)

ERRATUM: après un redéploiement (même iso-build), l’embedding refonctionne (!?).
Excuses-moi pour la fausse alerte (je dois encore redéployer ma prod pour confirmer mais ce ne sera fait que ce soir).

ERRATUM2: j’ai pu forcer le recalcul du mapping de l’API concernée en production (en réenregistrant le code java de mapping) et suite à la recompilation de la classe, le mapping refonctionne aussi en production…

Il y a effectivement eu une correction sur la pagination des services mappés le 4 mars, il faut peut être une recompilation pour que ça soit pris en compte (je vois pas trop pourquoi pourquoi mais bon…)

Merci pour ton retour.
ça peut-être une piste… il y a en effet eu un déploiement de cette release/build du 11/3 en production la semaine dernière et la régression a pu passer inaperçue car l’API fonctionne bien hormis ce bloc d’embedding qui n’est pas souvent activé dans notre modèle (uniquement dans des cas particulier à faible volumétrie pour des ressources bien identifiées). Mais ce qui est étonnant c’est que la recompilation aurait dû se faire automatiquement lors du deploy… bizarre.