[Registra] emails para suscribirse al boletín de Nabu

This commit is contained in:
Ricardo García Jiménez 2022-03-11 17:28:07 -06:00
parent f60cb11043
commit a09962c290
6 changed files with 153 additions and 5 deletions

View File

@ -21,7 +21,7 @@ defined('NABU') || exit();
require_once 'models/communityModel.php';
class communityController {
// Elimina un comentario.
// Elimina un comentario con el método GET.
static public function delete_comment() {
$view = NABU_ROUTES['home'];
@ -50,7 +50,7 @@ class communityController {
utils::redirect(NABU_ROUTES['article'] . '&slug=' . $comment['slug']);
}
// Registra o elimina el like de un artículo.
// Registra o elimina el like de un artículo con el método GET.
static public function likes() {
utils::check_session(NABU_ROUTES['login']);
@ -85,6 +85,92 @@ class communityController {
utils::redirect(NABU_ROUTES['article'] . '&slug=' . $article['slug']);
}
// Cancela la suscripción de un correo con el método GET
// y registra un e-mail al boletín de los artículos más recientes con el método POST.
static public function suscription() {
$view = NABU_ROUTES['all-articles'];
$validations = new validations($view);
// Cancela la suscripción.
if (empty($_POST['suscription-form'])) {
// Valida los parámetros de la URL.
$data = $validations -> validate($_GET, array(
array('field' => 'email', 'trim' => true, 'min_length' => 5, 'max_length' => 255, 'not_spaces' => true),
array('field' => 'key', 'min_length' => 1, 'max_length' => 255)
));
$email = strtolower($data['email']);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
messages::add('Por favor ingresa una dirección de correo electrónico válido');
utils::redirect($view);
}
$communityModel = new communityModel();
// Obtiene los datos de suscripción.
$suscription = $communityModel -> get_suscription($email);
if (empty($suscription))
utils::redirect($view);
messages::add('Tu suscripción se ha cancelado correctamente');
utils::redirect($view);
}
csrf::validate($_POST['csrf']);
// Valida el email de la suscripción.
$data = $validations -> validate($_POST, array(
array('field' => 'email', 'trim' => true, 'min_length' => 5, 'max_length' => 255, 'not_spaces' => true),
));
$email = strtolower($data['email']);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
messages::add('Por favor ingresa una dirección de correo electrónico válido');
utils::redirect($view);
}
$communityModel = new communityModel();
// Obtiene los datos de suscripción.
$suscription = $communityModel -> get_suscription($email);
if (empty($suscription)) {
// Genera una llave aleatoria de cancelación de suscripción.
$key = bin2hex(random_bytes(32));
// Genera un hash de cancelación de suscripción.
$hash = hash_hmac('sha256', $email, $key);
require_once 'libs/emails.php';
$emails = new emails();
$emails -> prepare($email, $email);
// Genera una URL de cancelación de suscripción.
$url = NABU_ROUTES['suscription'] . '&email=' . urlencode($email) . '&key=' . $key;
$body = require_once 'views/emails/suscription.php';
// Envía primero un mensaje de suscripción antes de registrarlo.
if (!$emails -> send('¡Gracias por suscribirte!', $body))
messages::errors('¡Lo sentimos mucho! 😞, por el momento no podemos enviar tu mensaje de suscripción', 500);
// Registra la suscripción.
$communityModel -> save_suscription($email, $hash);
messages::add('Gracias por suscribirte al boletín de ' . NABU_DEFAULT['website-name']);
}
else
messages::add('Tu correo electrónico está suscripto al boletín de ' . NABU_DEFAULT['website-name']);
utils::redirect($view);
}
static public function favorites() {
//
}

View File

@ -41,4 +41,5 @@ return array(
'registered-users' => array('route' => 'registered-users', 'controller' => 'adminController', 'view' => 'registered_users'),
'review-article' => array('route' => 'review-article', 'controller' => 'adminController', 'view' => 'review_article'),
'signup' => array('route' => 'signup', 'controller' => 'usersController', 'view' => 'signup'),
'suscription' => array('route' => 'suscription', 'controller' => 'communityController', 'view' => 'suscription'),
);

View File

@ -97,6 +97,14 @@ CREATE TABLE IF NOT EXISTS `favorites` (
CONSTRAINT favorites_article_id_fk FOREIGN KEY(article_id) REFERENCES articles(id) ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS `suscriptions` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`email` VARCHAR(255) NOT NULL,
`hash` VARCHAR(255) NOT NULL,
CONSTRAINT suscriptions_pk PRIMARY KEY(id),
CONSTRAINT suscriptions_email_uk UNIQUE(email)
);
INSERT INTO roles(id, name) VALUES(1, 'ADMIN'), (2, 'MODERATOR'), (3, 'USER');
INSERT INTO users VALUES(1, 1, 'root', 'root', 'root@example.com', '$2y$12$.1ycdL5xs4nOpQ3GXga7m.IFNtfMgV5nKVe4R87B3CypgigBaJ55C', TRUE, NOW());
INSERT INTO profiles(id) VALUES(1);

View File

@ -109,6 +109,34 @@ class communityModel extends dbConnection {
}
}
// Obtiene los datos de suscripción de un e-mail.
public function get_suscription(string $email) {
$query = 'SELECT * FROM suscriptions WHERE email = ? LIMIT 1';
try {
$prepare = $this -> pdo -> prepare($query);
$prepare -> execute(array($email));
return $prepare -> fetch();
}
catch (PDOException $e) {
$this -> errors($e -> getMessage(), 'tuvimos un problema para obtener los datos de una suscripción');
}
}
// Registra una suscripción.
public function save_suscription(string $email, string $hash) {
$query = 'INSERT INTO suscriptions(email, hash) VALUES(?, ?)';
try {
$this -> pdo -> prepare($query) -> execute(array($email, $hash));
}
catch (PDOException $e) {
$this -> errors($e -> getMessage(), 'tuvimos un problema para registrar una suscripción');
}
}
public function __destruct() {
parent::__destruct();
$this -> pdo = null;

View File

@ -0,0 +1,24 @@
<?php
/*
* Este archivo es parte de Nabu.
*
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
* (a su elección) cualquier versión posterior.
*
* Nabu se distribuye con la esperanza de que sea de utilidad,
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
* Licencia Pública General de GNU Affero para obtener más detalles.
*
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
*/
defined('NABU') || exit();
return 'A partir de ahora recibirás correos de parte de nuestro equipo en los que compartiremos ' .
'contigo blogposts que te pudiesen interesar, así como tips para que tu escritura en medios ' .
'digitales sea una de tus más grandes cualidades.</p>' .
'<p><a href="' . $url . '">Cancelar suscripción.</a></p>';

View File

@ -79,9 +79,10 @@
<h2 class="CTA__title">Interesante, ¿No? &#x1F914;</h2>
<p class="CTA__description">Déjanos tu e-mail y te compartiremos los posts más recientes, además de recursos para mejorar tu escritura en medios digitales. &#x1F609;</p>
<div class="CTA__mail">
<form class="CTA__form" method="POST" action="">
<input class = "form__input-mail" type="text" minlength="1" placeholder="Tu e-mail" maxlength="246" required>
<input class = "form__join" type="submit" name="mail-submit" value="Unirme">
<form class="CTA__form" method="POST" action="<?= NABU_ROUTES['suscription'] ?>">
<input type="hidden" name="csrf" value="<?= $token ?>">
<input class = "form__input-mail" type="email" name="email" minlength="5" placeholder="Tu e-mail" maxlength="255" required>
<input class = "form__join" type="submit" name="suscription-form" value="Unirme">
</form>
</div>
</div>