Prompt Title: Développement d'une application de gestion de collections - Symfony et Angular

Created 1 year ago
Votes 0
Views 150 times
0
Human: Dans ce devoir, vous serez amenés à mettre directement en application les compétences acquises dans les séances de travaux pratiques. Les dernières questions nécessiteront une recherche documentaire. Le rendu se fera exclusivement sur le dépôt git du pôle informatique, le même dépôt devant contenir la partie Symfony et la partie Angular. À chaque question du devoir, vous créerez une version sous la forme d’une étiquette (tag). Les étiquettes devront être de la forme questionN où N est un nombre écrit numériquement. Pour les noms d’étiquette et tous les noms de répertoires et fichiers, la casse est importante. Vous ajouterez à votre dépôt, un fichier README.md au format markdown. Ce fichier sera mis à jour pour contenir la liste des commandes utilisées pour répondre à la question traitée. Par souci de portabilité, nous utiliserons SQLite comme système de base de données. Le non respect des spécifications de noms de fichiers, répertoires et étiquettes, ou de la structure du dépôt git conduira à des malus importants pouvant aller jusqu’à 50% de la note. La structure de votre dépôt (à la racine) doit être la suivante : README.md frontend/ backend/ où frontend est le nom de votre projet Angular et backend le nom de votre projet Symfony. Vous devez utiliser Docker et la configuration spécifique à ce contrôle qui vous est donnée sur Célène. Comme d’habitude, il faut modifier le fichier compose.yml pour indiquer vos identifiants d’utilisateur, noms et email de l’université sous la forme [email protected]. Attention la contribution de chaque membre du projet sera jugée sur les noms des commits dans le dépôt git. Si pour une raison légitime (par exemple mise en œuvre du peerprogramming (programmation en bînôme)) les commits ne reflètent pas la répartition effective du travail, celle-ci doit être explicité très clairement dans le fichier README.md. Questions Il s’agit de développer une application de gestion de collections, les éléments des collections pouvant être très divers.
ChatGPT:

Pour développer cette application de gestion de collections, vous pouvez suivre les étapes suivantes :

  1. Créez un nouveau projet Symfony pour le backend en exécutant la commande suivante :
bash
composer create-project symfony/skeleton backend
  1. Créez un nouveau projet Angular pour le frontend en exécutant la commande suivante :
arduino
ng new frontend
  1. Configurez SQLite pour votre projet Symfony en modifiant le fichier .env dans le répertoire backend. Changez la valeur de la variable DATABASE_URL pour utiliser SQLite :
makefile
DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
  1. Créez une entité pour représenter les éléments de la collection dans le backend :
bash
cd backend php bin/console make:entity CollectionItem

Ajoutez les propriétés nécessaires à l'entité (par exemple : nom, description, image, etc.).

  1. Générez les migrations pour créer la table correspondante dans la base de données :
bash
php bin/console make:migration php bin/console doctrine:migrations:migrate
  1. Créez un contrôleur API pour gérer les opérations CRUD (Create, Read, Update, Delete) des éléments de la collection :
bash
php bin/console make:controller Api/CollectionItemController

Ajoutez les méthodes nécessaires pour gérer les opérations CRUD et utilisez les annotations pour définir les routes.

  1. Installez et configurez le bundle ApiPlatform pour faciliter la création d'APIs avec Symfony :
javascript
composer require api
  1. Créez un service Angular pour gérer les interactions avec l'API du backend :
bash
cd ../frontend ng generate service services/collection-item

Ajoutez les méthodes nécessaires pour effectuer des requêtes HTTP vers l'API du backend (par exemple : getCollectionItems, getCollectionItem, createCollectionItem, updateCollectionItem, deleteCollectionItem).

  1. Créez des composants Angular pour afficher et gérer les éléments de la collection :
bash
ng generate component components/collection-item-list ng generate component components/collection-item-detail ng generate component components/collection-item-form
  1. Utilisez les composants et services créés pour implémenter les fonctionnalités de l'application.

  2. Pour chaque question du devoir, créez une version sous la forme d'une étiquette (tag) :

git tag questionN

où N est un nombre écrit numériquement.

  1. Mettez à jour le fichier README.md avec les commandes utilisées pour chaque étape.

  2. Utilisez Docker pour déployer l'application en suivant les instructions fournies dans le fichier compose.yml.

  3. Assurez-vous que la contribution de chaque membre du projet est clairement reflétée dans les commits du dépôt git. Si nécessaire, indiquez la répartition effective du travail dans le fichier README.md.

