Création d’un blog avec Phoenix

Nous avons vu comment installer Phoenix et créer une page de base Phoenix. Nous allons maintenant réaliser une première application : la création d’un blog avec Phoenix et Liveview.

La littérature concernant cette application :

Vérification de l’environnement d’installation

Commençons par vérifier les outils installés sur notre poste de travail Windows :

  • elixir -v ‘version d’elixir
  • mix local.hex ‘mise à jour des outils hex
  • mix archive.install hex phx_new ‘mise à jour de phoenix
  • psql -V ‘version de postgres
Shell

Nous avons donc les versions suivantes :

  • elixir : 1.15.5 compilé avec Erlang/OTP 26
  • Erlang/OTP : 26
  • phoenix : 1.7.10
  • postgreSQL : 15.4

Nous nous plaçons dans le dossier des projets :

  • C:\CarbonX1\Phoenix\Projets

Initialisation du projet Blogset

Nous créons notre projet blogset dans le dossier Projets :

  • mix phx.new blogset
Shell

Dans notre dossier blogset ouvrons VS Code pour voir les versions des outils qui sont définies dans mix.exs :

  • cd blogset
  • code .

BLOGSET/mix.exs :

Plain Text

Nous voyons :

  • ligne 6 : Phoenix > 1.7.10
  • ligne 9 : Postgres > non définie
  • ligne 12 : LiveView > 0.20.1
  • ligne 16 ; TailWind > 0.2.0

Vérifions les accès à la base de données pour notre projet blogset dans BLOGSET/config/dev.exs :

Plain Text

Contrôlons que la base de données est bien configurée avec ces accès. Voir notre précédent article sur Ecto et Phoenix.

  • psql -U postgres ‘pour se connecter en tant qu’utilisateur username: postgres
  • \c ‘pour vérifier la connexion
  • \q ‘pour quitter psql
Shell

Créons la base de données pour blogset avec :

  • mix ecto.create
Shell

Nous pouvons maintenant lancer le serveur et aller sur la page Phoenix :

  • mix phx.server ‘execution du serveur
  • iex -S mix phx.server ‘ou execution en mode interactif
  • http://localhost:4000 ‘aller sur la page de l’application depuis un navigateur
Shell

La page de notre projet dans Chrome :

Créer un blog avec Phoenix#1-Visualisation de la page html du projet
Créer un blog avec Phoenix#1-Visualisation de la page html du projet

La version Phoenix utilisée est affichée en haut à gauche de la page : Phoenix Framework v.1.7.10.

Création de l’authentification du blog avec Phoenix

Phoenix permet de générer la partie authentification des applications. Nous avons :

  • Accounts : le module de gestion des Comptes utilisateurs
  • User : le module pour gérer les utilisateurs
  • users : la table des utilisateurs dans la base de données

La génération de la partie authentification du projet blogset se fait en étant dans le dossier du projet avec la commande suivante :

  • cd C:\CarbonX1\Phoenix\Projets\blogset
  • mix phx.gen.auth Accounts User users

Et nous choisissons de créer le système d’authentification avec LiveView (version par defaut).

Shell

une fois la génération effectuée, nous devons charger les nouvelles dépendances et exécuter la migration de la base de données :

  • mix deps.get
Shell
  • mix ecto.migrate
Shell

Visualisation des pages créées par le module d’authentification

Nous rechargeons la page de l’application pour voir les changement généré par la création du module d’authentification :

  • iex -S mix phx.server
  • http://localhost:4000

Nous avons 2 boutons qui apparaissent en haut à droite de la page, Register et Log in (1) :

Créer un blog avec Phoenix#2-La page accueil avec authentification
Créer un blog avec Phoenix#2-La page accueil avec authentification

Nous pouvons créer un compte puis nous connecter et nous déconnecter de l’application. Notre email de connexion apparait sur la droite, confirmant que nous sommes bien identifié par l’application.

Créer un blog avec Phoenix#3-La page création de compte
Créer un blog avec Phoenix#3-La page création de compte

Lorsque nous activons la création du compte, Liveview affiche un message de succès :

Créer un blog avec Phoenix#4-La confirmation liveview pour la création du compte
Créer un blog avec Phoenix#4-La confirmation liveview pour la création du compte

L’adresse courriel est affichée en haut de la page en signe de connection :

Créer un blog avec Phoenix#5-Adresse courriel du compte affichée
Créer un blog avec Phoenix#5-Adresse courriel du compte affichée

Lors de la déconnexion par logout, un message liveview confirme la déconnexion :

