Après initialisation et à partir du périmètre de recherche issu de la géolocalisation (point central et rayon), l'offre de soins associée à la spécialité est extraite de l'index du référentiel national.
[Page] fetchBatchSolr() = récupère la liste des professionnels de santé correspondant la spécialité dans le périmètre de recherche
async function fetchBatchSolr(customFilterSearch = false) {
...
// isFirstLoad
promiseSearch.push(getSOLRresults(false));
...
}
La requête au moteur d'indexation :
[Composable] useSearchApi.getSOLRresults() = récupère la liste des professionnels de santé correspondant la spécialité dans le périmètre de recherche, construit le payload et applique les filtres
async function getSOLRresults(filtered = true) {
...
const payloadSettings = {
text: lrmDataStore.speciality,
location: geolocationStore.geolocation,
isLrmSearchWithPreferredDoctor:
lrmDataStore.isLrmSearchWithPreferredDoctor,
prefDoctor: filtered ? lrmDataStore.prefDoctorParam : null,
hasSlot: filtered,
};
...
const searchPayload = createSearchPayload({
filters: { ...searchDataStore.customFilters },
paginationData: currentPaginationData,
settings: payloadSettings,
});
const res = await SearchService.getSearchResults(searchPayload);
...
return res;
}
Le payload de la requête est construit à partir des paramètres payloadSettings
et des éventuels filtres actifs customFilters
ainsi que du curseur de pagination currentPaginationData
.
A noter le tri appliqué en fonction de la nature de la géolocalisation :
distance
si la géolocalisation est obtanue à partir d'une adresserandom
dans tous les autres cas dont département, code postal (utilisation du mode random de tri de Solr).
La construction du payload :
[Model] PayloadClass.createSearchPayload() = construit le payload et applique les filtres
/**
* Creation of the solr search payload
* @param {object} _ - contains the ids of filters checked by user
* @param {Array} _.filters - contains the ids of filters checked by user
*/
const createSearchPayload = ({ filters, paginationData, settings = {} }) => {
const payloadTemp = new PayloadModel();
...
if (settings.location) {
payloadTemp.center_lat = settings.location.latitude;
payloadTemp.center_lon = settings.location.longitude;
payloadTemp.radius = settings.location.radius ?? settings.location.defaultRadius;
payloadTemp.sort = settings.location.type === 'address' ? 'distance' : 'random';
}
...
if (filters) payloadTemp.filters = filters;
return payloadTemp.computeQuery();
};
La requête Solr est issue de la transformation du payload.
[Model] PayloadClass.getQuery() = transforme le payload en requête Solr
export default class PayloadClass {
computeQuery() {
let query = '';
query += Object.keys(this).map((key) => `${key}=${key === 'filters' ? JSON.stringify(this[key]) : this[key]}`).join('&');
return query;
}
}
[Service] SearchService.getSearchResults() = récupère la liste des professionnels de santé correspondant la spécialité dans le périmètre de recherche
static async getSearchResults(payload, baseUrl = SAS_SOLR) {
// have to remove all quotations marks added by the payload model
const currentParams = decodeURI(new URLSearchParams(payload).toString());
try {
const result = await ApiPlugin.get(`${baseUrl}?${currentParams}`);
return result?.data;
} catch (e) {
console.error('Error fetching getResults \n', e);
return { error: 'Error fetching getResults' };
}
}
La requête retourne un tableau avec des éléments de signalétiques des professionnels de santé, dont :
- rpps : identifiant RPPS du PS
- rpps_rang
- adeli : identifiant ADELI du PS
- finess : identifiant FINESS du PS
- siret : identifiant SIRET du PS
- cp : code postal du lieu d'exercice
- address : adresse du lieu d'exercice
- phone : téléphone du lieu d'exercice
- latitude : latitude du lieu d'exercice
- longitude : longitude du lieu d'exercice
La liste des professionnels de santé retournée par le moteur d'index est ensuite découpée en lots de 25 items (professionnels de santé), qui sont soumis à l'API SAS et à l'agrégateur pour les professionnels ayant déclaré leur solution de prise de rendez-vous. L'objectif est de récupérer un ensemble de 5 cartes par page ayant des créneaux disponibles.