Aller au contenu

Configurer un service de base de données

Nous allons configurer un service externe de type base de données

Pour ce cas pratique, nous allons utiliser la table agent de l'application (base de données db-externe) qui se trouve sur le serveur localhost. La table agent est de la forme :

id email display_name
3067bfca-540a-4568-81ac-5b1cd7393aef bbain@maarch.com Barbara BAIN
f0c5a642-8906-4907-a5a0-08a7f14c2ed0 bblier@maarch.com Bernard BLIER

Il faut avoir la permission create sur searchableExternalService avec l'utilisateur consommant les api ci-dessous.

Configuration du service

Configuration via API

POST /searchable-external-services

{
  "identifier": "database-service",
  "type": "database",
  "searchableFields": ["display_name"],
  "sortableFields": ["display_name"],
  "responseFormat": {
    "id": "id",
    "display_name": "display_name"
  },
  "parameters": {
      "url": "postgresql://maarch:maarch@database:5432/mdf",
      "tableName": "agent"
  }
}

Configuration via fixtures

Mdm\ExternalService\Domain\SearchableExternalService:
  database-service:
    identifier: 'database-service'
    owner: '@superadmin->id'
    searchableFields: ["display_name"]
    sortableFields: ["display_name"]
    responseFormat: {
      "id": "id",
      "email": "email",
      "display_name": "display_name"
    }
    parameters: {
      "url": "postgresql://maarch:maarch@database:5432/mdf",
      "tableName": "agent"
    }

Utiliser l'API pour la recherche

On peut maintenant rechercher dans le service CSV en faisant un appel à l'API : http://172.17.0.1:8080/external-services/database-service/search?display_name[partial]=jan&sort[asc]=display_name&limit=15 GET /external-services/database-service/search?display_name[partial]=bain&sort[asc]=display_name&limit=15 , la route de l'API est de la forme
GET /external-services/{service_identifier}/search?searchableFieldName=value&sort[{sort_direction}]={sort_field_name}&limit={limit}
Avec service_identifier, l'identifier du service externe renseigné dans la base
searchableFieldName, un des champs renseignés dans la propriété searchableFields du service
value, la valeur recherchée

Réponse :

[
  {
    "id": "3067bfca-540a-4568-81ac-5b1cd7393aef",
    "email": "bbain@maarch.com",
    "display_name": "BAIN Barbara"
  }
]

Utiliser le service dans un modèle d'attributs

Il est possible d'utiliser ce service dans un modèle d'attributs, pour cela suivre la documentation disponible ici

Tri naturel PostgreSQL

Le tri utilisé en utilisant le paramètre sort de l'API utilise la clause SQL ORDER BY .... Par défaut, PostgreSQL ne tri pas de façon "naturel", c'est-à-dire qu'on obtient des résultats dans cet ordre :

  • test10
  • test1
  • test2
  • test3

Pour faire du tri naturel, il faut utiliser une "COLLATION". Il faut d'abord créer une collation :

CREATE COLLATION alpha_numeric (provider = icu, locale = 'fr@colNumeric=yes');

Puis appliquer cette collation à la colonne avec laquelle on souhaite trier :

ALTER TABLE agent ALTER COLUMN email TYPE VARCHAR(180) COLLATE alpha_numeric;

Ici, on applique la collation sur la colonne email de la table agent

On obtiendra alors des résultats dans cet ordre :

  • test1
  • test2
  • test3
  • test10