Créer un blog avec Phoenix#6-Message liveview de déconnexion
Créer un blog avec Phoenix#6-Message liveview de déconnexion

La page d’identification offre bien un bouton Mot de passe perdu :

Créer un blog avec Phoenix#7-La page d'identification
Créer un blog avec Phoenix#7-La page d’identification

Une fois identifié, nous avons le message « Welcom back! » de Liveview :

Créer un blog avec Phoenix#8-Après identification
Créer un blog avec Phoenix#8-Après identification

Lorsqu’on est connecté, nous avons la possibilité de voir les informations de notre compte par settings :

Créer un blog avec Phoenix#9-Propriété du compte identifié
Créer un blog avec Phoenix#9-Propriété du compte identifié

Lorsque nous souhaitons nous identifier et que nous avons perdu notre mot de passe nous arrivons sur la page suivante :

Créer un blog avec Phoenix#10-Page pour le mot de passe perdu
Créer un blog avec Phoenix#10-Page pour le mot de passe perdu

Liveview affiche un message pour la prise en compte du message perdu :

Créer un blog avec Phoenix#11-Prise en compte de la demande de changement du mot de passe
Créer un blog avec Phoenix#11-Prise en compte de la demande de changement du mot de passe

Vérification de la base de données utilisée par le module authentification

Nous n’avons pas encore mis en place la gestion des courriels permettant de vérifier cette fonctionnalité. Ce qui sera le sujet d’un prochain article : la gestion des boites courriel en local dans le projet Phoenix.

Nous pouvons vérifier dans la base de données la création du compte de l’utilisateur dans notre application blogset.

  • psql -U postgres ‘ouvrir psql avec l’utilisateur postgres
  • \c blogset_dev ‘se connecter à la base blogset_dev
  • \d ‘afficher la liste des tables de la base
  • select * from users; ‘afficher la table users
  • \q ‘pour quitter psql
Shell

Nous voyons que la table users contient l’email (ligne 2), un identifiant unique id (créé par defaut sans à avoir à être indiqué dans le schema) et une colonne hashed_password (ligne 4). Il n’y a pas de password dans la table, car le scema créé a indique que le password est virtuel (ligne 3). Le générateur a mis en place une gestion sécurisée des mots de passe et de l’authentification en ne conservant pas les mots de passe.

  • cd C:\CarbonX1\Phoenix\Projets\blogset ‘aller sur le repertoire du projet
  • code . ‘ouvri VS Code

Nous regardons la définition du schema créé pour la table users :

  • BLOGSET/lib/blogset/accounts/user.ex
Plain Text

La création de la table users passe par les migrations. Ecto réalise les modifications de la base de données à partir de migration. Une migration est un fichier décrivant les changements à effectuer dans la base de données. Pour la création de la table User, nous avons le fichier :

  • BLOGSET/priv/repo/migration/20231130151218_create_users_auth_tables.exs
Plain Text

Le fichier est executé une seule fois.

phx.gen.auth a aussi créé des fonctions de test que nous pouvons exécuter avec mix test.

  • mix test
Shell

Découverte du code généré par mix phx.gen.auth

Dans la partie router.ex, nous avons 2 zones pour placer nos routes vers les pages :

  • la zone libre
  • la zone sécurisée

BLOGSET/lib/blogset_web/router.ex :

Plain Text

Si nous plaçons une route en zone sécurisé require_authenticated_user, lorsque l’utilisateur saisie l’url sans être authentifié, Phoenix demande à l’utilisateur de s’identifier.

Nous pouvons vérifier la définition de require_authenticated_user en recherchant dans VS Code :

Créer un blog avec Phoenix#12-Utilisation de la recherche dans VS Code
Créer un blog avec Phoenix#12-Utilisation de la recherche dans VS Code

La recherche dans dans VS Code est actrivée par la loupe (1). Il nous suffit de copier le texte recherche (2) dans la boite de recherche (3) pour trouver dans le code la définition de require_authenticated_user. En cliquant sur le résultat, la fenetre avec lea définition s’ouvre :

BLOGSET/lib/blogset_web/user_auth.ex :

Plain Text

Complément à ajouter à l’authentification

Pour avoir les fonctionalités usuelles d’un site internet, nous devons ajouter deux fonctionnalités complémentaires :

  • la vérification de l’existance réelle du courriel indiqué à l’ouverture du compte
  • la gestion de la perte de mot de passe

Pour une gestion des comptes efficace, nous avons donc besoin d’un envoie de courriel à l’utilisateur. Cette fonction est essentielle pour finaliser le module d’authentification de nos applications.

