Version: 2.5.0 (latest)

Les Scripts Shell

Vos modèles sont prêts à être utilisés. Comme dans le tutoriel précédent, vous allez utiliser des scripts shell pour alimenter la base de données.

Le script créer-utilisateur#

Un script appelé create-user existe déjà dans le répertoire scripts.

Ouvrez le fichier et remplacez son contenu par ce qui suit :

// 3p
import { hashPassword } from '@foal/core';
import { createConnection, getConnection } from 'typeorm';
// App
import { User } from '../app/entities';
export const schema = {
additionalProperties: false,
properties: {
email: { type: 'string', format: 'email', maxLength: 255 },
password: { type: 'string' },
name: { type: 'string', maxLength: 255 },
},
required: [ 'email', 'password' ],
type: 'object',
};
export async function main(args: { email: string, password: string, name?: string }) {
const user = new User();
user.email = args.email;
user.password = await hashPassword(args.password);
user.name = args.name ?? 'Unknown';
user.avatar = '';
await createConnection();
try {
console.log(await user.save());
} catch (error) {
console.log(error.message);
} finally {
await getConnection().close();
}
}

Certaines parties de ce code devraient vous sembler familières.

L'objet schema est utilisé pour valider les arguments tapés sur la ligne de commande. Dans notre cas, le script attend deux paramètres obligatoires email et password et un optionnel name. La propriété format vérifie que la chaîne email est un email (présence du caractère @, etc).

La fonction main est appelée après que la validation ait réussi. Elle est divisée en plusieurs parties. D'abord, elle crée un nouvel utilisateur avec les arguments spécifiés dans la ligne de commande. Ensuite, elle établit une connexion avec la base de données et enregistre l'utilisateur.

La fonction hashPassword est utilisée pour hacher et saler les mots de passe avant de les stocker dans la base de données. Pour des raisons de sécurité, vous devez utiliser cette fonction avant de sauvegarder les mots de passe.

Construisez le script.

npm run build

Créez ensuite deux nouveaux utilisateurs.

foal run create-user email="john@foalts.org" password="john_password" name="John"
foal run create-user email="mary@foalts.org" password="mary_password" name="Mary"

Si vous essayez de réexécuter l'une de ces commandes, vous obtiendrez l'erreur MySQL ci-dessous car la clé email est unique.

ER_DUP_ENTRY: Duplicate entry 'john@foalts.org' for key 'IDX_xxx'

Le scénario create-story.#

Le script create-story est un peu plus complexe car Story a une relation many-to-one avec User.

foal generate script create-story

Ouvrez le fichier create-story.ts et remplacez son contenu.

import { createConnection } from 'typeorm';
import { Story, User } from '../app/entities';
export const schema = {
additionalProperties: false,
properties: {
author: { type: 'string', format: 'email', maxLength: 255 },
title: { type: 'string', maxLength: 255 },
link: { type: 'string', maxLength: 255 },
},
required: [ 'author', 'title', 'link' ],
type: 'object',
};
export async function main(args: { author: string, title: string, link: string }) {
const connection = await createConnection();
const user = await User.findOneOrFail({ email: args.author });
const story = new Story();
story.author = user;
story.title = args.title;
story.link = args.link;
try {
console.log(await story.save());
} catch (error) {
console.error(error);
} finally {
await connection.close();
}
}

Nous avons ajouté un paramètre author pour savoir quel utilisateur a posté l'article. Il attend l'email de l'utilisateur.

La fonction main essaie alors de trouver l'utilisateur qui possède cet email. S'il existe, l'utilisateur est ajouté à la story en tant qu'auteur. Si ce n'est pas le cas, le script se termine par un message affiché dans la console.

Construisez le script.

npm run build

Et créez de nouveaux posts pour chaque utilisateur.

foal run create-story author="john@foalts.org" title="How to build a simple to-do list" link="https://foalts.org/docs/tutorials/simple-todo-list/1-installation"
foal run create-story author="mary@foalts.org" title="FoalTS architecture overview" link="https://foalts.org/docs/architecture/architecture-overview"
foal run create-story author="mary@foalts.org" title="Authentication with Foal" link="https://foalts.org/docs/authentication-and-access-control/quick-start"