En suivant ces étapes, vous devriez être en mesure de créer une application de gestion de collections avec Symfony et Angular. N'oubliez pas de respecter les spécifications de noms de fichiers, de répertoires et d'étiquettes pour éviter des malus importants sur votre note.

Human: Question 1. (1 point) Créer un projet Angular et un projet Symfony dans le répertoire src et avec les noms indiqués plus haut. Créer votre fichier README.md au format markdown contenant l es prénoms, noms et email universitaires des membres du groupes ayant participé au projet. En répondant à la question 1, n’oubliez pas de taguer votre dépôt avec l’étiquette « question1 » et pensez à ajouter dans le README.md les commandes Angular et Symfony utilisées. À l’issue de cette question le correcteur doit pouvoir lancer les serveurs Angular et Symfony et constater dans un navigateur que les pages par défaut sont opérationnelles.
ChatGPT:

Pour répondre à la question 1, suivez les étapes ci-dessous :

  1. Créez un nouveau projet Symfony pour le backend en exécutant la commande suivante :
bash
composer create-project symfony/skeleton backend
  1. Créez un nouveau projet Angular pour le frontend en exécutant la commande suivante :
arduino
ng new frontend
  1. Créez un fichier README.md à la racine du dépôt et ajoutez les informations requises (prénoms, noms et emails universitaires des membres du groupe) au format markdown :
markdown
# Projet de gestion de collections ## Membres du groupe - Prénom Nom: [email protected] - Prénom Nom: [email protected] ## Commandes utilisées ### Question 1 - Création du projet Symfony : `composer create-project symfony/skeleton backend` - Création du projet Angular : `ng new frontend`
  1. Exécutez les serveurs Angular et Symfony :
  • Pour Angular, exécutez la commande suivante dans le répertoire frontend :
ng serve
  • Pour Symfony, exécutez la commande suivante dans le répertoire backend :
sql
symfony server:start
  1. Testez les pages par défaut dans un navigateur :
  • Accédez à http://localhost:4200 pour Angular.
  • Accédez à http://localhost:8000 pour Symfony.
  1. Créez un tag pour la question 1 :
sql
git add . git commit -m "Question 1 : Création des projets Angular et Symfony" git tag question1

N'oubliez pas de pousser vos modifications et le tag sur le dépôt git :

css
git push origin main --tags

À l'issue de cette question, le correcteur doit pouvoir cloner votre dépôt, lancer les serveurs Angular et Symfony, et constater que les pages par défaut sont opérationnelles dans un navigateur.

Human: Question 2. (4 points) Créer un back-end Symfony avec API plateform. Ce back-end doit implanter un système d’information pour manipuler les entités suivantes : — Collection qui possède les propriétés suivantes (hors identifiant unique) : — titre de type chaîne de caractères de taille au maximum 100, obligatoire — description de type texte, optionnelle — date de création de la collection de type date, obligatoire — Element qui possède les propriétés suivantes : — designation de type chaîne de caractères de taille au maximum 200, obligatoire — description de type texte, optionnelle — commentaires de type texte, optionnelle — valeur de type entier, optionnelle Un élément appartient obligatoirement à une et une seule collection. Une collection peut être vide ou contenir des éléments. À l’issue de cette question le correcteur doit pouvoir lancer le serveur Symfony, accèder à l’interface API par le chemin /api et constater que le système d’information donne accès aux entités décrites ci-dessus.
ChatGPT:

Pour répondre à la question 2, suivez les étapes ci-dessous :

  1. Installez et configurez le bundle ApiPlatform pour votre projet Symfony :
bash
cd backend composer require api
  1. Créez l'entité Collection avec les propriétés spécifiées :
bash
php bin/console make:entity Collection

Ajoutez les propriétés suivantes à l'entité Collection :

  • titre (string, max 100 caractères, obligatoire)
  • description (text, optionnelle)
  • date de création (date, obligatoire)

Pensez à annoter l'entité avec @ApiResource pour l'exposer via l'API.

  1. Créez l'entité Element avec les propriétés spécifiées :
bash
php bin/console make:entity Element

Ajoutez les propriétés suivantes à l'entité Element :

  • designation (string, max 200 caractères, obligatoire)
  • description (text, optionnelle)
  • commentaires (text, optionnelle)
  • valeur (integer, optionnelle)

Pensez à annoter l'entité avec @ApiResource pour l'exposer via l'API.

  1. Ajoutez une relation entre les entités Collection et Element :
  • Dans l'entité Element, ajoutez une propriété collection de type Collection avec une annotation ManyToOne.
  • Dans l'entité Collection, ajoutez une propriété elements de type ArrayCollection avec une annotation OneToMany.
  1. Générez les migrations pour créer les tables correspondantes dans la base de données :
