[Implementa] conexión con la base de datos
This commit is contained in:
parent
039d5746cb
commit
bd80c2f1d2
2
NOTICE
2
NOTICE
|
@ -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>
|
||||
|
|
44
README.md
44
README.md
|
@ -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/>.
|
||||
```
|
|
@ -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();
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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! 😞, ' . $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;
|
||||
}
|
||||
}
|
111
database/db.sql
111
database/db.sql
|
@ -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');
|
|
@ -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');
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue