One place for hosting & domains

      inspiradoras

      Cómo crear una aplicación de citas inspiradoras con AdonisJs y MySQL


      El autor seleccionó el Tech Education Fund para que recibiese una donación como parte del programa Write for DOnations.

      Introducción

      AdonisJs es un marco web simple de Node.js escrito en JavaScript que funciona en los principales sistemas operativos. Utiliza el popular patrón de diseño MVC (modelo-vista-controlador) y ofrece un ecosistema estable para escribir aplicaciones web del lado del servidor. El marco presenta características de autenticación sin inconvenientes, SQL ORM (mapeo de objetos a datos relacionales), migraciones y propagación de bases de datos. AdonisJs tiene una arquitectura similar a la del marco PHP de aplicaciones web Laravel e incluye la misma estructura de carpeta y varios conceptos de configuración compartidos.

      Por defecto, AdonisJs usa el motor de plantillas de Edge que está diseñado para usarse de forma intuitiva. Al igual que Laravel, AdonisJs incluye una ORM llamada Lucid que sirve como interfaz para la comunicación entre los modelos de una aplicación y la base de datos. Con AdonisJs, los desarrolladores pueden crear una aplicación completa en la que el servidor de backend se encargará de aplicar la lógica de negocios, realizar direccionamientos y mostrar todas las páginas de la aplicación. También es posible crear una API de servicio web para mostrar respuestas de JSON desde un controlador; estos servicios web pueden utilizarse en frameworks de frontend, como Vue.js, React y Angular.

      En este tutorial, creará una aplicación con AdonisJs usando su CLI. Creará rutas, controladores, modelos y vistas en su aplicación, y ejecutará validaciones de formularios. El ejemplo de este tutorial será una aplicación de citas inspiradoras en la que un usuario puede registrarse e iniciar sesión para crear una cita inspiradora. Esta aplicación de prueba le dará la oportunidad de realizar operaciones CURD (crear, leer, actualizar y norrar”).

      Requisitos previos

      Para comenzar a seguir los pasos de esta guía, necesitará lo siguiente:

      Nota: En este tutorial se usa una máquina macOS para el desarrollo. Si usa otro sistema operativo, es posible que deba usar sudo para comandos npm en los primeros pasos.

      Paso 1: Instalar Adonis CLI

      En esta sección, instalará Adonis CLI y todos sus paquetes necesarios en su máquina local. El CLI le permitirá escribir un nuevo proyecto AdonisJs, así como crear y generar código estándar para los controladores, los middlewares y los modelos de su aplicación. También creará su base de datos para el proyecto.

      Ejecute el siguiente comando para instalar AdonisJs CLI de forma global en su máquina a través de npm:

      Una vez que se complete el proceso de instalación, ingrese el siguiente comando en la terminal para confirmar la instalación de AdonisJs y ver la versión actual:

      Verá un resultado que mostrará la versión actual de AdonisJs:

      Output

      4.1.0

      Con la instalación correcta de AdonisJs CLI, ahora tendrá acceso al comando adonis y podrá usarlo para crear nuevas instalaciones de un proyecto de AdonisJs, administrar su proyecto y generar archivos pertinentes, como controladores y modelos, entre otros.

      Ahora, puede proceder a crear un nuevo proyecto de AdonisJs usando el comando adonis como se muestra aquí:

      • adonis new adonis-quotes-app

      Con el comando anterior se creará una aplicación llamada adonis-quotes-app en un nuevo directorio con el mismo nombre del directorio de su proyecto local, con la estructura MVC pertinente de AdonisJs.

      Diríjase a la nueva carpeta de la aplicación:

      Luego, inicie su aplicación ejecutando lo siguiente:

      Esto iniciará el servidor de desarrollo en el puerto predeterminado 3333, como se especifica dentro del archivo root .env para su aplicación. Diríjase a http://localhost:3333 para ver la página de bienvenida de AdonisJs.

      Página de bienvenida de AdonisJs

      A continuación, completará la configuración de su base de datos. Aquí, instalará el controlador mysql para establecer conexión con su servidor de MySQL desde su aplicación de Node.js a través de npm. Para comenzar, vuelva a su terminal, donde la aplicación esté actualmente en ejecución, detenga el proceso con CTRL + C y ejecute el siguiente comando:

      Ahora que ha instaló correctamente el controlador de Node.js de MySQL para esta aplicación, deberá crear la base de datos de la aplicación y configurar la conexión correspondiente.

      En la última versión de MySQL que instaló en el tutorial de los requisitos previos se utiliza un complemento de autenticación predeterminado llamado caching_sha2_password. Actualmente, esta no es compatible con los controladores de Node.js de MySQL. Para evitar cualquier problema de conexión de la base de datos de su aplicación, deberá crear un nuevo usuario de MySQL y usar el complemento de autenticación que se admite actualmente: mysql_native_password.

      Para comenzar, acceda al cliente MySQL usando la cuenta root:

      Se le solicitará ingresar la contraseña de su cuenta root configurada durante la instalación de MySQL.

      Luego, cree el usuario y la contraseña usando el complemento mysql_native_password:

      • CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

      Verá lo siguiente:

      Output

      Query OK, 0 rows affected (0.02 sec)

      Luego, cree una base de datos para la aplicación con lo siguiente:

      Verá lo siguiente:

      Output

      Query OK, 1 row affected (0.03 sec)

      Con esto, habrá creado con éxito la base de datos para esta aplicación.

      Ahora, habilite el acceso a la base de datos creada para el nuevo usuario de MySQL. Ejecute el siguiente comando para conceder todos los privilegios al usuario en la base de datos:

      • GRANT ALL PRIVILEGES ON adonis.* TO 'sammy'@'localhost';

      Vuelva a cargar las tablas de concesión ejecutando el siguiente comando para aplicar los cambios que acaba de realizar:

      Verá lo siguiente:

      Output

      Query OK, 0 rows affected (0.00 sec)

      Cierre el cliente MySQL con lo siguiente:

      Instaló el AdonisJs CLI, creó un nuevo proyecto de AdonisJs e instaló mysql​​​​ a través de npm con éxito. También creó la base de datos para esta aplicación y configuró un usuario MySQL con los privilegios correspondientes. Esta es la configuración básica para su aplicación y, en la siguiente sección, comenzará a crear las vistas necesarias para ella.

      Paso 2: Usar el motor de creación de plantillas Edge

      AdonisJs se envía con su propio motor de plantillas llamado Edge. Le permite crear una plantilla HTML reutilizable y permite la introducción de lógica de frontend en su aplicación con un volumen de código mínimo. Edge proporciona a los desarrolladores de JavaScript las herramientas mientras desarrollan una aplicación para crear un diseño basado en componentes, escribir condicionales, usar iteraciones y crear diseños de vista para contener lógicas. Todos los archivos de plantilla llevan la extensión .edge y se almacenan en el directorio resources/views.

      Las siguientes son las vistas que su aplicación necesitará para funcionar correctamente:

      • Diseño maestro: con Edge, puede crear una página que contendrá el CSS, los archivos de JavaScript comunes, jQuery y partes comunes de la interfaz de usuario que se mantendrán sin cambios en toda la aplicación; por ejemplo, la barra de navegación, el logo y el encabezado. Una vez que haya establecido la página de diseño maestro, otras vistas (páginas) en su aplicación la heredarán.
      • Vista de índice: esta página usará el diseño maestro para heredar archivos comunes y también mostrará el contenido de la página de inicio de la aplicación.
      • Página de inicio de sesión: en esta página también se usará el diseño maestro y se mostrará el formulario con los campos de entrada para el nombre de usuario y la contraseña, para que los usuarios inicien sesión.
      • Página de registro: en ella, los usuarios verán un formulario para registrarse y sus datos se guardarán en la base de datos.
      • Página de creación de citas: los usuarios usarán esta página para crear una cita inspiradora.
      • Página de edición de citas: los usuarios usarán esta página para editar una cita.
      • Página de visualización de citas: los usuarios usarán esta página para ver una cita en particular.

      Para comenzar, utilice el comando adonis para crear la página de diseño maestro ejecutando el siguiente comando:

      • adonis make:view layouts/master

      Visualizará un resultado similar al siguiente:

      Output

      ✔ create resources/views/layouts/master.edge

      Este comando creará automáticamente un archivo master.edge en su carpeta resources/views/layouts. Abra el nuevo archivo:

      • nano resources/views/layouts/master.edge

      Añádale el siguiente código:

      /resources/views/layouts/master.edge

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>adonis-quotes-app</title>
          {{ style('https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css') }}
          {{ style('style') }}
          {{ script('https://code.jquery.com/jquery-3.3.1.slim.min.js') }}
      </head>
      <body>
          <div class="container-fliud">
              @include('navbar')
              @!section('content')
          </div>
          {{ script('https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js') }}
      
      </body>
      </html>
      

      En este archivo, incluya los archivos de CDN para Bootstrap CSS, Bootstrap JavaScript y jQuery. Se agrega un nombre de archivo CSS global style.css y, dentro del div, se incluye un archivo partial llamado navbar. Para volver a la utilizar los fragmentos de código HTML que necesita en varias páginas de su aplicación, como nav o footer, puede incorporar parciales. Estos son archivos más pequeños que contienen el código repetido y agilizan su actualización para estos elementos en un lugar, en vez de hacerlo en cada instancia en la que aparece. La navbar contiene marcado para los botones de Login y Register, un logo y un enlace de inicio.

      Una vez hecho esto, todas las páginas posteriores que se crearán para esta aplicación pueden extender el diseño maestro y mostrar la navbar sin la necesidad de volver a escribir el contenido. Creará este archivo navbar más tarde en el tutorial.

      Por último, se define una etiqueta de sección @! section() para incluir contenido de otras páginas y que el diseño maestro las muestre. Para que esto funcione como se espera, todas las nuevas páginas que ampliarán el diseño maestro también deben definir una etiqueta de sección con el mismo nombre (es decir, @section('content')).

      Guarde y cierre el archivo una vez que termine de editarlo.

      Luego, use el comando adonis para crear la barra de navegación:

      Verá un resultado similar a lo siguiente:

      Output

      ✔ create resources/views/navbar.edge

      Abra el archivo recién creado:

      • nano resources/views/navbar.edge

      Luego, añádale el siguiente código:

      /resources/views/navbar.edge

      <nav class="navbar navbar-expand-lg navbar-dark text-white">
          <a class="navbar-brand" >LOGO</a>
          <button class="navbar-toggler" type="button" data-toggle="collapse" data-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 active ">
                      <a class="btn text-white" href="https://www.digitalocean.com/">Home</a>
                  </li>
              </ul>
          </div>
          <div class="navbar-right" id="navbarNav">
              @loggedIn
                  <ul class="navbar-nav">
                          <li>
                              <div class="text-right">
                                   <a href="{{route('create.quote')}}" class="btn btn-outline-primary">Create Quote</a>
                              </div>
                          </li>
      
                      <li class="nav-item dropdown">
                          <a class="nav-link dropdown-toggle" href="https://www.digitalocean.com/#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                             {{ auth.user.username}}
                          </a>
                          <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                              <form method="POST" action="{{route('logout')}}">
                                  {{ csrfField() }}
                                    <button  type="submit" class="dropdown-item" href="">logout</button>
                              </form>
                          </div>
                      </li>
                  </ul>
              @else
                  <ul class="navbar-nav">
                      <li class="nav-item active pr-2">
                          <a href="{{route('login.create')}}" class="btn btn-outline-danger">
                            login
                          </a>
                      </li>
                      <li class="nav-item active pr-2">
                          <a href="{{route('register.create')}}" class="btn btn-outline-primary">
                              Register
                          </a>
                      </li>
                  </ul>
              @endloggedIn
          </div>
      </nav>
      

      Además de definir los enlaces a la página de inicio de sesión y los botones para registrarse e iniciar sesión, añada la etiqueta @loggedIn. Después de hacer hecho esto, puede escribir una instrucción condicional para el usuario autenticado y mostrar los contenidos apropiados cuando sea necesario. Para un usuario autenticado, la aplicación mostrará su nombre de usuario y un botón para crear una nueva cita. Si el usuario no inició sesión, su aplicación mostrará un botón para hacerlo o para registrarse. Esta página se incluirá como parcial en cada página, al igual que en el diseño maestro anterior de esta aplicación.

      Guarde el archivo y ciérrelo.

      Ahora, deberá crear la página de índice que usará para la página de inicio de la aplicación. Esta brindará y mostrará la lista de todas las citas inspiradoras que los usuarios escriban:

      Visualizará un resultado similar al siguiente:

      Output

      ✔ create resources/views/index.edge

      El archivo creado aquí estará ubicado en resources/views/index.edge. Abra el archivo:

      • nano resources/views/index.edge

      Luego, añada el siguiente código:

      /resources/views/index.edge

      @layout('layouts/master')
      @section('content')
      
      <div class="container">
          <div class="text-center">
              @if(flashMessage('successmessage'))
                  <span class="alert alert-success p-1">{{ flashMessage('successmessage') }}</span>
              @endif
          </div>
          <div class="row">
              @each(quote in quotes)
                  <div class="col-md-4 mb-4 quote-wrapper">
                      <a href="https://www.digitalocean.com/view-quote/{{quote.id}}" class="w-100">
                          <div class="card shadow-lg bg-dark text-white">
                              <div class="card-body">
                                  <blockquote class="blockquote mb-0">
                                      <p>{{quote.body}}</p>
                                      <footer class="blockquote-footer">
                                          <cite title="Source Title"> {{quote.username}}</cite>
                                      </footer>
                                  </blockquote>
                                  @if(auth.user.id == quote.user_id)
                                    <div>
                                      <a  href="http://www.digitalocean.com/edit-quote/{{quote.id}}" class="btn btn-primary">edit</a>
                                      <a href="http://www.digitalocean.com/delete-quote/{{quote.id}}" class="btn btn-danger">delete</a>
                                    </div>
                                  @endif
                              </div>
                          </div>
                      </a>
                  </div>
              @else
               <div class="col-md-12 empty-quote text-center">
                      <p>No inspirational quote has been created</p>
               </div>
              @endeach
          </div>
      </div>
      @endsection
      

      Aquí, debe indicar que esta vista usará el diseño master extendiéndolo. Esta página ahora tendrá acceso a todas las bibliotecas, las hojas de estilos y la navbar​​ incluida en el diseño master. Luego, debe iterar la matriz de quotes​​​ usando la etiqueta integrada @each. La matriz de quotes pasará a esta vista desde el QuoteController que creará más tarde en este tutorial. Si no hay citas, se mostrará un mensaje apropiado.

      Guarde este archivo y ciérrelo.

      Para crear la página de inicio de sesión, ejecute el siguiente comando desde la terminal:

      • adonis make:view auth/login

      Verá un resultado similar a este:

      Output

      ✔ create resources/views/auth/login.edge

      Esto creará automáticamente una carpeta auth dentro de resources/views y también un archivo login.edge dentro de ella. Abra el archivo login.edge:

      • nano resources/views/auth/login.edge

      Añada el siguiente contenido:

      /resources/views/auth/login.edge

      @layout('layouts/master')
      @section('content')
        <div class="container">
          <div class="row">
            <div class="col-md-4 shadow bg-white mt-5 rounded offset-md-4">
              <form method="POST" action="{{route('login.store')}}">
                {{ csrfField() }}
                  <div>
                    @if(flashMessage('successmessage'))
                      <span class="alert alert-success p-1">{{ flashMessage('successmessage') }}</span>
                    @endif
                  </div>
                  <div class="form-group">
                    <label for="email">Email address</label>
                    <input type="email" class="form-control" id="email" name="email" value="{{old('email','')}}"  placeholder="Enter email">
                    {{ elIf('<span class=text-danger>$self</span>', getErrorFor('email'), hasErrorFor('email')) }}
                  </div>
                  <div class="form-group">
                    <label for="pasword">Password</label>
                    <input type="password" class="form-control" id="password" name="password" value="{{old('password','')}}" placeholder="Password">
                    {{ elIf('<span class=text-danger>$self</span>', getErrorFor('password'), hasErrorFor('password')) }}
                  </div>
      
                  <div class="text-center">
                    <button type="submit" class="btn btn-primary">Submit</button>
                  </div>
              </form>
            </div>
          </div>
        </div>
      @endsection
      

      Este archivo posee un formulario que contendrá elementos de entrada que se utilizarán a fin de recopilar el nombre de usuario y la contraseña de un usuario registrado para su correcta autenticación y comenzar a crear citas. Otro elemento importante que se debe tener en cuenta en esta página es {{ csrf Field()}. Es una variable global que AdonisJs usará para pasar el token de acceso CSRF al enviar una solicitud POST, PUT y DELETE desde su aplicación.

      Esto se implementó para proteger su aplicación contra ataques de falsificación de petición en sitios cruzados (CSRF). Funciona generando un secreto de CSRF único para cada usuario que visite su sitio web y una vez que sus usuarios envían una solicitud HTTP del frontend, se genera un token secreto correspondiente que se pasa junto con la solicitud. Esto permitirá que el middleware creado para esta solicitud en AdonisJs verifique que el token y el secreto de CSRF sean válidos y pertenezcan al usuario autenticado.

      Guarde y cierre el archivo una vez que termine.

      Luego, cree la página de registro con este comando:

      • adonis make:view auth/register

      Verá un resultado similar a este:

      Output

      ✔ create resources/views/auth/register.edge

      Ubique y abra el archivo recién creado en resources/views/auth/register.edge:

      • nano resources/views/auth/register.edge

      Añada el siguiente código:

      resources/views/auth/register.edge

      @layout('layouts/master')
      @section('content')
        <div class="container ">
          <div class="row">
              <div class="col-md-4  bg-white p-3 mt-5 shadow no-border rounded offset-md-4">
                <form method="POST" action="{{route('register.store')}}">
                  {{ csrfField() }}
                    <div class="form-group">
                      <label for="name">Fullname</label>
                      <input type="text" class="form-control" id="name" name="name"  value="{{old('name','')}}" placeholder="Enter Fullname">
                      {{ elIf('<span class=text-danger>$self</span>', getErrorFor('name'), hasErrorFor('name')) }}
                    </div>
                    <div class="form-group">
                      <label for="email">Email address</label>
                      <input type="email" class="form-control" id="email"  name="email" value="{{old('email','')}}" placeholder="Enter email">
                      {{ elIf('<span class=text-danger>$self</span>', getErrorFor('email'), hasErrorFor('email')) }}
                    </div>
                    <div class="form-group">
                      <label for="pasword">Password</label>
                      <input type="password" class="form-control" id="password" name="password" placeholder="Password">
                      {{ elIf('<span class=text-danger>$self</span>', getErrorFor('password'), hasErrorFor('password')) }}
                    </div>
                    <div class="text-center">
                        <button type="submit" class="btn btn-primary">Submit</button>
                    </div>
                </form>
              </div>
          </div>
        </div>
      @endsection
      

      De manera similar a lo que figura en la página de inicio de sesión, este archivo contiene un formulario HTML con campos de entrada para recopilar el name, el email y la password del usuario durante el proceso de registro. También se incluye el {{ csrfField()}}​​, debido que este se requiere para cada solicitud post de una aplicación de AdonisJs.

      Guarde el archivo y ciérrelo.

      Ahora, debe generar un nuevo archivo para crear una cita inspiradora ejecutando el siguiente comando desde la terminal:

      • adonis make:view quotes/create-quote

      Verá un resultado como este:

      Output

      ✔ create resources/views/quotes/create-quote.edge

      Abra resources/views/quotes/create-quote.edge:

      • nano resources/views/quotes/create-quote.edge

      Añada a este el siguiente contenido:

      /resources/views/quotes/create-quote.edge

      @layout('layouts/master')
      @section('content')
      <div class="container">
          <div class="row">
              <div class="col-md-3"></div>
              <div class="col-md-6 shadow bg-white mt-5 rounded p-3">
                  <div class="float-right">
                      <a href="https://www.digitalocean.com/" class="btn btn-outline-dark ">back</a>
                  </div>
                      <br>
      
                  <div class="clear-fix"></div>
                      <form method="POST" action="{{route('store.quote')}}">
                          {{ csrfField() }}
                          <div class="form-group">
                              <label for="quote">Create Quote</label>
                              <textarea type="text" rows="5"  name='body' id="body" class="form-control" id="quote" placeholder="Write an inspirational quote"></textarea>
                          </div>
      
                          <div class="text-center">
                              <button type="submit" class="btn btn-primary">Submit</button>
                          </div>
                      </form>
                  </div>
              </div>
              <div class="col-md-3"></div>
          </div>
      </div>
      @endsection
      

      Esta página extiende el diseño maestro y contiene un formulario HTML con un elemento de área de texto que permite al usuario ingresar texto en varias filas antes de su publicación y su manipulación a través de la ruta correspondiente.

      Guarde y cierre el archivo una vez que termine.

      Luego, cree una página para editar una cita en particular. Ejecute el siguiente comando desde la terminal:

      • adonis make:view quotes/edit-quote

      Verá lo siguiente:

      Output

      ✔ create resources/views/quotes/edit-quote.edge

      Abra el archivo con lo siguiente:

      • nano resources/views/quotes/edit-quote.edge

      Añada el siguiente contenido a resources/views/quotes/edit-quote:

      /resources/views/quotes/edit-quote.edge

      @layout('layouts/master')
      @section('content')
      <div class="container">
          <div class="row">
              <div class="col-md-6 shadow bg-white rounded p-3 offset-md-3">
                  <div class="float-right">
                      <a href="https://www.digitalocean.com/" class="btn btn-outline-dark ">back</a>
                  </div>
                  <br>
      
                  <div class="clear-fix"></div>
                  <form method="POST" action="/update-quote/{{quote.id}}">
                      {{ csrfField() }}
                      <div class="form-group">
                          <label for="pasword">Edit Quote</label>
                          <textarea type="text" rows="5"  name='body' id="body" class="form-control" id="quote" placeholder="write the inspirational quote">{{quote.body}}</textarea>
                      </div>
                      <div class="text-center">
                          <button type="submit" class="btn btn-primary">Update</button>
                      </div>
      
                  </form>
              </div>
          </div>
      </div>
      @endsection
      

      Esta página tiene contenido similar al del archivo create-quote.edge. La diferencia radica en que que contiene los detalles de una cita en particular que es necesario editar, <form method="POST" action="/update-quote/{{quote.id}}">​​​.

      Guarde el archivo y ciérrelo.

      Por último, genere una página para ver una única cita inspiradora:

      • adonis make:view quotes/quote

      Verá un resultado similar a este:

      Output

      ✔ create resources/views/quotes/quote.edge

      Abra el archivo con lo siguiente:

      • nano resources/views/quotes/quote.edge

      Añada el siguiente código:

      /resources/views/quotes/quote.edge

      @layout('layouts/master')
      @section('content')
      <div class="container">
          <div class="row">
              <div class="col-md-6 offset-md-3">
                  <div class="card shadow-lg bg-dark text-white">
                      <div class="card-body">
                          <div class="float-right">
                              <a href="https://www.digitalocean.com/" class="btn btn-outline-primary ">back</a>
                          </div>
                              <br>
                          <div class="clear-fix"></div>
                          <blockquote class="blockquote mb-0">
                              <p>{{quote.body}}</p>
                              <footer class="blockquote-footer">
                                  <cite title="Source Title">{{quote.username}}</cite>
                              </footer>
                          </blockquote>
                      </div>
                  </div>
              </div>
          </div>
      </div>
      @endsection
      

      Esta página brinda los detalles de una cita en particular, que incluye el cuerpo de la cita, quote.body y el nombre del autor que la creó, quote.username.

      Una vez que terme con el archivo, guárdelo y ciérrelo.

      Creó todas las páginas necesarias para su aplicación usando el motor de plantillas Edge. Luego, configure y cree una conexión con la base de datos de su aplicación.

      Paso 3: Crear un esquema de base de datos

      Si utiliza su aplicación ahora, generará un error porque aún no conectó la aplicación con una base de datos. En esta sección, configurará una conexión a la base de datos y luego usará el comando adonis a fin de generar un archivo de migración que se usará para crear las tablas.

      AdonisJs usa una ORM llamada Lucid ORM, que proporciona la implementación de active record para trabajar con su base de datos. Elimina la molestia de escribir consultas SQL que recuperan datos de la base de datos en tiempo real. Es especialmente útil cuando se trabaja en una aplicación compleja que requiere muchas consultas. Como ejemplo, puede recuperar todas las citas de su aplicación escribiendo lo siguiente:

      const quotes = await Quote.all()
      

      Para proceder con la configuración apropiada de la base de datos de su aplicación, asegúrese de estar aún posicionado en el directorio root de su aplicación y cree un archivo .env:

      Abra el archivo recién creado y añada el siguiente contenido:

      .env

      HOST=127.0.0.1
      PORT=3333
      NODE_ENV=development
      APP_URL=http://${HOST}:${PORT}
      CACHE_VIEWS=false
      APP_KEY=bTVOEgUvmTCfkvgrK8gEBC3Qxt1xSYr0
      DB_CONNECTION=mysql
      DB_HOST=127.0.0.1
      DB_PORT=3306
      DB_USER=sammy
      DB_PASSWORD=password
      DB_DATABASE=adonis
      SESSION_DRIVER=cookie
      HASH_DRIVER=bcrypt
      

      Por defecto, la conexión de la base de datos para una aplicación AdonisJs es SQLite, que actualizará a MySQL aquí. Especifique también el PORT para la aplicación, el entorno de la aplicación y las credenciales de su base de datos. Asegúrese de sustituir el DB_USER, DB_PASSWORD y el marcador de posición DB_DATABASE por sus credenciales.

      Luego, creará el modelo y un archivo de migración para Quote usando Adonis CLI. Para hacer esto, ejecute el siguiente comando:

      • adonis make:model Quote --migration

      Visualizará un resultado similar al siguiente:

      Output

      ✔ create app/Models/Quote.js ✔ create database/migrations/1568209992854_quote_schema.js

      Este comando creará un modelo para Quote en la carpeta app/Models y un archivo de esquema en la carpeta database/migrations​​​. El archivo de esquema recién creado llevará la marca de tiempo actual como prefijo. Abra el archivo de esquema con lo siguiente:

      • nano database/migrations/1568209992854_quote_schema.js

      Actualice su contenido con el siguiente código:

      database/migrations/…quote_schema.js

      'use strict'
      /** @type {import('@adonisjs/lucid/src/Schema')} */
      const Schema = use('Schema')
      class QuoteSchema extends Schema {
        up () {
          this.create('quotes', (table) => {
            table.increments()
            table.integer('user_id').notNullable()
            table.string('username', 80).notNullable()
            table.string('body').notNullable()
            table.timestamps()
          })
        }
        down () {
          this.drop('quotes')
        }
      }
      module.exports = QuoteSchema
      

      Un archivo de esquema de AdonisJs requiere dos métodos diferentes, que son los siguientes:

      • up: Se utiliza para crear una nueva tabla o modificar una tabla existente.
      • down: se utiliza para revertir los cambios aplicados en el método up.

      Además de los campos timestamps() y increments(), debe el contenido del archivo de esquema con los atributos de campo user_id​​​, username y el body de la cita que se creará Los campos user_id y username hacen referencia a los detalles del usuario que crea una cita en particular. Esto define una relación de uno a muchos y significa que un usuario puede poseer un número infinito de citas mientras que una sola cita solo puede pertenecer a un usuario.

      Guarde el archivo y ciérrelo.

      AdonisJs viene instalado con un modelo User y su archivo de migración por defecto, el cual requiere solo una pequeña modificación para establecer la relación entre el modelo User y Quote.

      Abra el modelo User en app/Models/User.js:

      Añada este método de inmediato después del método tokens():

      app/Models/User.js

      ...
      class User extends Model {
        ...
        tokens () {
          return this.hasMany('App/Models/Token')
        }
      
        quote () {
          return this.hasMany('App/Models/Quote')
        }
      }
      
      module.exports = User
      

      Esto establecerá una relación de uno a muchos con la tabla Quote usando user_id como la clave externa.

      Guarde el archivo y ciérrelo.

      Para finalizar esta sección, utilice el siguiente comando para ejecutar migraciones, el cual ejecutará el método up() de todos los archivos de migración:

      El resultado debe ser similar a lo siguiente:

      Output

      migrate: 1503248427885_user.js migrate: 1503248427886_token.js migrate: 1568209992854_quote_schema.js Database migrated successfully in 3.42 s

      Ya configuró y protegió una conexión con su base de datos. También creó un modelo Quote con su archivo de esquema correspondiente y una relación uno a muchos entre User y Quote. Luego, debe generar las rutas y crear controladores para gestionar solicitudes HTTP y la lógica de negocios para crear, editar y eliminar una cita inspiradora.

      Paso 4: Crear controladores y configurar rutas

      En esta sección, primero creará controladores para gestionar toda la lógica de la aplicación y luego añadirá estos controladores a una ruta específica para que los usuarios puedan acceder a ella a través de una URL.

      Para comenzar, usando Adonis CLI creará un nuevo controlador de solicitud HTTP para gestionar todos los procesos de autenticación de su aplicación con el siguiente comando:

      • adonis make:controller Auth --type http

      Este comando creará un archivo AuthController.js y lo guardará en la carpeta app/Controllers/Http. Utilice el indicador --type para indicar que desea que este controlador sea HTTP.

      Visualizará un resultado similar al siguiente:

      Output

      ✔ create app/Controllers/Http/AuthController.js

      Luego, abra el archivo del controlador recién creado:

      • nano app/Controllers/Http/AuthController.js

      Actualícelo con el siguiente contenido:

      app/Controllers/Http/AuthController.js

      'use strict'
      const User = use('App/Models/User')
      class AuthController {
      
          loginView({ view }) {
              return view.render('auth.login')
          }
          registrationView({ view }) {
              return view.render('auth.register')
          }
      
          async postLogin({ request, auth, response}) {
              await auth.attempt(request.input('email'), request.input('password'))
              return response.route('index')
          }
      
          async postRegister({ request, session, response }) {
              const user = await User.create({
                  username: request.input('name'),
                  email: request.input('email'),
                  password: request.input('password')
              })
              session.flash({ successmessage: 'User have been created successfully'})
              return response.route('login.create');
          }
      
          async logout ({ auth, response }) {
              await auth.logout()
              return response.route("https://www.digitalocean.com/")
          }
      }
      module.exports = AuthController
      

      En este archivo, debe importar el modelo User y luego crear dos métodos denominados loginView() y registerView() para mostrar las páginas de inicio de sesión y registro respectivamente. Por último, se deben crear los siguientes métodos asíncronos:

      • postLogin(): este método obtendrá los valores de email y password publicados con ayuda del método request incorporado de AdonisJs, y luego validará este usuario con los detalles de la base de datos. Si dicho usuario existe en la base de datos e ingresó la credencial correcta, regresará a la página de inicio y se autenticará para crear una nueva cita. De lo contrario,aparecerá un mensaje que indicará que las credenciales ingresadas son incorrectas.
      • postRegister(): este método recibirá el valor de username, email y password para que un usuario cree una cuenta para dicho usuario en la base de datos. Se pasará a la sesión un mensaje que indicará que se creó correctamente dicho usuario y este accederá a la página de inicio de sesión para autenticarse y comenzar a crear una cita.
      • logout(): este método gestionará la función de inicio de sesión y redireccionará el usuario de vuelta a la página de inicio.

      Guarde el archivo y ciérrelo.

      Ahora que configuró el controlador para registrar y autenticar usuarios, proseguirá creando un controlador de solicitudes HTTP para administrar todas las operaciones relacionadas con citas.

      En el terminal, ejecute el siguiente comando para crear el QuoteController:

      • adonis make:controller Quote --type http --resource

      Usar el indicador --resource creará un controlador con métodos ingeniosos predefinidos para realizar operaciones CRUD (crear, leer, actualizar y borrar).

      Verá lo siguiente:

      Output

      ✔ create app/Controllers/Http/QuoteController.js

      Ubique este archivo en app/Controllers/Http/QuoteController.js:

      • nano app/Controllers/Http/QuoteController.js

      Actualícelo con el siguiente contenido:

      app/Controllers/Http/QuoteController.js

      'use strict'
      const Quote = use('App/Models/Quote')
      
      class QuoteController {
      
        async index ({ view }) {
          const quote = await Quote.all()
          return view.render('index', {
            quotes: quote.toJSON()
          })
        }
      
        async create ({ view }) {
          return view.render('quotes.create-quote')
        }
      
        async store ({ request,auth,session, response }) {
          const quote = await Quote.create({
            user_id: auth.user.id,
            username: auth.user.username,
            body: request.input('body')
          })
          session.flash({ 'successmessage': 'Quote has been created'})
          return response.redirect("https://www.digitalocean.com/")
        }
      
        async show ({ params, view }) {
          const quote = await Quote.find(params.id)
          return view.render('quotes.view-quote', {
            quote: quote.toJSON()
          })
        }
      
        async edit ({ params, view }) {
          const quote = await Quote.find(params.id)
          return view.render('quotes.edit-quote', {
            quote: quote.toJSON()
          })
        }
      
        async update ({ params, request, response, session }) {
          const quote = await Quote.find(params.id)
          quote.body = request.input('body')
          await quote.save()
          session.flash({'successmessage': 'Quote has been updated'})
          return response.redirect("https://www.digitalocean.com/")
        }
      
        async destroy ({ params, response, session }) {
          const quote = await Quote.find(params.id)
          await quote.delete()
          session.flash({'successmessage': 'Quote has been deleted'})
          return response.redirect("https://www.digitalocean.com/")
        }
      }
      module.exports = QuoteController
      

      En este controlador, importó el modelo Quote y actualizó los siguientes métodos que se crearon automáticamente mediante AdonisJs CLI:

      • index(): permite buscar todas las citas de la base de datos y mostrarlas en la página de inicio de la aplicación.
      • create(): permite representar una página para crear citas.
      • store(): permite persistir una cita recién creada en la base de datos y mostrar una respuesta adecuada.
      • show(): permite obtener el id de una cita en particular, obtenerlo de la base de datos y procesarlo en la página para editar citas.
      • edit(): permite obtener el detalle de una cita en particular de la base de datos y representarla para su edición
      • update(): permite procesar cualquier actualización de una cita y redirigir al usuario de vuelta a la página de inicio.
      • destroy(): permite eliminar una cita en particular y eliminarla por completo de la base de datos.

      Guarde el archivo y ciérrelo.

      Después de crear todos los controladores necesarios para esta aplicación, podrá configurar las rutas para que los usuarios puedan interactuar fácilmente con su aplicación. Para comenzar, diríjase al archivo start/routes.js

      Reemplace su contenido con lo siguiente:

      start/routes.js

      'use strict'
      const Route = use('Route')
      
      Route.get("https://www.digitalocean.com/",'QuoteController.index').as('index')
      Route.get('/register','AuthController.registrationView').as('register.create')
      Route.post('/register-store','AuthController.postRegister').as('register.store').validator('Register')
      Route.get('/login','AuthController.loginView').as('login.create')
      Route.post('/login-store','AuthController.postLogin').as('login.store')
      Route.get('/view-quote/:id','QuoteController.show').as('view.quote')
      
      Route.group(() => {
          Route.get('/create-quote','QuoteController.create').as('create.quote')
          Route.post('/store-quote','QuoteController.store').as('store.quote')
          Route.get('/edit-quote/:id','QuoteController.edit').as('edit.quote')
          Route.post('/update-quote/:id','QuoteController.update').as('update.quote')
          Route.get('/delete-quote/:id','QuoteController.destroy').as('delete.quote')
          Route.post('/logout','AuthController.logout').as('logout')
      }).middleware(['auth'])
      

      Aquí, debe definir el camino para cada ruta en su aplicación, especificar los verbos del HTTP para cada acción y vincular la ruta a un método particular en cada controlador. También debe nombrar cada una de estas rutas, ya que se referencian en los controladores y las vistas.

      Para garantizar que solo los usuarios autenticados puedan acceder a todas las rutas de citas, asigne un middleware de grupo con nombre. Por último, debe añadir un método validator a la ruta de register.store para validar la entrada del usuario.

      Guarde el archivo y ciérrelo.

      Creó sus controladores y configuró las rutas para su aplicación. Luego, cree el método de validación definido en este paso.

      Paso 5: Validar el resultado del usuario

      AdonisJs no tiene validadores incorporados por defecto. Por ello, instale y registre el validador para su aplicación manualmente.

      Ejecute el siguiente comando para instalarlo:

      Abra el siguiente archivo para registrar el proveedor del validador:

      Luego, registre el proveedor del validador agregándolo a la lista de proveedores, como se muestra a continuación:

      start/app.js

      ...
      const providers = [
         ...
         '@adonisjs/cors/providers/CorsProvider',
         '@adonisjs/shield/providers/ShieldProvider',
         '@adonisjs/session/providers/SessionProvider',
         '@adonisjs/auth/providers/AuthProvider',
         '@adonisjs/validator/providers/ValidatorProvider'
      ]
      

      Ahora que instaló y registró el proveedor del validador en su aplicación, cree un validador personalizado para validar la entrada del usuario durante el registro con el siguiente comando:

      • adonis make:validator Register

      Con esto se creará un archivo Register.js en el directorio App/validators. Abra el archivo con:

      • nano app/Validators/Register.js

      Añada el siguiente código al archivo:

      app/Validators/Register.js

      'use strict'
      class Register {
        get rules () {
          return {
            name:'required',
            email:'required|email|unique:users',
            password:'required|min:8'
          }
        }
      
        get messages(){
          return{
            'name.required':'Full name is required',
            'email.required':'email is required',
            'email.unique':'email already exists',
            'password.required':'password is required',
            'password.min':'password should be at least 8 characters'
          }
        }
      }
      module.exports = Register
      

      En su aplicación, debe definir reglas para campos específicos. Si las validaciones fallan en algún momento, el validador establecerá automáticamente el error como mensaje flash y el usuario regresará al formulario.

      Guarde y cierre el archivo una vez que termine de editarlo.

      Por último, para añadir estilo a su aplicación, abra el siguiente archivo:

      Reemplace su contenido por lo siguiente:

      /public/style.css

      @import url('https://fonts.googleapis.com/css?family=Montserrat:300');
      
      html, body {
        height: 100%;
        width: 100%;
      }
      
      body {
        font-family: 'Montserrat', sans-serif;
        font-weight: 300;
        background-image: url("/splash.png");
        background-color: #220052;
      }
      
      * {
        margin: 0;
        padding: 0;
      }
      
      a {
        color: inherit;
        text-decoration: underline;
      }
      
      p {
        margin: 0.83rem 0;
      }
      
      .quote-wrapper {
        margin-top: 20px;
      }
      
      .quote-wrapper a {
        text-decoration: none;
      }
      
      .quote-wrapper a:hover {
        color: #ffffff;
      }
      
      .empty-quote {
        color: #ffffff;
      }
      
      form {
        padding: 20px;
      }
      

      En este archivo, debe actualizar el estilo CSS de su aplicación en el archivo style.css.

      Instaló y registró un proveedor de validador para verificar la entrada de los usuarios durante el proceso de registro. También actualizó el contenido de su hoja de estilos para añadir más estilos a la aplicación. En el último paso, probará su aplicación.

      Paso 6: Presentar la aplicación

      En este paso, presentará su aplicación y creará un usuario y una contraseña para probar la autenticación. También agregará una cita a su aplicación y la verá en la página de inicio.

      Para probar su aplicación, inicie el servidor de desarrollo con el siguiente comando desde el directorio root de su aplicación:

      Esto iniciará la aplicación en el puerto definido dentro del archivo .env root, el cual es 3333. Diríjase a http://localhost:3333 desde su navegador.

      Página de inicio de la aplicación de citas

      La página de inicio estará vacía en este momento, ya que no creó citas. Haga clic en el botón Register.

      Página de registro

      Ingrese sus detalles y haga clic en el botón Submit para completar el proceso de registro. Accederá a la página de inicio de sesión. Ingrese su dirección de correo electrónico y su contraseña para la autenticación.

      Página de inicio de sesión

      Una vez que esté autenticado, haga clic en el botón Crear cita.

      Página de creación de citas

      Ingrese una cita y diríjase a la página View all para ver su cita.

      Página de visualización de todas las citas

      Probó su aplicación creando y autenticando un usuario y, luego, escribiendo una cita.

      Conclusión

      A lo largo de este tutorial, creó una aplicación web con AdonisJs. Configuró la aplicación usando el AdonisJs CLI y aprovechó el CLI para crear otros archivos importantes, como controladores, modelos y vistas.

      Puede crear aplicaciones web con este marco independientemente de su tamaño y complejidad. Puede descargar el código fuente de este proyecto aquí en GitHub. Para ver más características, también puede visitar la documentación oficial.

      Si desea ver algunos de nuestros otros tutoriales del marco de JavaScript, puede consultar lo siguiente:



      Source link

      Como desenvolver um aplicativo de citações inspiradoras utilizando o AdonisJs e o MySQL


      O autor selecionou a Tech Education Fund para receber uma doação como parte do programa Write for DOnations.

      Introdução

      O AdonisJs é um framework Web Node.js, escrito em JavaScript simples, que é executado em todos os grandes sistemas operacionais. Ele utiliza o padrão de design popular MVC (Modelo – Visão – Controle) e oferece um ecossistema estável para a escrita de aplicativos Web do servidor. O framework possui autenticação contínua, SQL ORM (mapeamento objeto-relacional), migrations e a propagação de banco de dados. O AdonisJs tem uma arquitetura semelhante ao framework PHP de aplicativo Web, o Laravel, incluindo a mesma estrutura de pasta e vários conceitos de configuração compartilhados.

      Por padrão, o AdonisJs utiliza o mecanismo de modelo Edge, projetado para um uso intuitivo. Assim como o Laravel, o AdonisJs vem com um ORM chamado Lucid que funciona como uma interface para a comunicação entre os modelos de um aplicativo e o banco de dados. Com o AdonisJs, os desenvolvedores podem desenvolver um aplicativo de pilha completa, onde o servidor de back-end será o responsável pela aplicação da lógica de negócios, roteamento e renderização de todas as páginas do aplicativo. Também é possível criar um serviço Web API para retornar as respostas JSON de um controlador; esses serviços Web podem ser consumidos usando os frameworks de front-end, como o Vue.js, o React e o Angular.

      Neste tutorial, você desenvolverá um aplicativo com o AdonisJs usando sua CLI. Você criará rotas, controladores, modelos e visualizações dentro do seu aplicativo e executará as validações de formulário. O exemplo neste tutorial será um aplicativo de citações inspiradoras, no qual um usuário pode se inscrever e fazer o login para criar uma citação inspiradora. Este aplicativo de demonstração dará a você a oportunidade de realizar as operações CRUD (Criar, Ler, Atualizar e Excluir).

      Pré-requisitos

      Antes de iniciar este guia, você precisará do seguinte:

      Nota: este tutorial utiliza uma máquina macOS para desenvolvimento. Caso esteja usando outro sistema operacional, talvez seja necessário, nos primeiros passos, usar os comandos sudo para o npm.

      Passo 1 — Instalando o Adonis CLI

      Nesta seção, você instalará o Adonis CLI e todos os seus pacotes necessários em sua máquina local. O CLI permitirá que você faça a exibição de scaffold em um novo projeto do AdonisJs, bem como criar e gerar um boilerplate para controladores, middlewares e modelos em seu aplicativo. Você também criará seu banco de dados para o projeto.

      Execute o seguinte comando para instalar o AdonisJs CLI em sua máquina, de maneira global, via npm:

      Assim que o processo de instalação terminar, digite o seguinte comando no terminal para confirmar a instalação do AdonisJs e visualizar a versão atual:

      Você verá o resultado mostrando a versão atual do AdonisJs:

      Output

      4.1.0

      Com a instalação do AdonisJs CLI bem-sucedida, você tem acesso e pode usar o comando adonis para criar novas instalações de um projeto AdonisJs, gerenciar seu projeto e gerar arquivos relevantes, como os controladores, modelos, etc.

      Agora, você pode prosseguir para criar um novo projeto do AdonisJs usando o comando adonis como mostrado aqui:

      • adonis new adonis-quotes-app

      O comando anterior criará um aplicativo chamado adonis-quotes-app em um novo diretório com o mesmo nome em seu diretório local com a estrutura relevante do AdonisJs MVC.

      Vá para a pasta do novo aplicativo:

      Então, inicie seu aplicativo executando:

      Isso inicializará o servidor de desenvolvimento na porta padrão 3333, como especificado no arquivo root .env para seu aplicativo. Vá para http://localhost:3333 para visualizar a página de boas-vindas do AdonisJs.

      Página de boas-vindas do AdonisJs

      Agora, você completará a configuração do seu banco de dados. Aqui, você instalará o driver do mysql para se conectar ao seu servidor MySQL através do seu aplicativo Node.js via npm. Para começar, volte para seu terminal onde o aplicativo está funcionando, pare o processo com CTRL + C e execute o seguinte comando:

      Agora que você instalou o driver do MySQL Node.js com êxito para este aplicativo, será necessário criar o banco de dados do aplicativo e configurar a conexão apropriada para ele.

      A versão mais recente do MySQL que você instalou através do tutorial de pré-requisitos utiliza um plug-in de autenticação padrão chamado caching_sha2_password. Ele ainda não é compatível com drivers do Node.js para o MySQL. Para evitar qualquer problema de conexão de banco de dados do seu aplicativo, será necessário criar um novo usuário do MySQL e usar o plug-in de autenticação atualmente suportado, o —mysql_native_password.

      Para começar, acesse o cliente do MySQL usando a conta root:

      Será solicitado que você digite sua senha de conta root, definida durante a instalação do MySQL.

      Em seguida, crie o usuário e a senha usando o plug-in do mysql_native_password:

      • CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

      Você verá o seguinte resultado:

      Output

      Query OK, 0 rows affected (0.02 sec)

      Em seguida, crie um banco de dados para o aplicativo com:

      Você verá o seguinte resultado:

      Output

      Query OK, 1 row affected (0.03 sec)

      Você criou o banco de dados para este aplicativo com sucesso.

      Agora, habilite o acesso ao banco de dados criado para o novo usuário do MySQL. Execute o seguinte comando para conceder todos os privilégios ao usuário no banco de dados:

      • GRANT ALL PRIVILEGES ON adonis.* TO 'sammy'@'localhost';

      Recarregue as tabelas de concessão, executando o seguinte comando para aplicar as alterações que acabou de fazer:

      Você verá o seguinte resultado:

      Output

      Query OK, 0 rows affected (0.00 sec)

      Saia do cliente do MySQL com:

      Você instalou o AdonisJs CLI com sucesso, criou um novo projeto do AdonisJs e instalou o mysql via npm. Você também criou o banco de dados para este aplicativo e configurou um usuário do MySQL com os privilégios apropriados a ele. Esta é a configuração básica do seu aplicativo e, na seção seguinte, você começará a criar as visualizações necessárias para seu aplicativo.

      Passo 2 — Usando o mecanismo de modelagem Edge

      O AdonisJs vem com seu próprio mecanismo de modelo chamado Edge. Ele permite que você crie um modelo HTML reutilizável e habilita a introdução da lógica de front-end em seu aplicativo com o mínimo de código. O Edge fornece aos desenvolvedores de JavaScript as ferramentas ao desenvolver um aplicativo para compilar um layout baseado em componentes, escrever condicionais, usar iterações e criar camadas de visualização para reter a lógica. Todos os arquivos do modelo terminam com a extensão .edge, e são armazenados no diretório resources/views.

      A seguir, são exibidas as visualizações que seu aplicativo precisará para funcionar corretamente:

      • Master Layout: com o Edge, é possível criar uma página que terá CSS, arquivos comuns do JavaScript, jQuery e as partes comuns da interface do usuário que serão as mesmas ao longo do aplicativo — por exemplo, a barra de navegação, logotipo, cabeçalho, etc. Uma vez que tiver estabelecido a página de Layout Mestre, outras visualizações (páginas) em seu aplicativo a herdarão.
      • Index view: essa página utilizará o layout mestre para herdar arquivos comuns e também renderizará o conteúdo para a página inicial do aplicativo.
      • Login page: essa página também usará o layout mestre e renderizará o formulário com os campos de entrada para o nome de usuário e a senha para os usuários fazerem o login.
      • Register page: aqui, os usuários verão um formulário para registrar e ter seus detalhes permanentes no banco de dados.
      • Create quote page: os usuários utilizarão essa página para criar uma citação inspiradora.
      • Edit quote page: os usuários usarão esta página para editar uma citação.
      • View quote page: os usuários utilizarão está página para visualizar uma citação em particular.

      Para começar, use o comando adonis para criar a página de layout mestre executando o seguinte comando:

      • adonis make:view layouts/master

      Você verá um resultado similar ao seguinte:

      Output

      ✔ create resources/views/layouts/master.edge

      Esse comando criará automaticamente um arquivo master.edge em sua pasta resources/views/layouts. Abra o novo arquivo:

      • nano resources/views/layouts/master.edge

      Adicione o seguinte código nele:

      /resources/views/layouts/master.edge

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>adonis-quotes-app</title>
          {{ style('https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css') }}
          {{ style('style') }}
          {{ script('https://code.jquery.com/jquery-3.3.1.slim.min.js') }}
      </head>
      <body>
          <div class="container-fliud">
              @include('navbar')
              @!section('content')
          </div>
          {{ script('https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js') }}
      
      </body>
      </html>
      

      Neste arquivo, inclua os arquivos CDN para o Bootstrap CSS, o Bootstrap JavaScript e o jQuery. Adicione um nome de arquivo CSS global de nome style.css e dentro do div, inclua um arquivo partial chamado navbar. Para reutilizar os fragmentos do código HTML necessários em várias páginas em seu aplicativo, como nav ou footer, incorpore as parciais. Esses são arquivos menores que contêm o código repetido, tornando mais rápida a atualização do código desses elementos em um único local, em vez de toda instância que ele ocorre. O navbar contém marcações para botões de Login e de Register, um logotipo e um link de página inicial.

      Com isso funcionando, todas as páginas seguintes que serão criadas para este aplicativo podem estender o layout mestre e ter a navbar renderizada sem a necessidade de escrever o conteúdo novamente. Você criará este arquivo navbar mais tarde no tutorial.

      Por fim, defina uma tag de seção @! section() para incluir o conteúdo de outras páginas e tê-las renderizadas pelo layout mestre. Para que isso funcione como esperado, todas as novas páginas que estendem o layout mestre também devem definir uma tag de seção com o mesmo nome (ou seja, @section('content')​​​).

      Salve e saia do arquivo assim que terminar de editá-lo.

      Em seguida, você usará o comando adonis para criar a barra de navegação:

      Você verá um resultado parecido com este:

      Output

      ✔ create resources/views/navbar.edge

      Abra o arquivo recém-criado:

      • nano resources/views/navbar.edge

      Então, adicione o seguinte código a ele:

      /resources/views/navbar.edge

      <nav class="navbar navbar-expand-lg navbar-dark text-white">
          <a class="navbar-brand" >LOGO</a>
          <button class="navbar-toggler" type="button" data-toggle="collapse" data-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 active ">
                      <a class="btn text-white" href="https://www.digitalocean.com/">Home</a>
                  </li>
              </ul>
          </div>
          <div class="navbar-right" id="navbarNav">
              @loggedIn
                  <ul class="navbar-nav">
                          <li>
                              <div class="text-right">
                                   <a href="{{route('create.quote')}}" class="btn btn-outline-primary">Create Quote</a>
                              </div>
                          </li>
      
                      <li class="nav-item dropdown">
                          <a class="nav-link dropdown-toggle" href="https://www.digitalocean.com/#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                             {{ auth.user.username}}
                          </a>
                          <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                              <form method="POST" action="{{route('logout')}}">
                                  {{ csrfField() }}
                                    <button  type="submit" class="dropdown-item" href="">logout</button>
                              </form>
                          </div>
                      </li>
                  </ul>
              @else
                  <ul class="navbar-nav">
                      <li class="nav-item active pr-2">
                          <a href="{{route('login.create')}}" class="btn btn-outline-danger">
                            login
                          </a>
                      </li>
                      <li class="nav-item active pr-2">
                          <a href="{{route('register.create')}}" class="btn btn-outline-primary">
                              Register
                          </a>
                      </li>
                  </ul>
              @endloggedIn
          </div>
      </nav>
      

      Além de definir os links para a página inicial e um botão para registrar e fazer login, adicione uma tag @loggedIn. Com isso funcionando, é possível escrever uma instrução condicional em torno do usuário autenticado e exibir o conteúdo adequado, sempre que necessário. Para um usuário autenticado, o aplicativo exibirá seu nome de usuário e um botão para criar uma nova citação. Caso um usuário não esteja logado, seu aplicativo exibirá um botão para fazer login ou registrar-se. Essa página será incluída como uma parcial em cada página, como estava antes no layout mestre para este aplicativo.

      Salve e saia do arquivo.

      Agora, você criará a página de índice que será usada para a página inicial do aplicativo. Ele renderizará e exibirá a lista de todas citações inspiradoras que os usuários escrevem:

      Você verá um resultado similar ao seguinte:

      Output

      ✔ create resources/views/index.edge

      O arquivo criado aqui estará localizado em resources/views/index.edge. Abra o arquivo:

      • nano resources/views/index.edge

      Então, adicione as linhas a seguir:

      /resources/views/index.edge

      @layout('layouts/master')
      @section('content')
      
      <div class="container">
          <div class="text-center">
              @if(flashMessage('successmessage'))
                  <span class="alert alert-success p-1">{{ flashMessage('successmessage') }}</span>
              @endif
          </div>
          <div class="row">
              @each(quote in quotes)
                  <div class="col-md-4 mb-4 quote-wrapper">
                      <a href="https://www.digitalocean.com/view-quote/{{quote.id}}" class="w-100">
                          <div class="card shadow-lg bg-dark text-white">
                              <div class="card-body">
                                  <blockquote class="blockquote mb-0">
                                      <p>{{quote.body}}</p>
                                      <footer class="blockquote-footer">
                                          <cite title="Source Title"> {{quote.username}}</cite>
                                      </footer>
                                  </blockquote>
                                  @if(auth.user.id == quote.user_id)
                                    <div>
                                      <a  href="http://www.digitalocean.com/edit-quote/{{quote.id}}" class="btn btn-primary">edit</a>
                                      <a href="http://www.digitalocean.com/delete-quote/{{quote.id}}" class="btn btn-danger">delete</a>
                                    </div>
                                  @endif
                              </div>
                          </div>
                      </a>
                  </div>
              @else
               <div class="col-md-12 empty-quote text-center">
                      <p>No inspirational quote has been created</p>
               </div>
              @endeach
          </div>
      </div>
      @endsection
      

      Aqui, indique que essa visualização utilizará o layout master, estendendo-a. Esta página pode ter acesso a todas as bibliotecas, folhas de estilos e a navbar incluída no layout master. Em seguida, itere sobre uma matriz de quotes utilizando a tag integrada @each. A matriz de quotes será enviada para essa visualização a partir do QuoteController, que você criará mais tarde neste tutorial. Caso não haja aspas, uma mensagem adequada será exibida.

      Salve e saia deste arquivo.

      Agora, para criar a página de login, execute o seguinte comando a partir do terminal:

      • adonis make:view auth/login

      Você verá um resultado semelhante a:

      Output

      ✔ create resources/views/auth/login.edge

      Isso criará automaticamente uma pasta auth dentro de resources/views e também criará um arquivo login.edge dentro dela. Abra o arquivo login.edge:

      • nano resources/views/auth/login.edge

      Adicione o conteúdo a seguir:

      /resources/views/auth/login.edge

      @layout('layouts/master')
      @section('content')
        <div class="container">
          <div class="row">
            <div class="col-md-4 shadow bg-white mt-5 rounded offset-md-4">
              <form method="POST" action="{{route('login.store')}}">
                {{ csrfField() }}
                  <div>
                    @if(flashMessage('successmessage'))
                      <span class="alert alert-success p-1">{{ flashMessage('successmessage') }}</span>
                    @endif
                  </div>
                  <div class="form-group">
                    <label for="email">Email address</label>
                    <input type="email" class="form-control" id="email" name="email" value="{{old('email','')}}"  placeholder="Enter email">
                    {{ elIf('<span class=text-danger>$self</span>', getErrorFor('email'), hasErrorFor('email')) }}
                  </div>
                  <div class="form-group">
                    <label for="pasword">Password</label>
                    <input type="password" class="form-control" id="password" name="password" value="{{old('password','')}}" placeholder="Password">
                    {{ elIf('<span class=text-danger>$self</span>', getErrorFor('password'), hasErrorFor('password')) }}
                  </div>
      
                  <div class="text-center">
                    <button type="submit" class="btn btn-primary">Submit</button>
                  </div>
              </form>
            </div>
          </div>
        </div>
      @endsection
      

      Esse arquivo possui um formulário que contém elementos de entrada que você utilizará para coletar o nome de usuário e a senha de um usuário registrado, antes de serem autenticados e começarem a criar citações com sucesso. Outro elemento importante para notar nesta página é o {{ csrfField() }}. É uma variável global que o AdonisJs utilizará para passar o token de acesso CSRF quando enviarem um pedido POST, PUT e DELETE de seu aplicativo.

      Isso foi colocado em funcionamento para proteger seu aplicativo de ataques de Falsificação de Solicitação Entre Sites (CSRF). Ele funciona criando um segredo de CSRF único para cada usuário que visita seu site e assim que eles enviarem um pedido HTTP a partir do front-end, um token correspondente é gerado para este segredo e transmitido com o pedido. Isso permitirá que o middleware, criado para essa solicitação dentro do AdonisJs, verifique se o segredo do token e do CSRF é válido e pertence ao usuário atualmente autenticado.

      Salve e saia do arquivo assim que terminar.

      Em seguida, você criará a página de registro com este comando:

      • adonis make:view auth/register

      Você verá um resultado parecido com este:

      Output

      ✔ create resources/views/auth/register.edge

      Localize e abra o arquivo recém-criado em resources/views/auth/register.edge:

      • nano resources/views/auth/register.edge

      Adicione as linhas a seguir:

      resources/views/auth/register.edge

      @layout('layouts/master')
      @section('content')
        <div class="container ">
          <div class="row">
              <div class="col-md-4  bg-white p-3 mt-5 shadow no-border rounded offset-md-4">
                <form method="POST" action="{{route('register.store')}}">
                  {{ csrfField() }}
                    <div class="form-group">
                      <label for="name">Fullname</label>
                      <input type="text" class="form-control" id="name" name="name"  value="{{old('name','')}}" placeholder="Enter Fullname">
                      {{ elIf('<span class=text-danger>$self</span>', getErrorFor('name'), hasErrorFor('name')) }}
                    </div>
                    <div class="form-group">
                      <label for="email">Email address</label>
                      <input type="email" class="form-control" id="email"  name="email" value="{{old('email','')}}" placeholder="Enter email">
                      {{ elIf('<span class=text-danger>$self</span>', getErrorFor('email'), hasErrorFor('email')) }}
                    </div>
                    <div class="form-group">
                      <label for="pasword">Password</label>
                      <input type="password" class="form-control" id="password" name="password" placeholder="Password">
                      {{ elIf('<span class=text-danger>$self</span>', getErrorFor('password'), hasErrorFor('password')) }}
                    </div>
                    <div class="text-center">
                        <button type="submit" class="btn btn-primary">Submit</button>
                    </div>
                </form>
              </div>
          </div>
        </div>
      @endsection
      

      De maneira similar a que você tem na página de login, este arquivo contém um formulário HTML com campos de entrada para coletar o name, email e o password de um usuário durante o processo de registro. O {{ csrfField() }} também está incluído, uma vez que ele é necessário para cada pedido de postagem em um aplicativo do AdonisJs.

      Salve e saia do arquivo.

      Agora, gere um novo arquivo para criar uma citação inspiradora, executando o seguinte comando a partir do terminal:

      • adonis make:view quotes/create-quote

      Você verá um resultado como:

      Output

      ✔ create resources/views/quotes/create-quote.edge

      Abra o resources/views/quotes/create-quote.edge:

      • nano resources/views/quotes/create-quote.edge

      E adicione o conteúdo a seguir a ele:

      /resources/views/quotes/create-quote.edge

      @layout('layouts/master')
      @section('content')
      <div class="container">
          <div class="row">
              <div class="col-md-3"></div>
              <div class="col-md-6 shadow bg-white mt-5 rounded p-3">
                  <div class="float-right">
                      <a href="https://www.digitalocean.com/" class="btn btn-outline-dark ">back</a>
                  </div>
                      <br>
      
                  <div class="clear-fix"></div>
                      <form method="POST" action="{{route('store.quote')}}">
                          {{ csrfField() }}
                          <div class="form-group">
                              <label for="quote">Create Quote</label>
                              <textarea type="text" rows="5"  name='body' id="body" class="form-control" id="quote" placeholder="Write an inspirational quote"></textarea>
                          </div>
      
                          <div class="text-center">
                              <button type="submit" class="btn btn-primary">Submit</button>
                          </div>
                      </form>
                  </div>
              </div>
              <div class="col-md-3"></div>
          </div>
      </div>
      @endsection
      

      Essa página estende o layout mestre e contém um formulário HTML com um elemento de área de texto. Este elemento permite que um usuário digite um texto em várias linhas antes de ser postado e tratado pela rota apropriada.

      Salve e saia do arquivo assim que terminar.

      Em seguida, crie uma página para edição de uma citação em particular. Execute o comando a seguir a partir do terminal:

      • adonis make:view quotes/edit-quote

      Você verá o seguinte resultado:

      Output

      ✔ create resources/views/quotes/edit-quote.edge

      Abra o arquivo com:

      • nano resources/views/quotes/edit-quote.edge

      Adicione o conteúdo a seguir ao resources/views/quotes/edit-quote:

      /resources/views/quotes/edit-quote.edge

      @layout('layouts/master')
      @section('content')
      <div class="container">
          <div class="row">
              <div class="col-md-6 shadow bg-white rounded p-3 offset-md-3">
                  <div class="float-right">
                      <a href="https://www.digitalocean.com/" class="btn btn-outline-dark ">back</a>
                  </div>
                  <br>
      
                  <div class="clear-fix"></div>
                  <form method="POST" action="/update-quote/{{quote.id}}">
                      {{ csrfField() }}
                      <div class="form-group">
                          <label for="pasword">Edit Quote</label>
                          <textarea type="text" rows="5"  name='body' id="body" class="form-control" id="quote" placeholder="write the inspirational quote">{{quote.body}}</textarea>
                      </div>
                      <div class="text-center">
                          <button type="submit" class="btn btn-primary">Update</button>
                      </div>
      
                  </form>
              </div>
          </div>
      </div>
      @endsection
      

      Essa página possui conteúdo semelhante ao do arquivo create-quote.edge—a diferença é que ela contém os detalhes de uma citação em particular que precisa ser editada, o <form method="POST" action="/update-quote/{{quote.id}}">.

      Salve e saia do arquivo.

      Por fim, gere uma página para visualizar uma única citação inspiradora:

      • adonis make:view quotes/quote

      Você verá um resultado parecido com este:

      Output

      ✔ create resources/views/quotes/quote.edge

      Abra o arquivo com:

      • nano resources/views/quotes/quote.edge

      Adicione as linhas a seguir:

      /resources/views/quotes/quote.edge

      @layout('layouts/master')
      @section('content')
      <div class="container">
          <div class="row">
              <div class="col-md-6 offset-md-3">
                  <div class="card shadow-lg bg-dark text-white">
                      <div class="card-body">
                          <div class="float-right">
                              <a href="https://www.digitalocean.com/" class="btn btn-outline-primary ">back</a>
                          </div>
                              <br>
                          <div class="clear-fix"></div>
                          <blockquote class="blockquote mb-0">
                              <p>{{quote.body}}</p>
                              <footer class="blockquote-footer">
                                  <cite title="Source Title">{{quote.username}}</cite>
                              </footer>
                          </blockquote>
                      </div>
                  </div>
              </div>
          </div>
      </div>
      @endsection
      

      Essa página renderiza os detalhes de uma citação em particular, que inclui o corpo da citação, quote.body e o autor que a criou, quote.username.

      Quando terminar o arquivo, salve e saia.

      Você criou todas as páginas necessárias para o seu aplicativo, utilizando o mecanismo de modelagem Edge. Em seguida, você configurará e criará uma conexão para o banco de dados do seu aplicativo.

      Passo 3 — Criando um esquema de banco de dados

      Se oferecer o seu aplicativo agora, ele emitirá um erro, pois você ainda deve conectar o aplicativo a um banco de dados. Nesta seção, você configurará uma conexão com o banco de dados e, depois, usará o comando adonis para gerar um arquivo de migração que será usado para criar as tabelas para ele.

      O AdonisJs vem com um ORM chamado Lucid ORM, que fornece a implantação de registro ativo para trabalhar com o seu banco de dados. Ele elimina o incômodo de escrever consultas SQL que recuperam os dados do banco de dados em tempo real. Isso é especialmente útil ao trabalhar em um aplicativo complexo que exige muitas consultas. Como exemplo, é possível recuperar todas as citações do seu aplicativo escrevendo isso:

      const quotes = await Quote.all()
      

      Para prosseguir com a configuração apropriada para o banco de dados do seu aplicativo, certifique-se de que você ainda esteja dentro do diretório raiz do seu aplicativo e crie um arquivo .env:

      Abra o arquivo recém-criado e adicione o seguinte conteúdo:

      .env

      HOST=127.0.0.1
      PORT=3333
      NODE_ENV=development
      APP_URL=http://${HOST}:${PORT}
      CACHE_VIEWS=false
      APP_KEY=bTVOEgUvmTCfkvgrK8gEBC3Qxt1xSYr0
      DB_CONNECTION=mysql
      DB_HOST=127.0.0.1
      DB_PORT=3306
      DB_USER=sammy
      DB_PASSWORD=password
      DB_DATABASE=adonis
      SESSION_DRIVER=cookie
      HASH_DRIVER=bcrypt
      

      Por padrão, a conexão de banco de dados para um aplicativo AdonisJs é a SQLite, que você atualizará para o MySQL aqui. Você também especificará o PORT para o aplicativo, o ambiente do aplicativo e as credenciais de seu banco de dados. Certifique-se de substituir o espaço reservado para o DB_USER, DB_PASSWORD e DB_DATABASE pelas suas credenciais.

      Em seguida, você criará o modelo e um arquivo de migração para o Quote usando o Adonis CLI. Para fazer isso, execute o seguinte comando:

      • adonis make:model Quote --migration

      Você verá um resultado parecido com o seguinte:

      Output

      ✔ create app/Models/Quote.js ✔ create database/migrations/1568209992854_quote_schema.js

      Esse comando criará um modelo para o Quote na pasta app/Models e um arquivo de esquema na pasta database/migrations. O arquivo de esquema recém-criado será prefixado com o carimbo de data/hora atual. Abra o arquivo de esquema com:

      • nano database/migrations/1568209992854_quote_schema.js

      Atualize seu conteúdo com o seguinte código:

      database/migrations/…quote_schema.js

      'use strict'
      /** @type {import('@adonisjs/lucid/src/Schema')} */
      const Schema = use('Schema')
      class QuoteSchema extends Schema {
        up () {
          this.create('quotes', (table) => {
            table.increments()
            table.integer('user_id').notNullable()
            table.string('username', 80).notNullable()
            table.string('body').notNullable()
            table.timestamps()
          })
        }
        down () {
          this.drop('quotes')
        }
      }
      module.exports = QuoteSchema
      

      Um arquivo de esquema no AdonisJs exige dois métodos diferentes, que são:

      • up: usado para criar uma nova tabela ou alterar uma tabela existente.
      • down: usado para reverter as alterações feitas no método up.

      Além dos campos timestamps() e increments(), atualize o conteúdo do arquivo de esquema com os atributos de campo user_id, username e o body de uma citação que será criada. O user_id e username fazem referência aos detalhes do usuário que criam uma citação em particular. Isso define uma relação de um para vários, e significa que um usuário pode ter um número infinito de citações, ao mesmo tempo que uma única citação pode pertencer a somente um usuário.

      Salve e saia do arquivo.

      O AdonisJs vem instalado com um modelo de User e seu arquivo de migração por padrão, que exige apenas uma pequena modificação para estabelecer a relação entre o modelo de User e o Quote.

      Abra o modelo de User no app/Models/User.js:

      Adicione este método imediatamente após o método tokens():

      app/Models/User.js

      ...
      class User extends Model {
        ...
        tokens () {
          return this.hasMany('App/Models/Token')
        }
      
        quote () {
          return this.hasMany('App/Models/Quote')
        }
      }
      
      module.exports = User
      

      Isso estabelecerá um relacionamento de um para vários com a tabela Quote utilizando o user_id como a chave estrangeira.

      Salve e saia do arquivo.

      Para terminar essa seção, utilize o comando a seguir para executar as migrações, que executará o método up() de todos os arquivos de migração:

      Você verá um resultado similar ao seguinte:

      Output

      migrate: 1503248427885_user.js migrate: 1503248427886_token.js migrate: 1568209992854_quote_schema.js Database migrated successfully in 3.42 s

      Você configurou e protegeu uma conexão com seu banco de dados. Você também criou um modelo de Quote e seu arquivo de esquema correspondente e criou um relacionamento de one to many entre o User e o Quote. Em seguida, você gerará rotas e criará controladores para lidar com as solicitações HTTP e a lógica de negócios para criar, editar e excluir uma citação inspiradora.

      Passo 4 — Criando controladores e configurando rotas

      Nesta seção, você começará a criar controladores para lidar com toda a lógica para o aplicativo e, depois, anexará esses controladores a uma rota específica para que ele seja acessado pelos usuários através de uma URL.

      Para começar, utilize o Adonis CLI para criar um novo controlador de solicitação HTTP para lidar com todos os processos de autenticação para seu aplicativo, executando o seguinte comando:

      • adonis make:controller Auth --type http

      Este comando criará um arquivo AuthController.js e o salvará dentro da pasta app/Controllers/Http. Use o sinalizador --type para indicar que quer que este controlador seja um controlador HTTP.

      Você verá um resultado similar ao seguinte:

      Output

      ✔ create app/Controllers/Http/AuthController.js

      Em seguida, abra o arquivo controlador recém-criado:

      • nano app/Controllers/Http/AuthController.js

      Atualize-o com o seguinte conteúdo:

      app/Controllers/Http/AuthController.js

      'use strict'
      const User = use('App/Models/User')
      class AuthController {
      
          loginView({ view }) {
              return view.render('auth.login')
          }
          registrationView({ view }) {
              return view.render('auth.register')
          }
      
          async postLogin({ request, auth, response}) {
              await auth.attempt(request.input('email'), request.input('password'))
              return response.route('index')
          }
      
          async postRegister({ request, session, response }) {
              const user = await User.create({
                  username: request.input('name'),
                  email: request.input('email'),
                  password: request.input('password')
              })
              session.flash({ successmessage: 'User have been created successfully'})
              return response.route('login.create');
          }
      
          async logout ({ auth, response }) {
              await auth.logout()
              return response.route("https://www.digitalocean.com/")
          }
      }
      module.exports = AuthController
      

      Neste arquivo, importe o modelo User e, depois, crie dois métodos chamados loginView() e registerView() para renderizar as páginas de login e de registro, respectivamente. Por fim, crie os seguintes métodos assíncronos:

      • postLogin(): este método obterá o valor do email e password postados com a ajuda do método request integrado no AdonisJs e validará esse usuário com os detalhes no banco de dados. Caso tal usuário exista no banco de dados e tenha digitado as credenciais corretas, ele será redirecionado para a homepage e autenticado antes de criar uma nova citação. Caso contrário, será exibida uma mensagem indicando as credenciais erradas.
      • postRegister(): receberá o valor do nome do username, email e password para um usuário criar uma conta para ele no banco de dados. Uma mensagem indicando que esse usuário foi criado com sucesso será enviada para a sessão e o usuário será redirecionado para a página de login para ser autenticado e começar a criar uma citação.
      • logout(): este método lidará com a funcionalidade de logout e redirecionará o usuário para a página inicial.

      Salve e saia do arquivo.

      Agora que configurou o controlador para registrar e autenticar usuários, prossiga criando um controlador de pedido HTTP para gerenciar todas as operações a respeito das citações.

      De volta ao terminal, execute o comando a seguir para criar o QuoteController:

      • adonis make:controller Quote --type http --resource

      O uso do sinalizador --resource criará um controlador com métodos de recursos pré-definidos para fazer as operações CRUD (criação, consulta, atualização e destruição de dados).

      Você verá:

      Output

      ✔ create app/Controllers/Http/QuoteController.js

      Localize este arquivo dentro de app/Controllers/Http/QuoteController.js:

      • nano app/Controllers/Http/QuoteController.js

      Atualize-o com o seguinte conteúdo:

      app/Controllers/Http/QuoteController.js

      'use strict'
      const Quote = use('App/Models/Quote')
      
      class QuoteController {
      
        async index ({ view }) {
          const quote = await Quote.all()
          return view.render('index', {
            quotes: quote.toJSON()
          })
        }
      
        async create ({ view }) {
          return view.render('quotes.create-quote')
        }
      
        async store ({ request,auth,session, response }) {
          const quote = await Quote.create({
            user_id: auth.user.id,
            username: auth.user.username,
            body: request.input('body')
          })
          session.flash({ 'successmessage': 'Quote has been created'})
          return response.redirect("https://www.digitalocean.com/")
        }
      
        async show ({ params, view }) {
          const quote = await Quote.find(params.id)
          return view.render('quotes.view-quote', {
            quote: quote.toJSON()
          })
        }
      
        async edit ({ params, view }) {
          const quote = await Quote.find(params.id)
          return view.render('quotes.edit-quote', {
            quote: quote.toJSON()
          })
        }
      
        async update ({ params, request, response, session }) {
          const quote = await Quote.find(params.id)
          quote.body = request.input('body')
          await quote.save()
          session.flash({'successmessage': 'Quote has been updated'})
          return response.redirect("https://www.digitalocean.com/")
        }
      
        async destroy ({ params, response, session }) {
          const quote = await Quote.find(params.id)
          await quote.delete()
          session.flash({'successmessage': 'Quote has been deleted'})
          return response.redirect("https://www.digitalocean.com/")
        }
      }
      module.exports = QuoteController
      

      Neste controlador, você importou o modelo Quote e atualizou os métodos a seguir, criados automaticamente usando o AdonisJs CLI:

      • index(): busca todas as citações do banco de dados e as renderiza na página inicial do aplicativo.
      • create(): renderiza uma página para a criação de citações.
      • store(): persiste uma citação recém-criada no banco de dados e retorna uma resposta adequada.
      • show(): obtém a id de uma citação em particular, recupera-a do banco de dados e a renderiza na página de edição de citação.
      • edit(): obtém os detalhes de uma citação em particular do banco de dados e a renderiza para a edição.
      • update(): processa qualquer atualização para uma citação e redireciona o usuário para a página inicial.
      • destroy(): exclui uma citação em particular e remove-a por completo do banco de dados.

      Salve e saia do arquivo.

      Após criar todos os controladores necessários para este aplicativo, é possível configurar as rotas para que os usuários possam interagir com seu aplicativo com facilidade. Para começar, vá para o arquivo start/routes.js

      Substitua seu conteúdo com o seguinte:

      start/routes.js

      'use strict'
      const Route = use('Route')
      
      Route.get("https://www.digitalocean.com/",'QuoteController.index').as('index')
      Route.get('/register','AuthController.registrationView').as('register.create')
      Route.post('/register-store','AuthController.postRegister').as('register.store').validator('Register')
      Route.get('/login','AuthController.loginView').as('login.create')
      Route.post('/login-store','AuthController.postLogin').as('login.store')
      Route.get('/view-quote/:id','QuoteController.show').as('view.quote')
      
      Route.group(() => {
          Route.get('/create-quote','QuoteController.create').as('create.quote')
          Route.post('/store-quote','QuoteController.store').as('store.quote')
          Route.get('/edit-quote/:id','QuoteController.edit').as('edit.quote')
          Route.post('/update-quote/:id','QuoteController.update').as('update.quote')
          Route.get('/delete-quote/:id','QuoteController.destroy').as('delete.quote')
          Route.post('/logout','AuthController.logout').as('logout')
      }).middleware(['auth'])
      

      Aqui, você define o caminho para cada rota em seu aplicativo, especifica os verbos HTTP para cada ação e associa a rota a um método em particular em cada controlador. Você também nomeia cada uma destas rotas, já que elas foram referenciadas dentro dos controladores e das visualizações.

      Para garantir que apenas os usuários autenticados possam acessar todas as rotas das citações, atribui-se um middleware de grupo nomeado para ela. Por fim, você anexa um método validador para a rota register.store para validar as entradas do usuário.

      Salve e saia do arquivo.

      Você criou seus controladores e configurou as rotas para seu aplicativo. Em seguida, você criará o método validador definido neste passo.

      Passo 5 — Validando a entrada do usuário

      O AdonisJs não possui validadores integrados por padrão. Como resultado, você instalará e registrará o validador para seu aplicativo manualmente.

      Execute o comando a seguir para instalá-lo:

      Abra o arquivo a seguir para registrar o provedor validador:

      Então, registre o provedor validador adicionando ele à lista de provedores como mostrado a seguir:

      start/app.js

      ...
      const providers = [
         ...
         '@adonisjs/cors/providers/CorsProvider',
         '@adonisjs/shield/providers/ShieldProvider',
         '@adonisjs/session/providers/SessionProvider',
         '@adonisjs/auth/providers/AuthProvider',
         '@adonisjs/validator/providers/ValidatorProvider'
      ]
      

      Agora que você instalou e registrou o provedor validador dentro do seu aplicativo, crie um validador personalizado para validar as entradas do usuário durante o registro com o seguinte comando:

      • adonis make:validator Register

      Isso criará um arquivo de Register.js no diretório App/validators. Abra o arquivo com:

      • nano app/Validators/Register.js

      Adicione o código a seguir ao arquivo:

      app/Validators/Register.js

      'use strict'
      class Register {
        get rules () {
          return {
            name:'required',
            email:'required|email|unique:users',
            password:'required|min:8'
          }
        }
      
        get messages(){
          return{
            'name.required':'Full name is required',
            'email.required':'email is required',
            'email.unique':'email already exists',
            'password.required':'password is required',
            'password.min':'password should be at least 8 characters'
          }
        }
      }
      module.exports = Register
      

      Defina as regras para campos específicos em seu aplicativo. Caso as validações falhem em algum momento, o validador definirá automaticamente o erro como uma mensagem de erro e o usuário será redirecionado para o formulário.

      Salve e saia do arquivo assim que terminar de editar.

      Por fim, adicione estilos para o seu aplicativo. Abra o seguinte arquivo:

      Substitua o conteúdo dele com o seguinte:

      /public/style.css

      @import url('https://fonts.googleapis.com/css?family=Montserrat:300');
      
      html, body {
        height: 100%;
        width: 100%;
      }
      
      body {
        font-family: 'Montserrat', sans-serif;
        font-weight: 300;
        background-image: url("/splash.png");
        background-color: #220052;
      }
      
      * {
        margin: 0;
        padding: 0;
      }
      
      a {
        color: inherit;
        text-decoration: underline;
      }
      
      p {
        margin: 0.83rem 0;
      }
      
      .quote-wrapper {
        margin-top: 20px;
      }
      
      .quote-wrapper a {
        text-decoration: none;
      }
      
      .quote-wrapper a:hover {
        color: #ffffff;
      }
      
      .empty-quote {
        color: #ffffff;
      }
      
      form {
        padding: 20px;
      }
      

      Neste arquivo, você atualiza o estilo CSS do seu aplicativo no arquivo style.css.

      Você instalou e registrou um provedor validador com o propósito de verificar a entrada de usuários durante o processo de registro. Você também atualizou o conteúdo da sua folha de estilos para adicionar mais estilos ao aplicativo. No passo final, você testará seu aplicativo.

      Passo 6 — Exibindo o aplicativo

      Neste passo, você exibirá seu aplicativo e criará um usuário e senha para testar a autenticação. Você também adicionará uma citação para seu aplicativo e visualizará isso na página inicial.

      Para testar seu aplicativo, inicie o servidor de desenvolvimento com o comando a seguir a partir do diretório raiz do seu aplicativo:

      Isso inicializará o aplicativo na porta definida dentro do arquivo raiz .env, que é a 3333. Vá para http://localhost:3333 em seu navegador.

      Página inicial do aplicativo de citações

      A página inicial está vazia no momento, já que você não criou nenhuma citação. Clique no botão Register.

      Página de registro

      Digite seus detalhes e clique no botão Submit para completar o processo de registro. Você será redirecionado para a página de login. Digite seu endereço de e-mail e senha para a autenticação.

      Página de login

      Assim que estiver autenticado, clique no botão Create Quote.

      Página de criar citação

      Digite uma citação e vá para a página View all para ver sua citação.

      Página de visualização de todas citações

      Você testou seu aplicativo criando e autenticando um usuário e, em seguida, escreveu uma citação.

      Conclusão

      Neste tutorial você criou um aplicativo Web com o AdonisJs. Você configurou o aplicativo utilizando o AdonisJs CLI e usou o CLI para a criação de outros arquivos relevantes, como controladores, modelos e visualizações.

      Você pode desenvolver aplicativos Web com este framework independente do tamanho e complexidade deles. Fique à vontade para baixar o código-fonte para este projeto aqui no GitHub. Para explorar recursos adicionais, visite a documentação oficial.

      Caso queira explorar alguns de nossos outros tutoriais de framework do JavaScrip,confira o seguinte:



      Source link