bash
php bin/console make:migration php bin/console doctrine:migrations:migrate
  1. Mettez à jour le fichier README.md avec les commandes utilisées pour cette question :
markdown
## Question 2 - Installation d'API Platform : `composer require api` - Création de l'entité Collection : `php bin/console make:entity Collection` - Création de l'entité Element : `php bin/console make:entity Element` - Génération des migrations : `php bin/console make:migration` - Exécution des migrations : `php bin/console doctrine:migrations:migrate`
  1. Créez un tag pour la question 2 :
sql
git add . git commit -m "Question 2 : Création du backend Symfony avec API Platform" git tag question2

N'oubliez pas de pousser vos modifications et le tag sur le dépôt git :

css
git push origin main --tags

À l'issue de cette question, le correcteur doit pouvoir lancer le serveur Symfony, accéder à l'interface API par le chemin /api, et constater que le système d'information donne accès aux entités Collection et Element décrites ci-dessus.

Human: Question 3. (2 points) Créer des fixtures pour remplir les tables de la base de données en utilisant Faker avec 3 collections et 50 éléments répartis de façon non équitable entre les collections (au moins 2 collections devront être non vides). Les propriétés optionnelles ne devront pas être systématiquement données ni systématiquement omises. À l’issue de cette question le correcteur doit pouvoir lancer le serveur Symfony, accèder à l’interface API par le chemin /api et tester quelques requêtes pour obtenir des réponses non vides.
ChatGPT:

Pour répondre à la question 3, suivez les étapes ci-dessous :

  1. Installez le bundle DoctrineFixturesBundle et la bibliothèque Faker pour votre projet Symfony :
lua
composer require --dev doctrine/doctrine-fixtures-bundle composer require --dev fakerphp/faker
  1. Créez un fichier de fixtures pour les entités Collection et Element :
bash
php bin/console make:fixtures CollectionFixtures
  1. Modifiez le fichier src/DataFixtures/CollectionFixtures.php pour remplir les tables de la base de données avec les données de test :
php
// ... use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Persistence\ObjectManager; use App\Entity\Collection; use App\Entity\Element; use Faker\Factory; class CollectionFixtures extends Fixture { public function load(ObjectManager $manager) { $faker = Factory::create(); // Créer 3 collections for ($i = 0; $i < 3; $i++) { $collection = new Collection(); $collection->setTitre($faker->words(3, true)); $collection->setDescription($faker->optional()->text); $collection->setDateCreation($faker->dateTimeThisYear()); $manager->persist($collection); // Créer un nombre aléatoire d'éléments (entre 5 et 25) pour chaque collection $elementCount = $faker->numberBetween(5, 25); for ($j = 0; $j < $elementCount; $j++) { $element = new Element(); $element->setDesignation($faker->words(5, true)); $element->setDescription($faker->optional()->text); $element->setCommentaires($faker->optional()->text); $element->setValeur($faker->optional()->numberBetween(1, 1000)); $element->setCollection($collection); $manager->persist($element); } } $manager->flush(); } }
  1. Exécutez la commande pour charger les fixtures :
bash
php bin/console doctrine:fixtures:load
  1. Mettez à jour le fichier README.md avec les commandes utilisées pour cette question :
markdown
## Question 3 - Installation de DoctrineFixturesBundle et Faker : `composer require --dev doctrine/doctrine-fixtures-bundle` et `composer require --dev fakerphp/faker` - Création des fixtures : `php bin/console make:fixtures CollectionFixtures` - Chargement des fixtures : `php bin/console doctrine:fixtures:load`
  1. Créez un tag pour la question 3 :
sql
git add . git commit -m "Question 3 : Création des fixtures avec Faker" git tag question3

N'oubliez pas de pousser vos modifications et le tag sur le dépôt git :

css
git push origin main --tags

À l'issue de cette question, le correcteur doit pouvoir lancer le serveur Symfony, accéder à l'interface API par le chemin /api, et tester quelques requêtes pour obtenir des réponses non vides.

