C'est un projet de développement d'une application mobile par l'organisme MONA, visant à découvrir, photographier et collectionner de l'art public.
J'ai rejoint l'équipe de développement du serveur MONA dans le cadre du cours projet IFT3150 en Hiver 2025.
Ma première rencontre avec l'équipe MONA a commencé avec Lena et Christian – un autre étudiant participant au projet IFT3150. Lena nous a raconté l'histoire et le développement du projet, et j'ai été très impressionné par leur capacité à rassembler une équipe de bénévoles et obtenir des subventions pour financer l'application mobile.
L'équipe est très bien organisée, dirigée par Lena Krause, et collabore entre le département d'histoire de l'art et celui de l'information et de recherche opérationnelle.
Ma tâche initiale était de créer des liens pour les rapports et de me familiariser avec l'application mobile MONA.
Cette semaine, j'ai eu la première rencontre en présentiel avec certains membres de l'équipe MONA, notamment Lena, Christian, Tiffany et Sarah. Lena nous a présenté en détail l'interface admin de MONA ainsi que l'espace Figma contenant les maquettes de l'application mobile. J'ai fourni des suggestions sur l'expérience utilisateur.
On a décidé que je travaillerais sur le côté serveur du projet. Initialement, je devais apprendre à configurer et installer le serveur avec Simon, mais il a dû s'absenter pour des raisons de santé. J'ai donc étudié la documentation des étudiants précédents, notamment Corélie, pour me familiariser avec la configuration du serveur.
Cette semaine, j'ai eu une réunion avec Lena, Christian, Tiffany et Simon. C'était la première rencontre physique avec Simon, après une réunion en ligne antérieure. Simon m'a brièvement expliqué la structure du serveur MONA et m'a aidé pour l'installation, la configuration du serveur ainsi que la migration des bases de données.
J'ai poursuivi ma collaboration avec Simon pour créer une pull request dans le répertoire mona-server
intitulée "Generation documentation for the application's APIs and code linting".
La tâche se décompose en différentes étapes :
dedoc/scramble
à cause de conflits de dépendances. J'ai résolu le problème en utilisant la commande avec Sail et en ajoutant le drapeau -W
pour autoriser toute installation, quelle que soit la version, pour permettre la mise à jour des dépendances :
./vendor/laravel/sail/bin/sail composer require dedoc/scramble:* -W
Après une installation réussie, la documentation générée est accessible via la route /docs/api
(interface utilisateur) et via /docs/api.json
(le document JSON complet conforme à la spécification OpenAPI).
./vendor/laravel/sail/bin/sail php ./vendor/bin/duster lint
./vendor/laravel/sail/bin/sail php ./vendor/bin/duster fix
prettier-plugin-blade
), j'ai lancé :
./vendor/laravel/sail/bin/sail npx prettier --write "resources/views/**/*.blade.php"
La création d'un fichier .prettierrc
est optionnelle, mais recommandée pour définir vos règles de formatage de manière cohérente. Par exemple, mon fichier .prettierrc
contient :
{
"tabWidth": 4,
"useTabs": false,
"semi": true,
"singleQuote": true,
"printWidth": 80,
"plugins": ["prettier-plugin-blade"]
}
Cette semaine, j'ai continué à travailler sur l'écriture des commentaires PHPDoc dans les contrôleurs conformément aux instructions du wiki pour tous les APIs V3 et sur le linting du code.
Problèmes rencontrés:
foreach
dans UserPlaceController) apparaissait dans la documentation générée.Validator::make(request()->route()->parameters(), [...])
générait l'erreur "Argument #2 ($node) doit être de type PhpParser\Node\Expr\Variable, PhpParser\Node\Expr\MethodCall donné".$params = request()->route()->parameters();
Validator::make($params, [
'artist' => ['integer', Rule::exists('artists', 'id')]
])->validate();
$types = ['artwork', 'place', 'heritage'];
Validator::make($request->toArray(), [
'discovery_id' => ['required', 'integer', 'min:1'],
'type' => ['required', Rule::in($types)]
])->validate();
$types
par une définition en ligne, par exemple :
Validator::make($request->toArray(), [
'discovery_id' => ['required', 'integer', 'min:1'],
'type' => ['required', Rule::in(['artwork', 'place', 'heritage'])]
])->validate();
J'ai continué à travailler sur la "validation avec OpenAPI Bundle Validator". La plupart des bundles que j'ai trouvés en ligne étaient incompatibles avec notre version PHP actuelle. Cependant, j'ai découvert un bundle validator en développement qui fonctionnait : tyamahori/laravel-openapi-validator, qui est un fork de kirschbaum-development/laravel-openapi-validator.
Je l'ai installé en utilisant Sail, publié la configuration dans config/openapi_validator.php
, et spécifié OPENAPI_PATH
dans mon fichier .env
.
Toutefois, en raison d'instructions peu claires dans leur documentation, je n'étais pas sûr de la suite à donner, et j'ai décidé de demander l'avis de Simon.
Cette semaine, j'ai travaillé avec Simon pour "rebaser" ma pull request. Concrètement, j'ai appris à regrouper tous mes anciens commits de la pull request en seulement trois commits principaux. Cela rend l'historique de travail beaucoup plus clair. À l'avenir, si je dois apporter des modifications à ma pull request, je pourrai simplement les ajouter à ces commits existants plutôt que d'en créer de nouveaux.
Cette semaine, j'ai eu l'occasion de rencontrer le professeur Guy Lapalme, responsable du projet MONA dans le cadre du cours IFT3150. Je lui ai présenté mes travaux effectués chez MONA et mes perspectives de contribution pour la suite. Après discussion avec Lena et Simon, j'ai décidé de continuer à travailler sur les API de mona-server, notamment pour améliorer la "CRUD-bilité" de l'API des badges.
Cette semaine, je n'ai malheureusement pas pu assister à notre réunion hebdomadaire à cause d'une urgence familiale. J'ai également dû préparer mes examens intra, ce qui m'a laissé moins de temps pour avancer sur mon projet. Toutefois, j'ai pu finaliser la documentation de ma pull request intitulée "Generation of OpenAPI documentation and Code linting".
./vendor/laravel/sail/bin/sail composer require dedoc/scramble:* -W
Après installation, Scramble enregistre par défaut deux routes :
/docs/api
– L'interface Web de la documentation,
/docs/api.json
– Le document OpenAPI au format JSON décrivant l'API.
./vendor/laravel/sail/bin/sail php artisan vendor:publish --provider="Dedoc\Scramble\ScrambleServiceProvider"
Cela génère notamment config/scramble.php
et resources/views/vendor/scramble/docs.blade.php
.composer install
(ou via Sail, ./vendor/laravel/sail/bin/sail composer install
) pour installer Scramble et rendre la route /docs/api
accessible.
/docs/api
en utilisant la gate viewApiDocs
ou le middleware RestrictedDocsAccess
.
Gate::define('viewApiDocs', function (User $user) {
return true;
});
'middleware' => [
'web',
// Dedoc\Scramble\Http\Middleware\RestrictedDocsAccess::class,
],
resources/views/vendor/scramble/docs.blade.php
inclut le rendu Stoplight Elements :
<elements-api
apiDescriptionUrl="{{ route('scramble.docs.index') }}"
tryItCredentialsPolicy="{{ config('scramble.ui.try_it_credentials_policy', 'include') }}"
router="hash"
@if(config('scramble.ui.hide_try_it')) hideTryIt="true" @endif
logo="{{ config('scramble.ui.logo') }}"
/>
Cela fournit une interface graphique pour consulter et tester l’API.
Une fois tout configuré, la documentation est accessible via http://votre-domaine/docs/api
et la spécification JSON via http://votre-domaine/docs/api.json
.
Réunion AGA 2024 avec l'équipe MaisonMONA :
• J'ai participé à la réunion de fin d'année 2024 avec toute l'équipe, où nous avons discuté des défis et réussites de l'année précédente, ainsi que des objectifs pour l'année à venir.
Début du travail sur l'amélioration de la "CRUD-bilité" des routes API :
• J'ai commencé à implémenter certaines fonctionnalités manquantes pour plusieurs routes, ainsi que leurs pages dans l'interface admin.
• Toutefois, je manque encore de nombreuses ressources et fais face à divers problèmes qui devront être abordés afin de mener à bien cette tâche.
Rencontres avec Simon et Corélie :
• En plus de la réunion hebdomadaire, j'ai eu plusieurs discussions avec Simon et Corélie afin de clarifier davantage la tâche que je dois accomplir.
• Lors de la rencontre avec Corélie, elle m'a aidé à peupler les données depuis la base de données vers ma base locale, tout en me montrant la version actuelle de l'interface admin et le travail qu'elle y a apporté.
• En réunion avec Simon, j'ai pu résoudre quelques problèmes Git restants sur ma précédente pull request. Au final, tout s'est bien passé et il a pu faire du merge sur la branch dev et fermer la PR. Nous avons ensuite discuté plus en détail de ma tâche visant à améliorer les fonctionnalités CRUD de l'API. Il m'a partagé plusieurs ressources à étudier et m'a demandé de rédiger un rapport sur l'état actuel des routes CRUD.
J'ai analysé et synthétisé l'état actuel des routes web.php
(partie admin) et api.php
(API v3) afin de dresser la liste des fonctionnalités CRUD existantes et manquantes. L'objectif est de déterminer où des routes doivent être ajoutées ou complétées pour couvrir tous les besoins de création, lecture, mise à jour et suppression dans l’application.
routes/web.php
)admin/artworks/create
(formulaire)admin/artworks
(store)admin/artworks
(index / liste)admin/artworks/{artwork}
(afficher un élément)admin/artworks/{artwork}/edit
(formulaire)admin/artworks/{artwork}
(mise à jour)admin/artists
(index)admin/artists/{artist}
(afficher un élément)admin/places
(index)admin/places/{place}
(afficher un élément)admin/heritages/create
(formulaire uniquement)admin/heritages
(index)admin/heritages/{heritage}
(afficher un élément)admin/users
(index)admin/users/{user}
(afficher un élément)admin/discoveries
(index) + filtragesadmin/discoveries/CreateArtwork
(formulaire)admin/discoveries/StoreArtwork
(enregistrer une œuvre)index
index
admin/home
admin/home/search
routes/api/v3/api.php
)Route::resource(...)->only(['index','show'])
index
et GET show
index
doc/artworks
, doc/artists
, doc/places
, etc.login
, POST register
password/email
, GET password/reset
, POST password/setNewPassword
auth:api
)
logout
user/
(infos du compte)user/updatePassword
, user/updateUsername
, user/updateEmail
user/photo
Route::apiResource('artworks', UserArtworkController::class)
Route::apiResource('places', UserPlaceController::class)
Route::apiResource('heritages', UserHeritageController::class)
J'ai analysé et synthétisé l'état actuel des APIs routes afin de dresser la liste des fonctionnalités CRUD existantes et manquantes. L'objectif est de déterminer où des routes doivent être ajoutées ou complétées pour couvrir tous les besoins de création, lecture, mise à jour et suppression dans l’application.
Controllers | Index | Create | Store | Show | Edit | Update | Destroy |
---|---|---|---|---|---|---|---|
Artist (Admin) | ✓ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ |
Artist (API) | ✓ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ |
Artwork (Admin) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
Artwork (API) | ✓ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ |
Place (Admin) | ✓ | ✓ | ✗ | ✓ | ✗ | ✗ | ✗ |
Place (API) | ✓ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ |
Heritage (Admin) | ✓ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ |
Heritage (API) | ✓ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ |
Badge (Admin) | ✗ | ✗ | ✓ | ✗ | ✗ | ✓ | ✗ |
Badge (API) | ✓ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ |
User (Admin) | ✓ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ |
User (API) | ✗ | ✗ | ✗ | ✓ | ✗ | ✗ | ✗ |
Remarque :
BadgeController
en admin, les actions "create" et "edit" renvoient aux pages de vue, mais ces pages n'existent pas.Artworks (api/v3/artworks)
, Place (api/v3/places)
, et Badge (api/v3/badges)
renvoient une erreur car le fichier de chemin de ces routes n'existe pas.