[Implementa] conexión con la base de datos

This commit is contained in:
Ricardo García Jiménez 2021-09-26 17:34:26 -05:00
parent 039d5746cb
commit bd80c2f1d2
15 changed files with 291 additions and 13 deletions

2
NOTICE
View File

@ -1,4 +1,4 @@
Nabu - A content management system (CMS) for Markdown articles, written in HTML, CSS, Javascript and PHP.
Nabu - A content management system (CMS) for Markdown articles, written in HTML, CSS, JavaScript and PHP.
Copyright (C) 2021 Ricardo García Jiménez <ricardogj08@riseup.net>
Juan José Ramírez López <juan.ramirez.j99@gmail.com>

View File

@ -0,0 +1,44 @@
# Nabu
Un sistema gestor de contenido (CMS) para artículos en `Markdown`, escrito en `HTML`, `CSS`, `JavaScript` y `PHP`.
## Archivo de configuración de la base de datos
Por defecto, `Nabu` escanea el archivo `database-config.json` dentro de la carpeta raíz del proyecto.
Estructura del archivo de configuración:
```json
{
"dbms": "mysql",
"host": "localhost",
"database": "nabu",
"user": "root",
"password": "root",
"charset": "utf8mb4"
}
```
## Licencia
```text
Nabu - Un sistema gestor de contenido (CMS) para artículos en Markdown, escrito en HTML, CSS, JavaScript y PHP.
Copyright (C) 2021 Ricardo García Jiménez <ricardogj08@riseup.net>,
Juan José Ramírez López <juan.ramirez.j99@gmail.com>,
Francisco Solís Martínez <franciscosolism08@gmail.com>,
Fernando Andrés Chávez Gavaldón <fernandochg26@gmail.com>
Este programa 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.
Este programa 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/>.
```

View File