Nous regarderons dans un autre article comment mettre cela en place.

Création des articles du blog avec Phoenix

Nous avons besoin de pouvoir créer des articles associés à notre nom d’auteur authentifié dans blogset.

Pour créer les Articles, nous créons un Contexte Stories, un module Story et la table stories. Cela se fait par la commande :

  • mix phx.gen.live Stories Story stories

Nous devons aussi ajouter les champs de la table pour la base de données avec leur type :

  • Title : string
  • Body : text
  • User_id : référence à users

La commande complète est la suivante :

  • cd C:\CarbonX1\Phoenix\Projets\blogset
  • mix phx.gen.live Stories Story stories title:string, body:text, user_id:references:users
Plain Text

Nous devons executer mix ecto.migrate pour générer la table dans PostgreSQL.

Shell

Nous avons les messages d’alerte nous indiquant que nous devons mettre à jour le fichier router.ex pour pouvoir accéder aux pages créées pour les Stories.

Rendre les pages du blog accessible avec les routes

Ajoutons les routes dans le router.ex :

BLOGSET/lib/blogset_web/router.ex :

Plain Text

Au début du fichier, nous avons ligne 20, scope « / », BlogsetWeb do.

Nous ajoutons juste après get « / », PageController, :home, en ligne 24 et suivante les routes indiquées lors de la génération mix phx.gen.live, (lignes 19 à 24).

Plain Text

Nous pouvons maintenant executer les test pour vérifier si tout fonctionne :

  • mix test
Shell

Visualisation des pages du blog créé avec Phoenix

Allons voir comment l’application se présente. Nous devrons indiquer les url des pages à voir :

  • cd C:\CarbonX1\Phoenix\Projets\blogset ‘se placer dans le dossier du projet
  • iex -S mix phx.server ‘activer le serveur avec le projet blogset
  • http://localhost:4000/stories/ ‘aller sur la page montrant les articles

Comme nous n’avons pas encore d’article, la page est vide :

Créer un blog avec Phoenix#13-La page avec la liste des articles
Créer un blog avec Phoenix#13-La page avec la liste des articles

La page présente bien les boutons pour permettre la connexion, et la création de compte. Nous avons aussi la possibilité de créer un article avec New Story.

Créer un blog avec Phoenix#14-La page pour créer les articles
Créer un blog avec Phoenix#14-La page pour créer les articles

Nous créons un article et revenons dans la liste des articles :

Créer un blog avec Phoenix#15-Le premier article de la liste
Créer un blog avec Phoenix#15-Le premier article de la liste

Au regard de l’article dans la liste nous avons deux boutons, l’un pour supprimer l’article, l’autre pour le modifier. Editons l’article :

Créer un blog avec Phoenix#16-l'article en modification
Créer un blog avec Phoenix#16-l’article en modification

Et la mise à jour se retrouve dans la liste :

Créer un blog avec Phoenix#17-liste avec article modifié
Créer un blog avec Phoenix#17-liste avec article modifié

On notera les messages explicites dans des bulles vertes, proposés par liveview.

Nous pouvons voir les articles dans la base de données :

  • cd C:\CarbonX1\Phoenix\Projets\blogset ‘se placer dans le dossier du projet
  • psql -U postgres ‘pour se connecter en tant qu’utilisateur username: postgres
  • \c ‘pour vérifier la connexion
  • \c blogset_dev ‘ pour se connecter à la base blogset_dev
  • \d ‘ liste les tables de la base blogset_dev
  • \d stories ‘ liste les colonnes de la table stories
  • select * from stories ; ‘liste les données de la table stories
  • \q ‘pour quitter postgres
Shell

Les données sont bien enregistrées dans la base de données.

Conclusion

Nous avons réalisé une première étape dans la création d’un blog avec Phoenix. Nous avons créé le schéma de la base de données et les vues avec liveview. Les enchainements sont fonctionnels pour :

  • les utilisateurs du blog
  • les articles du blog

Nous devons améliorer notre blog en créant un lien entre les articles et les auteurs. Nous devons aussi utiliser la puissance de l’autorisation Phoenix en ajoutant les messages par courriel, et nous devons mettre en place l’authentification des utilisateurs afin de données des droits sur les articles pour la suppression et la modification des articles.

Ce sera l’objet de notre prochaine article : sécuriser un blog avec Phoenix.

Si vous avez aimé l'article vous êtes libre de le partager :-)

Laisser un commentaire