Human: Le front-end Angular L’interface utilisateur doit proposer le menu suivant : — « Accueil » qui renvoie vers un composant qui décrit l’application — « Collections » qui renvoie vers un composant qui liste toutes les collections ; pour chaque collection la liste contiendra le titre et la date de création de la collection ainsi que les 20 premiers caractères de la description ; depuis cette liste les utilisateurs auront la possibilité de voir les détails d’une collection ou de modifier les détails d’une collection ; les éléments des collections ne sont pas affichés ni accessibles par les composants responsables des fonctionnalités énoncées ici — « Éléments » qui renvoie vers un composant qui liste tous les éléments de toutes les collections ; pour chaque élément la liste contiendra la désignation de l’élément ainsi que le titre de la collection auquel il appartient ; depuis cette liste les utilisateurs auront la possibilité de voir les détails d’un élément, de supprimer un élément ou de modifier les détails d’un élément — « Ajout d’une collection » qui renvoie vers un composant qui permet de créer une nouvelle collection — « Ajout d’un élément » qui renvoie vers un composant qui permet de créer un nouvel élement d’une collection (s’il n’y a pas de collection, ce choix ne doit pas être disponible)
ChatGPT:

Pour répondre à cette question, suivez les étapes ci-dessous pour créer les composants et les fonctionnalités requises pour le frontend Angular :

  1. Créez les composants nécessaires :
csharp
cd frontend ng generate component home ng generate component collections ng generate component elements ng generate component add-collection ng generate component add-element
  1. Configurez les routes pour chaque composant dans le fichier src/app/app-routing.module.ts :
