Version: 2.5.0 (última)

Los Scripts Shell

Sus modelos están listos para ser utilizados. Como en el tutorial anterior, utilizará scripts shell para alimentar la base de datos.

El script create-user#

Ya existe un script llamado create-user en el directorio scripts.

Abra el archivo y sustituya su contenido por el siguiente:

// 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();
}
}

Algunas partes de este código deberían resultarle familiares.

El objeto schema se utiliza para validar los argumentos introducidos en la línea de comandos. En este caso, el script espera dos parámetros obligatorios email y password y un name opcional. La propiedad format comprueba que la cadena email es un correo electrónico (presencia del carácter @, etc).

La función main se llama después de la validación exitosa. Se divide en varias partes. Primero, crea un nuevo usuario con los argumentos especificados en la línea de comandos. Luego establece una conexión con la base de datos y guarda el usuario.

La función hashPassword se utiliza para aplicar hash y sal a las contraseñas antes de almacenarlas en la base de datos. Por razones de seguridad, debe utilizar esta función antes de guardar las contraseñas.

Construya el script.

npm run build

A continuación, cree dos nuevos usuarios.

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 intenta volver a ejecutar uno de estos comandos, obtendrá el siguiente error de MySQL, ya que la clave de correo electrónico es única.

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

El script create-story#

El script create-story es un poco más complejo ya que Story tiene una relación de muchos a uno con User.

foal generate script create-story

Abra el archivo create-story.ts y sustituya su contenido.

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();
}
}

Hemos añadido un parámetro author para saber qué usuario ha publicado el post. Se espera el correo electrónico del usuario.

La función main intenta entonces encontrar al usuario que tiene este correo electrónico. Si existe, el usuario se añade al post como autor. Si no lo hace, el script termina con un mensaje mostrado en la consola.

Construya el script.

npm run build

Y cree nuevas publicaciones para cada usuario.

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"