From 9c73526cb43b1b7be4567c79575a4d02c9eda0b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Garc=C3=ADa=20Jim=C3=A9nez?= Date: Thu, 20 Jan 2022 05:01:25 -0600 Subject: [PATCH] =?UTF-8?q?[Registra]=20la=20publicaci=C3=B3n=20de=20un=20?= =?UTF-8?q?art=C3=ADculo=20en=20espera=20de=20aprobaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/articlesController.php | 30 ++++++++++++++- controllers/profilesController.php | 4 +- core/utils.php | 7 +++- models/articlesModel.php | 61 ++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 3 deletions(-) diff --git a/controllers/articlesController.php b/controllers/articlesController.php index bf05544..73e9dc7 100644 --- a/controllers/articlesController.php +++ b/controllers/articlesController.php @@ -18,11 +18,13 @@ defined('NABU') || exit(); +require_once 'models/articlesModel.php'; + class articlesController { // Renderiza la página para publicar artículos // y envía un artículo para su aprobación con el método POST. static public function post_article() { - utils::session_check(NABU_ROUTES['home']); + utils::check_session(NABU_ROUTES['home']); if (empty($_POST['post-article-form'])) { $token = csrf::generate(); @@ -43,6 +45,32 @@ class articlesController { array('field' => 'synopsis', 'trim_all' => true, 'min_length' => 1, 'max_length' => 255), array('field' => 'content', 'trim' => true, 'min_length' => 1, 'max_length' => NABU_DEFAULT['article-size']), )); + + $data['slug'] = utils::url_slug($data['title']); + + // Valida la longitud de la URL. + $validations -> validate($data, array( + array('field' => 'slug', 'min_length' => 1, 'max_length' => 255) + )); + + $articlesModel = new articlesModel(); + + $article = $articlesModel -> find($data['slug']); + + // Valida si el título del artículo es único en el día. + if (!empty($article)) { + messages::add('Por favor define un título diferente o espera máximo un día para enviar tu publicación'); + utils::redirect(NABU_ROUTES['post-article']); + } + + $data['user_id'] = $_SESSION['user']['id']; + $data['creation_date'] = utils::current_date(); + + // Registra un artículo para su aprobación. + $articlesModel -> save($data); + + messages::add('Tu publicación se ha enviado correctamente, en breve autorizaremos tu publicación'); + utils::redirect(NABU_ROUTES['sent-articles']); } static public function all_articles() { diff --git a/controllers/profilesController.php b/controllers/profilesController.php index f238395..cd11d61 100644 --- a/controllers/profilesController.php +++ b/controllers/profilesController.php @@ -19,5 +19,7 @@ defined('NABU') || exit(); class profilesController { - + static public function sent_articles() { + // + } } diff --git a/core/utils.php b/core/utils.php index a80c16f..b35afe1 100644 --- a/core/utils.php +++ b/core/utils.php @@ -43,8 +43,13 @@ class utils { } // Redirecciona a una ruta si no existe una sesión de usuario. - static public function session_check(string $route) { + static public function check_session(string $route) { if (empty($_SESSION['user'])) self::redirect($route); } + + // Genera la URL de un artículo. + public static function url_slug(string $title) { + return date('Ymd') . '-' . preg_replace('/[^A-Za-z0-9-]+/', '-', strtolower($title)); + } } diff --git a/models/articlesModel.php b/models/articlesModel.php index e69de29..e8ed83d 100644 --- a/models/articlesModel.php +++ b/models/articlesModel.php @@ -0,0 +1,61 @@ +. +*/ + +defined('NABU') || exit(); + +class articlesModel extends dbConnection { + public function __construct() { + parent::__construct(); + } + + // @return un array asociativo con los datos de un artículo. + public function find(string $slug) { + $query = 'SELECT id FROM articles WHERE slug = ? LIMIT 1'; + + try { + $prepare = $this -> pdo -> prepare($query); + + $prepare -> execute(array($slug)); + + $article = $prepare -> fetch(); + + return $article; + } + catch (PDOException $e) { + $this -> errors($e -> getMessage(), 'tuvimos un problema para validar si tu publicación es única'); + } + } + + // Registra un artículo en espera de aprobación. + public function save(array $data) { + $query = 'INSERT INTO articles(user_id, title, synopsis, content, slug, creation_date) ' . + 'VALUES(:user_id, :title, :synopsis, :content, :slug, :creation_date)'; + + try { + $this -> pdo -> prepare($query) -> execute($data); + } + catch (PDOException $e) { + $this -> errors($e -> getMessage(), 'tuvimos un problema para registrar tu publicación'); + } + } + + public function __destruct() { + parent::__destruct(); + $this -> pdo = null; + } +}