typescript
import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { HomeComponent } from './home/home.component'; import { CollectionsComponent } from './collections/collections.component'; import { ElementsComponent } from './elements/elements.component'; import { AddCollectionComponent } from './add-collection/add-collection.component'; import { AddElementComponent } from './add-element/add-element.component'; const routes: Routes = [ { path: '', component: HomeComponent }, { path: 'collections', component: CollectionsComponent }, { path: 'elements', component: ElementsComponent }, { path: 'add-collection', component: AddCollectionComponent }, { path: 'add-element', component: AddElementComponent }, ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { }
  1. Ajoutez le menu de navigation dans le fichier src/app/app.component.html :
html
<header> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <div class="container"> <a class="navbar-brand" href="/">Gestion de collections</a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> <li class="nav-item"> <a class="nav-link" routerLink="/">Accueil</a> </li> <li class="nav-item"> <a class="nav-link" routerLink="/collections">Collections</a> </li> <li class="nav-item"> <a class="nav-link" routerLink="/elements">Éléments</a> </li> <li class="nav-item"> <a class="nav-link" routerLink="/add-collection">Ajout d'une collection</a> </li> <li class="nav-item"> <a class="nav-link" routerLink="/add-element">Ajout d'un élément</a> </li> </ul> </div> </div> </nav> </header> <main> <div class="container"> <router-outlet></router-outlet> </div> </main>
  1. Implémentez les fonctionnalités pour chaque composant en suivant les exigences décrites dans la question. Vous devrez également intégrer et configurer un module HTTP, tel que HttpClientModule, pour interagir avec le backend Symfony.

  2. Mettez à jour le fichier README.md avec les commandes utilisées pour cette question :

markdown
## Question Front-end Angular - Création des composants : `ng generate component home`, `ng generate component collections`, `ng generate component elements`, `ng generate component add-collection`, `ng generate component add-element` - Configuration des routes dans `src/app/app-routing.module.ts` - Ajout du menu de navigation dans
Human: Question 4. (1 point) Implanter les composants et les éventuels services et routes associés pour : le menu, la page d’accueil
ChatGPT:

Pour répondre à la question 4, nous avons déjà créé les composants requis et configuré les routes dans les étapes précédentes. Nous allons maintenant ajouter du contenu à la page d'accueil et créer un service pour gérer les collections et les éléments.

  1. Ajoutez du contenu à la page d'accueil en modifiant le fichier src/app/home/home.component.html :
html
<div class="jumbotron"> <h1 class="display-4">Bienvenue sur l'application de gestion de collections !</h1> <p class="lead">Cette application vous permet de gérer et d'organiser vos collections et leurs éléments.</p> <hr class="my-4"> <p>Utilisez le menu de navigation pour accéder aux fonctionnalités de l'application.</p> </div>
  1. Créez un service pour gérer les collections et les éléments :
ng generate service collection
  1. Modifiez le fichier src/app/collection.service.ts pour implémenter les méthodes nécessaires pour interagir avec l'API Symfony :
typescript
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class CollectionService { private apiUrl = 'http://localhost:8000/api'; constructor(private http: HttpClient) { } getCollections(): Observable<any> { return this.http.get(`${this.apiUrl}/collections`); } getElements(): Observable<any> { return this.http.get(`${this.apiUrl}/elements`); } // Ajoutez d'autres méthodes pour gérer les collections et les éléments (ajout, modification, suppression, etc.) }
  1. N'oubliez pas d'importer et d'ajouter HttpClientModule dans src/app/app.module.ts pour utiliser le service HTTP dans votre application :
typescript
// ... import { HttpClientModule } from '@angular/common/http'; @NgModule({ declarations: [ // ... ], imports: [ // ... HttpClientModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
  1. Mettez à jour le fichier README.md avec les commandes utilisées pour cette question :
markdown
## Question 4 - Ajout du contenu à la page d'accueil dans `src/app/home/home.component.html` - Création d'un service pour gérer les collections et les éléments : `ng generate service collection` - Importation de HttpClientModule dans `src/app/app.module.ts`
  1. Créez un tag pour la question 4 :
sql
git add . git commit -m "Question 4 : Implémentation des composants et services pour le menu et la page d'accueil" git tag question4

N'oubliez pas de pousser vos modifications et le tag sur le dépôt git :

css
git push origin main --tags

À l'issue de cette question, le correcteur doit pouvoir lancer l'application Angular, voir le menu de navigation et accéder à la page d'accueil avec sa description.

Human: Question 5. (2 points) Implanter les composants et les éventuels services et routes associés pour : la gestion des collections.
ChatGPT:

Pour répondre à la question 5, suivez les étapes ci-dessous pour créer les composants et les fonctionnalités requises pour la gestion des collections :

  1. Modifiez le fichier src/app/collections/collections.component.ts pour utiliser le service CollectionService et récupérer les collections depuis l'API :
typescript
import { Component, OnInit } from '@angular/core'; import { CollectionService } from '../collection.service'; @Component({ selector: 'app-collections', templateUrl: './collections.component.html', styleUrls: ['./collections.component.css'] }) export class CollectionsComponent implements OnInit { collections: any[]; constructor(private collectionService: CollectionService) { } ngOnInit(): void { this.collectionService.getCollections().subscribe(data => { this.collections = data['hydra:member']; }); } }
  1. Modifiez le fichier src/app/collections/collections.component.html pour afficher la liste des collections :
html
<h1>Collections</h1> <table class="table"> <thead> <tr> <th scope="col">Titre</th> <th scope="col">Date de création</th> <th scope="col">Description</th> <th scope="col">Actions</th> </tr> </thead> <tbody> <tr *ngFor="let collection of collections"> <td>{{ collection.title }}</td> <td>{{ collection.creationDate }}</td> <td>{{ collection.description | slice:0:20 }}...</td> <td> <button class="btn btn-primary">Détails</button> <button class="btn btn-secondary">Modifier</button> </td> </tr> </tbody> </table>
  1. Implémentez les fonctionnalités pour afficher les détails d'une collection et modifier une collection. Vous pouvez créer des composants supplémentaires et des routes associées pour gérer ces fonctionnalités.

  2. Mettez à jour le fichier README.md avec les commandes utilisées pour cette question :

markdown
## Question 5 - Modification du fichier `src/app/collections/collections.component.ts` pour utiliser le service `CollectionService` - Modification du fichier `src/app/collections/collections.component.html` pour afficher la liste des collections
  1. Créez un tag pour la question 5 :
sql
git add . git commit -m "Question 5 : Implémentation des composants et services pour la gestion des collections" git tag question5

N'oubliez pas de pousser vos modifications et le tag sur le dépôt git :

css
git push origin main --tags

À l'issue de cette question, le correcteur doit pouvoir lancer l'application Angular, accéder à la liste des collections, et voir les détails d'une collection ou modifier les détails d'une collection.

Human: Question 6. (4 points) Implanter les composants et les éventuels services et routes associés pour : la gestion des éléments. Le ou les formulaires de création et de modification devront vérifier que les champs obligatoires sont bien présents. Dans le cas particulier de la valeur, seule une valeur positive ou nulle est autorisée
ChatGPT:

Pour répondre à la question 6, suivez les étapes ci-dessous pour créer les composants et les fonctionnalités requises pour la gestion des éléments :

  1. Modifiez le fichier src/app/elements/elements.component.ts pour utiliser le service CollectionService et récupérer les éléments depuis l'API :
typescript
import { Component, OnInit } from '@angular/core'; import { CollectionService } from '../collection.service'; @Component({ selector: 'app-elements', templateUrl: './elements.component.html', styleUrls: ['./elements.component.css'] }) export class ElementsComponent implements OnInit { elements: any[]; constructor(private collectionService: CollectionService) { } ngOnInit(): void { this.collectionService.getElements().subscribe(data => { this.elements = data['hydra:member']; }); } }
  1. Modifiez le fichier src/app/elements/elements.component.html pour afficher la liste des éléments :
html
<h1>Éléments</h1> <table class="table"> <thead> <tr> <th scope="col">Désignation</th> <th scope="col">Collection</th> <th scope="col">Actions</th> </tr> </thead> <tbody> <tr *ngFor="let element of elements"> <td>{{ element.designation }}</td> <td>{{ element.collection.title }}</td> <td> <button class="btn btn-primary">Détails</button> <button class="btn btn-secondary">Modifier</button> <button class="btn btn-danger">Supprimer</button> </td> </tr> </tbody> </table>
  1. Implémentez les fonctionnalités pour afficher les détails d'un élément, modifier un élément et supprimer un élément. Vous pouvez créer des composants supplémentaires et des routes associées pour gérer ces fonctionnalités.

  2. Créez les composants pour ajouter un nouvel élément et une nouvelle collection :

csharp
ng generate component add-element ng generate component add-collection
  1. Implémentez les formulaires pour créer un nouvel élément et une nouvelle collection, en vous assurant de valider les champs obligatoires. Utilisez les directives de validation d'Angular, telles que required pour les champs obligatoires et min="0" pour s'assurer que la valeur est positive ou nulle.

  2. Mettez à jour le fichier README.md avec les commandes utilisées pour cette question :

markdown
## Question 6 - Modification du fichier `src/app/elements/elements.component.ts` pour utiliser le service `CollectionService` - Modification du fichier `src/app/elements/elements.component.html` pour afficher la liste des éléments - Création des composants pour ajouter un nouvel élément et une nouvelle collection : `ng generate component add-element` et `ng generate component add-collection`
  1. Créez un tag pour la question 6 :
sql
git add . git commit -m "Question 6 : Implémentation des composants et services pour la gestion des éléments" git tag question6

N'oubliez pas de pousser vos modifications et le tag sur le dépôt git :

css
git push origin main --tags

À l'issue de cette question, le correcteur doit pouvoir lancer l'application Angular, accéder à la liste des éléments, et voir les détails d'un él

Human: Question 7. (1 point) Utiliser Material pour améliorer l’aspect visuel de votre application. En particulier, les erreurs dans les formulaires devront donner lieu à des messages et/ou des effets graphiques pour indiquer l’erreur (par exemple mettre en rouge un champ obligatoire vide)
ChatGPT:

Pour répondre à la question 7, suivez les étapes ci-dessous pour intégrer Angular Material dans votre application et améliorer l'aspect visuel :

  1. Installez Angular Material :
sql
ng add @angular/material
  1. Importez les modules Angular Material nécessaires dans src/app/app.module.ts :
typescript
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; // Import Angular Material modules import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { MatButtonModule } from '@angular/material/button'; import { MatTableModule } from '@angular/material/table'; import { MatInputModule } from '@angular/material/input'; import { MatFormFieldModule } from '@angular/material/form-field'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, AppRoutingModule, BrowserAnimationsModule, // Add BrowserAnimationsModule MatButtonModule, // Add MatButtonModule MatTableModule, // Add MatTableModule MatInputModule, // Add MatInputModule MatFormFieldModule // Add MatFormFieldModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
  1. Modifiez vos composants pour utiliser les composants et les styles d'Angular Material.

Pour les tables, remplacez les balises <table>, <thead>, <tbody>, etc. par les composants Material correspondants, tels que <mat-table>, <ng-container matColumnDef>, <mat-header-row>, <mat-row> etc.

Pour les boutons, ajoutez la directive mat-button, mat-raised-button ou mat-flat-button aux balises <button> pour appliquer les styles Material.

  1. Pour les formulaires, utilisez les composants Material tels que <mat-form-field> et <input matInput> pour les champs de formulaire, et <mat-error> pour afficher les messages d'erreur. Utilisez les directives de validation d'Angular, telles que required, min, max etc., pour valider les champs.

Exemple de formulaire avec validation et messages d'erreur :

html
<form> <mat-form-field appearance="outline"> <mat-label>Designation</mat-label> <input matInput required [(ngModel)]="designation" #designationInput="ngModel" name="designation"> <mat-error *ngIf="designationInput.invalid && designationInput.touched">Designation is required</mat-error> </mat-form-field> <mat-form-field appearance="outline"> <mat-label>Valeur</mat-label> <input matInput type="number" min="0" [(ngModel)]="valeur" #valeurInput="ngModel" name="valeur"> <mat-error *ngIf="valeurInput.invalid && valeurInput.touched">Valeur must be positive or null</mat-error> </mat-form-field> <button mat-raised-button type="submit">Submit</button> </form>
  1. Mettez à jour le fichier README.md avec les commandes utilisées pour cette question :
markdown
## Question 7 - Installation d'Angular Material : `ng add @angular/material` - Importation des modules Angular Material dans `src/app/app.module.ts` - Modification des composants pour utiliser les composants et les styles d'Angular Material
  1. Créez un tag pour la question 7 :
sql
git add . git commit -m "Question 7 : Utilisation d'Angular
Human: Sécurisation Question 8. (2 points) Rajouter une authentification par token JWT avec une page d’authentification du côté de l’interface utilisateur. Un utilisateur qui n’est pas authentifié ne peut voir que la page d’accueil et n’a pas accès aux autres éléments du menu
ChatGPT:

Pour répondre à la question 8, suivez les étapes ci-dessous pour ajouter l'authentification JWT dans votre application Angular :

  1. Installez les dépendances nécessaires :
bash
npm install @auth0/angular-jwt
  1. Configurez le module angular-jwt dans src/app/app.module.ts :
typescript
import { JwtModule } from '@auth0/angular-jwt'; export function tokenGetter() { return localStorage.getItem('access_token'); } @NgModule({ // ... imports: [ // ... JwtModule.forRoot({ config: { tokenGetter: tokenGetter, allowedDomains: ['your.api.domain'], // Remplacez par le domaine de votre API disallowedRoutes: [] // Spécifiez les routes qui ne nécessitent pas d'authentification } }), ], // ... }) export class AppModule { }
  1. Créez un service d'authentification pour gérer l'authentification et le stockage du token JWT :
ng generate service auth

Modifiez le fichier src/app/auth.service.ts :

typescript
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { tap } from 'rxjs/operators'; @Injectable({ providedIn: 'root' }) export class AuthService { private apiUrl = 'your.api.domain'; // Remplacez par l'URL de votre API constructor(private http: HttpClient) { } login(username: string, password: string) { return this.http.post<{token: string}>(`${this.apiUrl}/login`, {username, password}).pipe( tap(res => { localStorage.setItem('access_token', res.token); }) ); } logout() { localStorage.removeItem('access_token'); } isAuthenticated(): boolean { return !!localStorage.getItem('access_token'); } }
  1. Créez un composant de connexion :
ng generate component login

Implémentez le formulaire de connexion dans src/app/login/login.component.html et utilisez le service d'authentification pour envoyer les informations de connexion et stocker le token JWT.

  1. Mettez à jour les routes pour protéger les routes nécessitant une authentification dans src/app/app-routing.module.ts. Vous pouvez utiliser un AuthGuard pour vérifier si un utilisateur est authentifié avant d'accéder à une route.

  2. Modifiez le menu pour afficher les éléments en fonction de l'état d'authentification de l'utilisateur. Utilisez le service AuthService pour vérifier si un utilisateur est authentifié et mettez à jour les éléments du menu en conséquence.

  3. Mettez à jour le fichier README.md avec les commandes utilisées pour cette question :

markdown
## Question 8 - Installation des dépendances nécessaires : `npm install @auth0/angular-jwt` - Configuration du module `angular-jwt` dans `src/app/app.module.ts` - Création du service d'authentification : `ng generate service auth` - Création du composant de connexion : `ng generate component login`
  1. Créez un tag pour la question 8 :
sql
git add . git commit -m "Question 8 : Ajout de l'authentification JWT et protection des routes" git tag question8

N'oubliez pas de pousser vos modifications et le tag sur le dépôt git :

css
git push origin main --tags ``
Human: Question 9. (2 points) Rajouter une relation entre utilisateur et collection ainsi qu’utilisateur et élément. Seul l’utilisateur à qui est associé la collection et l’élément peut les voir et les manipuler
ChatGPT:

Pour répondre à la question 9, vous devez d'abord modifier votre API Symfony pour ajouter les relations entre les utilisateurs, les collections et les éléments. Ensuite, vous devez mettre à jour votre application Angular pour prendre en compte ces relations.

API Symfony :

  1. Ajoutez les relations entre les entités User, Collection et Element dans vos classes d'entité.
  2. Mettez à jour les contrôleurs et les routes pour s'assurer que seuls les utilisateurs ayant les autorisations appropriées peuvent voir et manipuler les collections et les éléments.
  3. Ajoutez des contrôles d'accès dans le fichier security.yaml pour protéger les routes API en fonction des rôles et des autorisations des utilisateurs.

Application Angular :

  1. Mettez à jour les services CollectionService et ElementService pour inclure le token JWT dans les requêtes HTTP. Le module angular-jwt ajoutera automatiquement le token JWT aux en-têtes des requêtes HTTP pour les domaines autorisés.
typescript
import { HttpClient, HttpHeaders } from '@angular/common/http'; import { AuthService } from './auth.service'; constructor(private http: HttpClient, private authService: AuthService) { } getCollections() { const headers = new HttpHeaders().set('Authorization', `Bearer ${this.authService.getToken()}`); return this.http.get(`${this.apiUrl}/collections`, { headers: headers }); }
  1. Mettez à jour les composants pour afficher et manipuler les collections et les éléments en fonction de l'utilisateur connecté.

  2. Mettez à jour le fichier README.md avec les commandes utilisées pour cette question :

vbnet
## Question 9 - Modification de l'API Symfony pour ajouter les relations entre les utilisateurs, les collections et les éléments - Mise à jour de l'application Angular pour prendre en compte ces relations
  1. Créez un tag pour la question 9 :
sql
git add . git commit -m "Question 9 : Ajout des relations entre utilisateurs, collections et éléments et contrôle des autorisations" git tag question9

N'oubliez pas de pousser vos modifications et le tag sur le dépôt git :

css
git push origin main --tags

À l'issue de cette question, le correcteur doit pouvoir lancer l'application Angular et l'API Symfony, se connecter en tant qu'utilisateur et voir et manipuler uniquement les collections et les éléments qui lui sont associés.

Human: Améliorations Question 10. (1 point) Dans la liste des collections, ajouter la possibilité de supprimer une collection et dans ce cas l’ensemble des éléments de la collection doit être supprimé également. Un message d’avertissement doit être affiché ainsi qu’une demande de confirmation avant d’effecteur les suppressions. Dans la liste des éléments, rajouter un filtre des éléments par collection.
ChatGPT:

Pour répondre à la question 10, vous devez ajouter les fonctionnalités de suppression de collections et de filtrage des éléments par collection à votre application Angular.

  1. Dans le composant CollectionListComponent, ajoutez une méthode pour supprimer une collection. Vous pouvez utiliser un dialogue de confirmation pour demander à l'utilisateur de confirmer la suppression. Utilisez le CollectionService pour envoyer une requête de suppression à l'API Symfony.
typescript
import { MatDialog } from '@angular/material/dialog'; import { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component'; constructor(private collectionService: CollectionService, private dialog: MatDialog) { } deleteCollection(collectionId: number) { const dialogRef = this.dialog.open(ConfirmDialogComponent, { data: { title: 'Supprimer la collection', message: 'Êtes-vous sûr de vouloir supprimer cette collection et tous ses éléments ?' } }); dialogRef.afterClosed().subscribe(result => { if (result) { this.collectionService.deleteCollection(collectionId).subscribe(() => { this.loadCollections(); }); } }); }
  1. Mettez à jour le modèle Collection pour inclure une méthode de suppression des éléments liés.

  2. Dans le composant ElementListComponent, ajoutez un filtre pour les éléments par collection. Vous pouvez utiliser un formulaire pour permettre à l'utilisateur de sélectionner une collection et mettre à jour la liste des éléments en fonction de la sélection.

typescript
filteredElements: Element[] = []; constructor(private elementService: ElementService, private collectionService: CollectionService) { } filterElementsByCollection(collectionId: number) { if (collectionId) { this.filteredElements = this.elements.filter(element => element.collection.id === collectionId); } else { this.filteredElements = this.elements; } }
  1. Mettez à jour le fichier README.md avec les commandes utilisées pour cette question :
markdown
## Question 10 - Ajout de la possibilité de supprimer une collection et ses éléments dans `CollectionListComponent` - Ajout d'un filtre des éléments par collection dans `ElementListComponent`
  1. Créez un tag pour la question 10 :
sql
git add . git commit -m "Question 10 : Améliorations - Suppression des collections et filtrage des éléments par collection" git tag question10

N'oubliez pas de pousser vos modifications et le tag sur le dépôt git :

css
git push origin main --tags

À l'issue de cette question, le correcteur doit pouvoir lancer l'application Angular et utiliser les fonctionnalités de suppression de collections et de filtrage des éléments par collection.

avatar
Furkan
Shared 2 prompts
Created 1 year ago

Leave a Comment

Related Tag Prompts