Gestion du process
Cette page à pour objectif de décrire l'implémentation de la logique d'initialisation ou de reprise d'un OAV relatif au process courant exposé par l'oip-core. Le contexte de l'application et le contexte graphql sont définis grùce au process et permettent d'accéder au projectId que ce soit cÎté front dans les composants des vues ou cÎté back dans les différents resolvers graphql.
Process
L'objet process est exposé par l'oip-core via ses contrÎleurs. Cet objet fait le lien entre la session courante de l'utilisateur et un projet. Il est stocké en base de données dans la collection processes.
Champs importants d'un process :
{
"sessionId": "xxxx", // related session id
"projectId": "yyyy", // related project id
"viewId": "CUSTOMER", // current view id
"actions": [ // available actions for transition
"NEXT",
"PREVIOUS"
]
}Logique d'initialisation d'un projet
Cette version de l'oip-starter exécute une logique d'initialisation d'un projet lors du lancement de l'application. Cette logique permet soit la création d'une nouvelle entité projet, soit la reprise d'un projet existant. Dans ce dernier cas, l'OAV reprendra à la derniÚre vue activée par une précédente session.
Cette implĂ©mentation par dĂ©faut peut ĂȘtre adaptĂ©e selon les besoins du projet client.
Dans app/index.js, le hook useInitProject prend en paramĂštre un identifiant de projet depuis le paramĂštre d'url projectId, s'il existe.
http://localhost:8000/?projectId=my-project-idprojectId peut ĂȘtre :
- un identifiant de projet externe
- un identifiant interne d'une entité projet existante (_id)
- un identifiant externe d'une entité projet existante (externalId)
- indéfini
Partie du code de app/index.js qui gĂšre la logique d'initialisation du projet :
...
const [projectId] = useQueryParam('projectId', StringParam);
// to init an initial project
const { isLoading, error, data } = useInitProject(projectId);
useEffect(() => {
// set header 'fasst-oav-project-id'
// for all next graphql calls
GQLEnvironment.projectId = data?.projectId;
}, [data?.projectId]);
if (isLoading || error) {
return (
<div />
);
}
...Le hook useInitProject effectue un appel au server GET /project/:projectId. Si projectId est indéfini, un UUID est généré.
Dans server/app.mjs, la ligne app.use('/project/:id', initProjectMiddleware); exécute la logique de création ou de récupération du projet lors de l'appel entrant sur la route GET /project/:id définie dans server/routes.mjs. Veuillez également consulter le fichier server/initProjectMiddleware.mjs et adapter la logique selon vos besoins.
Une fois le projet rĂ©cupĂ©rĂ© ou créé, son identifiant rĂ©el est renvoyĂ© : { projectId: "xxxx" }. Le header fasst-oav-project-id est alors dĂ©fini pour toutes les prochaines requĂȘtes graphql cĂŽtĂ© client et aura pour valeur l'identifiant interne du projet courant.
De ce fait, le middleware interne de l'oip-core sur l'endpoint /graphql rĂ©soudra le process pour la paire { sessionId, projectId } avant chaque requĂȘte graphql. Le process courant sera alors accessible depuis le context graphql dans les resolvers et permettra de rĂ©cupĂ©rer projectId.
Exemple de récupération du projectId depuis un composant React
import React from 'react';
import PropTypes from 'prop-types';
import withProcess, { viewIds, actionIds } from '@@app/withProcess';
const Home = ({ context, processHandlers }) => {
// récupération de projectId depuis le context
const projectId = context.projectId;
const $onClick = (actionId) => () => {
processHandlers.onAction(viewIds.HOME, actionId);
};
return (
<div className="t-home">
<h2>{viewIds.HOME}</h2>
<p>Project ID: {projectId}</p>
<div>
<button
className="f-button"
onClick={$onClick(actionIds.HOME_NEXT)}>Next</button>
</div>
</div>
);
};
Home.propTypes = {
context: PropTypes.object,
processHandlers: PropTypes.object
};
// withProcess injecte dans les props du composant context et processHandlers
export default withProcess(Home);Exemple de récupération du projectId dans un resolver GraphQL
import { Entities } from '@fasstech/oip-core';
import {
getProjectId,
getProjectExternalId,
getProjectName
} from '@fasstech/oip-core/entities';
export const getProject = async (args, context) => {
// récupération de projectId depuis le context du resolver
const { projectId } = context.process;
const project = await Entities('Project').get({ id: projectId });
return {
id: getProjectId(project),
externalId: getProjectExternalId(project),
name: getProjectName(project)
};
};
export default getProject;