@ -14,7 +14,7 @@ class usersController {
}
// Renderiza la página de registro de usuarios
// y registra un usuario por el método POST.
// y registra un usuario con el método POST.
static public function signup() {
if (empty($_POST['signup-submit'])) {
$token = csrf::generate();

View File

@ -9,6 +9,7 @@ require_once 'libs/utils.php';
require_once 'libs/messages.php';
require_once 'libs/csrf.php';
require_once 'libs/validations.php';
require_once 'database/connection.php';
$components = require 'core/routes.php';

View File

@ -0,0 +1,69 @@
<?php
defined('NABU') || exit;
// Realiza la conexión con la base de datos.
class connection {
protected $pdo;
public function __construct() {
// Carga el archivo de configuración de la base de datos.
$config = file_get_contents(NABU_DIRECTORY['database']);
if ($config === false) {
exit('Create a database config file.');
}
$config = json_decode($config, true);
$keys = array('dbms', 'host', 'database', 'user', 'password', 'charset');
foreach ($keys as $key) {
if (empty($config[$key])) {
exit('Set "' . $key . '" in the database config file.');
}
}
// Parámetros de configuración de la conexión de la base de datos.
$options = array(
// Mantiene el nombre de las columnas como en la base de datos.
PDO::ATTR_CASE => PDO::CASE_NATURAL,
// Define el manejador de errores de 'PDO' por excepciones, utiliza el objeto 'PDOException'.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// Deshabilita las consultas preparadas de 'PDO' y utiliza el sistema nativo del SGBD.
PDO::ATTR_EMULATE_PREPARES => false,
// Define por defecto los resultados de las consultas como arrays asociativos.
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
// Origen de la base de datos.
$dsn = $config['dbms'] . ':host=' . $config['host'] . ';dbname=' . $config['database'];
try {
// Configuración y conexión de la base de datos.
$this -> pdo = new PDO($dsn, $config['user'], $config['password'], $options);
// Define la codificación de caracteres para el cliente del SGBD y los resultados de las consultas.
$this -> pdo -> exec('SET CHARSET ' . $config['charset']);
}
catch(PDOException $e) {
exit($e -> getMessage());
}
}
protected function errors(string $exception, string $error) {
// error_log($exception);
messages::errors('¡Lo sentimos mucho! &#x1F61E;, ' . $error . ', por favor inténtelo más tarde', 500);
}
// @return la fecha actual.
public function current_date() {
return date('Y-m-d H:i:s');
}
// Finaliza la conexión con la base de datos.
public function __destruct() {
$this -> pdo = null;
}
}

View File

@ -0,0 +1,111 @@
/*
DROP DATABASE IF EXISTS nabu;
*/
CREATE DATABASE IF NOT EXISTS nabu
CHARACTER SET = 'utf8mb4'
COLLATE = 'utf8mb4_general_ci';
USE nabu;
CREATE TABLE IF NOT EXISTS `roles` (
`id` TINYINT UNSIGNED NOT NULL,
`name` VARCHAR(20) NOT NULL,
CONSTRAINT roles_id_pk PRIMARY KEY(id),
CONSTRAINT roles_name_uk UNIQUE(name)
);
CREATE TABLE IF NOT EXISTS `users` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`role_id` TINYINT UNSIGNED NOT NULL DEFAULT 3,
`name` VARCHAR(255) NOT NULL,
`username` VARCHAR(255) NOT NULL,
`email` VARCHAR(255),
`password` VARCHAR(255) NOT NULL,
`activated` TINYINT(1) NOT NULL DEFAULT FALSE,
`creation_date` DATETIME(0) NOT NULL,
CONSTRAINT users_id_pk PRIMARY KEY(id),
CONSTRAINT users_username_uk UNIQUE(username),
CONSTRAINT users_email_uk UNIQUE(email),
CONSTRAINT users_role_id_fk FOREIGN KEY(role_id) REFERENCES roles(id) ON UPDATE RESTRICT ON DELETE RESTRICT
);
CREATE TABLE IF NOT EXISTS `verifications` (
`id` INT UNSIGNED NOT NULL,
`hash` VARCHAR(255), NOT NULL,
`expiration` INT UNSIGNED NOT NULL,
CONSTRAINT verifications_id_pk PRIMARY KEY(id),
CONSTRAINT verifications_id_fk FOREIGN KEY(id) REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS `profiles` (
`id` INT UNSIGNED NOT NULL,
`avatar` VARCHAR(255),
`background` VARCHAR(255),
`description` VARCHAR(255),
CONSTRAINT profiles_id_pk PRIMARY KEY(id),
CONSTRAINT profiles_id_fk FOREIGN KEY(id) REFERENCES users(id) ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT profiles_avatar_uk UNIQUE(avatar),
CONSTRAINT profiles_background_uk UNIQUE(background)
);
CREATE TABLE IF NOT EXISTS `articles` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT UNSIGNED NOT NULL,
`title` VARCHAR(246) NOT NULL,
`synopsis` VARCHAR(255) NOT NULL,
`content` MEDIUMTEXT NOT NULL,
`slug` VARCHAR(255) NOT NULL,
`cover` VARCHAR(255),
`authorized` TINYINT(1) NOT NULL DEFAULT FALSE,
`creation_date` DATETIME(0) NOT NULL,
`modification_date` DATETIME(0),
CONSTRAINT articles_id_pk PRIMARY KEY(id),
CONSTRAINT articles_user_id_fk FOREIGN KEY(user_id) REFERENCES users(id) ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT articles_slug_uk UNIQUE(slug),
CONSTRAINT articles_cover_uk UNIQUE(cover)
);
CREATE TABLE IF NOT EXISTS `categories` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
CONSTRAINT categories_id_pk PRIMARY KEY(id),
CONSTRAINT categories_name_uk UNIQUE(name)
);
CREATE TABLE IF NOT EXISTS `categories_article` (
`article_id` INT UNSIGNED NOT NULL,
`categorie_id` INT UNSIGNED NOT NULL,
CONSTRAINT categories_article_pk PRIMARY KEY(article_id, categorie_id),
CONSTRAINT categories_article_article_id_fk FOREIGN KEY(article_id) REFERENCES articles(id) ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT categories_categorie_id_fk FOREIGN KEY(categorie_id) REFERENCES categories(id) ON UPDATE RESTRICT ON DELETE RESTRICT
);
CREATE TABLE IF NOT EXISTS `authorizations` (
`article_id` INT UNSIGNED NOT NULL,
`user_id` INT UNSIGNED NOT NULL,
`authorization_date` DATETIME(0) NOT NULL,
CONSTRAINT authorizations_pk PRIMARY KEY(article_id, authorization_date),
CONSTRAINT authorizations_article_id_fk FOREIGN KEY(article_id) REFERENCES articles(id) ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT authorizations_user_id_fk FOREIGN KEY(user_id) REFERENCES users(id) ON UPDATE RESTRICT ON DELETE RESTRICT
);
CREATE TABLE IF NOT EXISTS `comments` (
`user_id` INT UNSIGNED NOT NULL,
`article_id` INT UNSIGNED NOT NULL,
`body` VARCHAR(255) NOT NULL,
`comment_date` DATETIME(0) NOT NULL,
CONSTRAINT comments_pk PRIMARY KEY(user_id, comment_date),
CONSTRAINT comments_user_id_fk FOREIGN KEY(user_id) REFERENCES users(id) ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT comments_article_id_fk FOREIGN KEY(article_id) REFERENCES articles(id) ON UPDATE RESTRICT ON DELETE RESTRICT
);
CREATE TABLE IF NOT EXISTS `favorites` (
`user_id` INT UNSIGNED NOT NULL,
`article_id` INT UNSIGNED NOT NULL,
CONSTRAINT favorites_pk PRIMARY KEY(user_id, article_id),
CONSTRAINT favorites_user_id_fk FOREIGN KEY(user_id) REFERENCES users(id) ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT favorites_article_id_fk FOREIGN KEY(article_id) REFERENCES articles(id) ON UPDATE RESTRICT ON DELETE RESTRICT
);
INSERT INTO roles(id, name) VALUES(1, 'ADMIN'), (2, 'MODERATOR'), (3, 'USER');

View File

@ -96,9 +96,6 @@ class validations {
$data = array();
foreach ($options as $option) {
if (!is_array($option))
$this -> errors('The validation options are not an array');
if (empty($option[0]) || !is_string($option[0]))
$this -> errors('Not found field name');

View File

@ -2,6 +2,13 @@
defined('NABU') || exit;
class adminModel {
class adminModel extends connection {
public function __construct() {
parent::__construct();
}
public function __destruct() {
parent::__destruct();
$this -> pdo = null;
}
}

View File

@ -2,6 +2,13 @@
defined('NABU') || exit;
class articlesModel {
class articlesModel extends connection {
public function __construct() {
parent::__construct();
}
public function __destruct() {
parent::__destruct();
$this -> pdo = null;
}
}

View File

@ -2,6 +2,13 @@
defined('NABU') || exit;
class blogModel {
class blogModel extends connection {
public function __construct() {
parent::__construct();
}
public function __destruct() {
parent::__destruct();
$this -> pdo = null;
}
}

View File

@ -2,6 +2,13 @@
defined('NABU') || exit;
class communityModel {
class communityModel extends connection {
public function __construct() {
parent::__construct();
}
public function __destruct() {
parent::__destruct();
$this -> pdo = null;
}
}

View File

@ -2,6 +2,13 @@
defined('NABU') || exit;
class profilesModel {
class profilesModel extends connection {
public function __construct() {
parent::__construct();
}
public function __destruct() {
parent::__destruct();
$this -> pdo = null;
}
}

View File

@ -2,6 +2,13 @@
defined('NABU') || exit;
class searchModel {
class searchModel extends connection {
public function __construct() {
parent::__construct();
}
public function __destruct() {
parent::__destruct();
$this -> pdo = null;
}
}

View File

@ -2,6 +2,13 @@
defined('NABU') || exit;
class usersModel {
class usersModel extends connection {
public function __construct() {
parent::__construct();
}
public function __destruct() {
parent::__destruct();
$this -> pdo = null;
}
}

View File

@ -2,6 +2,13 @@
defined('NABU') || exit;
class verificationsModel {
class verificationsModel extends connection {
public function __construct() {
parent::__construct();
}
public function __destruct() {
parent::__destruct();
$this -> pdo = null;
}
}