15-3 Récupérer et afficher le détail du projet via API
Une fois l'identifiant récupéré, on voudra obtenir le détail du projet demandé en utilisant l'API de Supabase. Cela nous permettra d'afficher le tout dans la page de détail.
Nouvelle fonction de service obtenir
Un service ProjetService
a été créé précédemment, alors utilisons-le pour ajouter une nouvelle fonction permettant de récupérer un seul projet et ses informations.
Créez une fonction dans le service, obtenir
, acceptant en paramètre un number
id
.
async obtenir(id: number): Promise<Projet> {
}
Comme la récupération de données via l'API et axios est asynchrone, la fonction doit aussi être asynchrone (async
) et retourner une Promise
. On typera cette Promise
au type Projet
puisqu'au final c'est un modèle Projet
qu'on désire retourner.
Bâtir et exécuter la requête d'API
On fera un appel d'API à /projets/ID_DE_PROJET
.
La base est la même que pour la fonction supprimer
, donc on peut réutiliser l'URL et l'objet de configuration de cette fonction.
- Configurer l'URL et la config axios.
src/app/core/services/projet-service.ts
async obtenir(id: number): Promise<Projet> {
const url = "/projets";
const config: AxiosRequestConfig = {
params: {
id: `eq.${id}`
},
headers: {
'Accept': 'application/vnd.pgrst.object+json'
}
}
} - Effectuer l'appel d'API tout en s'assurant de typer le retour.
src/app/core/services/projet-service.ts
async obtenir(id: number): Promise<Projet> {
const url = "/projets";
const config: AxiosRequestConfig = {
params: {
id: `eq.${id}`
},
headers: {
'Accept': 'application/vnd.pgrst.object+json'
}
}
const reponse = await api.get<Projet>(url, config);
} - Retourner le contenu de
data
sur la réponse.src/app/core/services/projet-service.tsasync obtenir(id: number): Promise<Projet> {
const url = "/projets";
const config: AxiosRequestConfig = {
params: {
id: `eq.${id}`
},
headers: {
'Accept': 'application/vnd.pgrst.object+json'
}
}
const reponse = await api.get<Projet>(url, config);
return reponse.data;
}
Appeler la méthode de service à partir de ProjetDetailPage
La dernière étape est d'appeler le service via la page de détail d'un projet (ProjetDetail
).
-
Injecter
ProjetService
dans le composantProjetDetail
afin d'avoir accès aux fonctions de ce dernier.src/app/features/projets/pages/projet-detail.tsexport class ProjetDetail implements OnInit {
protected id: number | null = null;
constructor(private route: ActivatedRoute,
private projetService: ProjetService) {
}
ngOnInit(): void {
const routeParam = this.route.snapshot.paramMap.get('id');
if(routeParam){
this.id = +routeParam;
}
}
}infoLorsque le constructeur possède plusieurs arguments, vous pouvez mettre chaque argument sur une ligne distincte. Cela permettra d'éviter que le tout soit illisible et on s'assure qu'il reste facile de voir le détail du constructeur.
-
Ajouter une propriété
projet
, de typeProjet
pour contenir le projet récupérésrc/app/features/projets/pages/projet-detail.tsexport class ProjetDetail implements OnInit {
protected id: number | null = null;
protected projet: Projet | null = null;
//... -
Modifier
ngOnInit()
pour une fonctionasync
puisque nous ferons un appel asynchrone au service et à l'API. Faites aussi en sorte qu'elle retourne unePromise<void>
.src/app/features/projets/pages/projet-detail.tsasync ngOnInit(): Promise<void> {
//... -
Récupérer le projet via la fonction
obtenir
du service, seulement si un paramètre de route id est présent.src/app/pages/projets/projet-detail.page.tsasync ngOnInit(): Promise<void> {
const routeParam = this.route.snapshot.paramMap.get('id');
if(routeParam){
this.id = +routeParam;
this.projet = await(this.projetService.obtenir(this.id));
}
}infothis.route.snapshot.paramMap.get('id')
ne garantis pas que le paramètre d'URL demandé existe et il se pourrait donc que le retour soitnull
. C'est pourquoi on s'assure querouteParam
n'est pasnull
.
Afficher l'information du projet
Si tout fonctionne, nous pouvons modifier le template
pour afficher à tout de moins le titre et la description du projet.
@Component({
selector: 'app-projet-detail',
imports: [],
template: `
@if (projet) {
<h1>{{projet.nom}}</h1>
<p>{{projet.description}}</p>
}
`,
styles: ``
})
@if(projet)
indique qu'on affiche ce bloc seulement si projet
n'est pas null
ou encore undefined
. Bref, que le projet a été récupéré et qu'il est présent.
Test de l'affichage
Pour tester, il vous faudra un réel identifiant de projet existant dans Supabase. Allez dans votre projet Supabase et trouvez un identifiant de projet.
Par exemple, le mien est: 1
(le vôtre sera possiblement différent).
Rendez-vous ensuite via votre navigateur vers http://localhost:4200/projets/VOTRE_ID_DE_PROJET
en vous assurant de remplacer l'id par le vôtre et le tout devrait fonctionner!
