diff --git a/.gitignore b/.gitignore index e0e82dec..bbbe7ac9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,13 @@ +# Ignora directorios de compilación **/target + +# Archivos de log **/log/*.log* + +# Archivos de configuración locales **/local.*.toml **/local.toml +.env + +# Directorio de trabajo workdir diff --git a/README.md b/README.md index 771659a1..98711882 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ adaptarse a las necesidades de cada solución web implementando: las APIs de `PageTop` o de paquetes de terceros. -# ⚡️ Inicio rápido +# ⚡️ Guía rápida La aplicación más sencilla de `PageTop` se ve así: diff --git a/drust/README.md b/drust/README.md index bb5e0d5f..e1f5f066 100644 --- a/drust/README.md +++ b/drust/README.md @@ -10,8 +10,8 @@ -Modestamente inspirado en [Drupal](https://www.drupal.org), `Drust` exprime `PageTop` para -desarrollar un *Sistema de Gestión de Contenidos* (CMS) básico, que permita construir sitios web +`Drust` exprime `PageTop` para desarrollar un *Sistema de Gestión de Contenidos* (CMS) básico, +modestamente inspirado en [Drupal](https://www.drupal.org), que permita construir sitios web dinámicos, manejables y personalizables; y facilite a los usuarios la gestión de una variedad de contenidos de manera sencilla. @@ -23,6 +23,73 @@ clásica combinando SSR (*renderizado en el servidor*), HTML, CSS y JS, para cre modulares, extensibles y configurables. +# ⚡️ Guía rápida + +`Drust` requiere una base de datos para funcionar. La aplicación se encarga de ejecutar las +migraciones y cargar los datos mínimos necesarios, pero para crear o borrar la base de datos puedes +usar los scripts `db-create.sh` y `db-delete.sh` que se encuentran en el directorio `tools` del +*workspace*. + +## Configuración de `.env` + +Para simplificar la configuración, en el directorio `tools` puedes crear un archivo `.env` para +definir las variables de entorno que requieren los scripts para gestionar la base de datos, aunque +su presencia es **opcional**. Si no se encuentra `.env` o carece de ciertos valores, los scripts +solicitarán las variables necesarias para su ejecución. + +> **Nota**: Evita usar caracteres especiales como `@`, `#`, `?`, `:` en `DB_PASS` para prevenir +> posibles problemas de interpretación de `DATABASE_URL` en el código. + +### Ejemplo de `.env` + +```bash +# Sistema de base de datos +DB_SYSTEM="psql" + +# Nombre del host +DB_HOST="localhost" + +# Puerto de conexión +DB_PORT="5432" + +# Nombre de la base de datos +DB_NAME="drust" + +# Usuario de la base de datos +DB_USER="drust" + +# Contraseña para el usuario de la base de datos +# Evita usar caracteres especiales como '@', '#', '?', ':', ';' o espacios +DB_PASS="password" + +# Usuario administrador +DB_ADMIN="postgres" + +# Contraseña del usuario administrador +DB_ADMIN_PASS="adminpassword" +``` + +## Ejecución de los scripts + +Asegúrate de que los scripts tienen permisos de ejecución: + +```bash +chmod +x db-create.sh db-delete.sh +``` + +Y ejecuta el script deseado: + +```bash +./db-create.sh +``` + +o + +```bash +./db-delete.sh +``` + + # 🚧 Advertencia `PageTop` es un proyecto personal que hago por diversión para aprender cosas nuevas. Su API es diff --git a/tools/create-drust-db.sh b/tools/db-create.sh similarity index 56% rename from tools/create-drust-db.sh rename to tools/db-create.sh index 96c7d398..db539cc4 100755 --- a/tools/create-drust-db.sh +++ b/tools/db-create.sh @@ -78,93 +78,29 @@ create_sqlite_database() { fi } -setup_database() { - case "$DB_SYSTEM" in - mysql) create_mysql_database ;; - psql) create_psql_database ;; - sqlite) create_sqlite_database ;; - *) echo "Invalid system selected."; exit 1 ;; - esac -} +# Cambia al directorio donde se localiza el script +cd "$(dirname "$0")" || exit 1 -# Configuración inicial -read -p "Which database system are you using? (mysql/psql/sqlite): " DB_SYSTEM +# Captura de errores no esperados +trap 'echo "An unexpected error occurred. Exiting."; exit 1' ERR -# Verifica si el sistema de base de datos está instalado -ERROR_DB_NOT_INSTALLED="is not installed or not found in PATH. Please install it." -if [ "$DB_SYSTEM" == "mysql" ]; then - command -v mysql &>/dev/null || { echo "MySQL $ERROR_DB_NOT_INSTALLED"; exit 1; } -elif [ "$DB_SYSTEM" == "psql" ]; then - command -v psql &>/dev/null || { echo "PostgreSQL $ERROR_DB_NOT_INSTALLED"; exit 1; } -elif [ "$DB_SYSTEM" == "sqlite" ]; then - command -v sqlite3 &>/dev/null || { echo "SQLite $ERROR_DB_NOT_INSTALLED"; exit 1; } +# Carga el archivo `db-setup.sh` y ejecuta la configuración inicial +if [ -f ./db-setup.sh ]; then + source ./db-setup.sh + initial_setup else - echo "Invalid database system. Please choose either 'mysql', 'psql', or 'sqlite'." + echo "Error: Required file 'db-setup.sh' not found. Please make sure it exists in the same directory." exit 1 fi -# Parámetros básicos -DEFAULT_DB_NAME="drust" -DEFAULT_DB_USER="drust" -DEFAULT_DB_PASS="demo" -DEFAULT_DB_HOST="localhost" -DEFAULT_DB_PORT="" -DEFAULT_DB_ADMIN="root" - -echo -echo "You will be prompted to provide details for creating database." -echo "Press ENTER to accept the default values." -echo - -read -p "Enter database name [$DEFAULT_DB_NAME]: " DB_NAME -DB_NAME=${DB_NAME:-$DEFAULT_DB_NAME} - -if [[ -z "$DB_NAME" || ! "$DB_NAME" =~ ^[a-zA-Z0-9_\-]+$ ]]; then - echo "Invalid database name. Use only alphanumeric characters, dashes, or underscores." - exit 1 -fi - -if [ "$DB_SYSTEM" == "sqlite" ]; then - # Verifica si el archivo tiene una extensión válida para SQLite - [[ "$DB_NAME" != *".sqlite" && "$DB_NAME" != *".db" ]] && DB_NAME="$DB_NAME.sqlite" -else - read -p "Enter database user [$DEFAULT_DB_USER]: " DB_USER - DB_USER=${DB_USER:-$DEFAULT_DB_USER} - - read -p "Enter database password [$DEFAULT_DB_PASS]: " DB_PASS - DB_PASS=${DB_PASS:-$DEFAULT_DB_PASS} - - read -p "Enter database host [$DEFAULT_DB_HOST]: " DB_HOST - DB_HOST=${DB_HOST:-$DEFAULT_DB_HOST} - - # Puerto por defecto para MySQL - [ "$DB_SYSTEM" == "mysql" ] && DEFAULT_DB_PORT="3306" - # Puerto por defecto para PostgreSQL - [ "$DB_SYSTEM" == "psql" ] && DEFAULT_DB_PORT="5432" - read -p "Enter database port [$DEFAULT_DB_PORT]: " DB_PORT - DB_PORT=${DB_PORT:-$DEFAULT_DB_PORT} - - read -p "Enter $DB_SYSTEM admin user [$DEFAULT_DB_ADMIN]: " DB_ADMIN - DB_ADMIN=${DB_ADMIN:-$DEFAULT_DB_ADMIN} - read -sp "Enter $DB_SYSTEM admin password: " DB_ADMIN_PASS - echo -fi - -# Confirmar antes de proceder -echo -echo "You are about to create the database \"$DB_NAME\"." +# Confirma antes de proceder +echo "You are about to create the \"$DB_SYSTEM\" database \"$DB_NAME\" with access privileges to user \"$DB_USER\" on \"$DB_HOST\"." read -p "Are you sure you want to proceed? (y/N): " confirm if [[ ! "$confirm" =~ ^[Yy]$ ]]; then echo "Operation cancelled." exit 1 fi -setup_database +create_${DB_SYSTEM}_database || { echo "An error occurred during database setup."; exit 1; } -if [ $? -eq 0 ]; then - echo "Database setup completed successfully." - exit 0 -else - echo "An error occurred during database setup." - exit 1 -fi +echo "Database setup completed successfully." diff --git a/tools/db-delete.sh b/tools/db-delete.sh new file mode 100755 index 00000000..04a9c770 --- /dev/null +++ b/tools/db-delete.sh @@ -0,0 +1,77 @@ +#!/bin/bash + +delete_mysql_database() { + echo "Deleting MySQL database \"$DB_NAME\" and user \"$DB_USER\"..." + + # Elimina la base de datos si existe + MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" -P "$DB_PORT" -e \ + "DROP DATABASE IF EXISTS $DB_NAME;" + [ $? -ne 0 ] && { echo "Error deleting database \"$DB_NAME\"."; return 1; } + + # Elimina el usuario si existe + MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" -P "$DB_PORT" -e \ + "DROP USER IF EXISTS '$DB_USER'@'$DB_HOST'; FLUSH PRIVILEGES;" + [ $? -ne 0 ] && { echo "Error deleting user \"$DB_USER\"."; return 1; } + + return 0 +} + +delete_psql_database() { + echo "Deleting PostgreSQL database \"$DB_NAME\" and user \"$DB_USER\"..." + + # Elimina la base de datos si existe + PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" -p "$DB_PORT" -c \ + "DROP DATABASE IF EXISTS $DB_NAME;" + [ $? -ne 0 ] && { echo "Error deleting database \"$DB_NAME\"."; return 1; } + + # Elimina el usuario si existe + PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" -p "$DB_PORT" -c \ + "DROP ROLE IF EXISTS $DB_USER;" + [ $? -ne 0 ] && { echo "Error deleting user \"$DB_USER\"."; return 1; } + + return 0 +} + +delete_sqlite_database() { + echo "Deleting SQLite database \"$DB_NAME\"..." + + if [ -f "$DB_NAME" ]; then + rm "$DB_NAME" + if [ $? -ne 0 ]; then + echo "Error deleting SQLite database \"$DB_NAME\"." + return 1 + fi + else + echo "SQLite database \"$DB_NAME\" does not exist." + return 1 + fi + + return 0 +} + +# Cambia al directorio donde se localiza el script +cd "$(dirname "$0")" || exit 1 + +# Captura de errores no esperados +trap 'echo "An unexpected error occurred. Exiting."; exit 1' ERR + +# Carga el archivo `db-setup.sh` y ejecuta la configuración inicial +if [ -f ./db-setup.sh ]; then + source ./db-setup.sh + initial_setup +else + echo "Error: Required file 'db-setup.sh' not found. Please make sure it exists in the same directory." + exit 1 +fi + +# Confirma antes de proceder +echo "You are about to delete the \"$DB_SYSTEM\" database \"$DB_NAME\" and user \"$DB_USER\" on \"$DB_HOST\"." +read -p "Are you sure you want to proceed? (y/N): " confirm +if [[ ! "$confirm" =~ ^[Yy]$ ]]; then + echo "Operation cancelled." + exit 1 +fi + +delete_${DB_SYSTEM}_database || { echo "An error occurred during database deletion."; exit 1; } + +echo "Database and user deleted successfully." diff --git a/tools/db-setup.sh b/tools/db-setup.sh new file mode 100644 index 00000000..ab13fe32 --- /dev/null +++ b/tools/db-setup.sh @@ -0,0 +1,82 @@ +#!/bin/bash + +# Carga variables de entorno si existe el archivo .env +if [ -f ./.env ]; then + source ./.env +else + echo "Warning: .env file not found. Values will be prompted if not set." +fi + +# Función para solicitar una variable si no está definida, con un valor por defecto opcional +read_if_not_set() { + local var_name=$1 + local prompt_message=$2 + local default_value=$3 + + if [ -z "${!var_name}" ]; then + if [ -n "$default_value" ]; then + read -p "$prompt_message [default: $default_value]: " user_input + declare -g $var_name="${user_input:-$default_value}" + else + read -p "$prompt_message: " user_input + declare -g $var_name="$user_input" + fi + fi +} + +# Función para solicitar una contraseña si no está configurada +pass_if_not_set() { + local var_name=$1 + local prompt_message=$2 + + if [ -z "${!var_name}" ]; then + read -sp "$prompt_message: " user_input + echo + declare -g $var_name="$user_input" + fi +} + +# Función para solicitar las variables necesarias según el sistema de base de datos +initial_setup() { + read_if_not_set "DB_SYSTEM" "Enter database system (mysql/psql/sqlite)" "mysql" + + case "$DB_SYSTEM" in + mysql) + read_if_not_set "DB_HOST" "Enter MySQL host" "localhost" + read_if_not_set "DB_PORT" "Enter MySQL port" "3306" + read_if_not_set "DB_NAME" "Enter database name" "database" + read_if_not_set "DB_USER" "Enter database user" "username" + pass_if_not_set "DB_PASS" "Enter password for database user \"$DB_USER\"" + read_if_not_set "DB_ADMIN" "Enter MySQL admin user" "root" + pass_if_not_set "DB_ADMIN_PASS" "Enter MySQL admin password" + # Verifica la contraseña del administrador de MySQL + MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" -P "$DB_PORT" -e "SELECT 1;" >/dev/null 2>&1 + if [ $? -ne 0 ]; then + echo "Error: Invalid MySQL admin password. Please check and try again." + exit 1 + fi + ;; + psql) + read_if_not_set "DB_HOST" "Enter PostgreSQL host" "localhost" + read_if_not_set "DB_PORT" "Enter PostgreSQL port" "5432" + read_if_not_set "DB_NAME" "Enter database name" "database" + read_if_not_set "DB_USER" "Enter database user" "username" + pass_if_not_set "DB_PASS" "Enter password for database user \"$DB_USER\"" + read_if_not_set "DB_ADMIN" "Enter PostgreSQL admin user" "postgres" + pass_if_not_set "DB_ADMIN_PASS" "Enter PostgreSQL admin password" + # Verifica la contraseña del administrador + PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" -p "$DB_PORT" -c "\q" 2>/dev/null + if [ $? -ne 0 ]; then + echo "Error: Invalid PostgreSQL admin password. Please check and try again." + exit 1 + fi + ;; + sqlite) + read_if_not_set "DB_NAME" "Enter SQLite database name" "database.sqlite" + ;; + *) + echo "Error: Invalid database system. Please choose either 'mysql', 'psql', or 'sqlite'." + exit 1 + ;; + esac +} diff --git a/tools/delete-drust-db.sh b/tools/delete-drust-db.sh deleted file mode 100755 index 6123dda5..00000000 --- a/tools/delete-drust-db.sh +++ /dev/null @@ -1,137 +0,0 @@ -#!/bin/bash - -delete_mysql_database() { - echo "Deleting MySQL database \"$DB_NAME\" and user \"$DB_USER\"..." - - # Elimina la base de datos si existe - MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" -P "$DB_PORT" -e \ - "DROP DATABASE IF EXISTS $DB_NAME;" - [ $? -ne 0 ] && { echo "Error deleting database \"$DB_NAME\"."; return 1; } - - # Elimina el usuario si existe - MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" -P "$DB_PORT" -e \ - "DROP USER IF EXISTS '$DB_USER'@'$DB_HOST'; FLUSH PRIVILEGES;" - [ $? -ne 0 ] && { echo "Error deleting user \"$DB_USER\"."; return 1; } - - return 0 -} - -delete_psql_database() { - echo "Deleting PostgreSQL database \"$DB_NAME\" and user \"$DB_USER\"..." - - # Elimina la base de datos si existe - PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" -p "$DB_PORT" -c \ - "DROP DATABASE IF EXISTS $DB_NAME;" - [ $? -ne 0 ] && { echo "Error deleting database \"$DB_NAME\"."; return 1; } - - # Elimina el usuario si existe - PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" -p "$DB_PORT" -c \ - "DROP ROLE IF EXISTS $DB_USER;" - [ $? -ne 0 ] && { echo "Error deleting user \"$DB_USER\"."; return 1; } - - return 0 -} - -delete_sqlite_database() { - echo "Deleting SQLite database \"$DB_NAME\"..." - - if [ -f "$DB_NAME" ]; then - rm "$DB_NAME" - if [ $? -ne 0 ]; then - echo "Error deleting SQLite database \"$DB_NAME\"." - return 1 - fi - else - echo "SQLite database \"$DB_NAME\" does not exist." - return 1 - fi - - return 0 -} - -setup_database_deletion() { - case "$DB_SYSTEM" in - mysql) delete_mysql_database ;; - psql) delete_psql_database ;; - sqlite) delete_sqlite_database ;; - *) echo "Invalid system selected."; exit 1 ;; - esac -} - -# Configuración inicial -read -p "Which database system are you using? (mysql/psql/sqlite): " DB_SYSTEM - -# Verifica si el sistema de base de datos está instalado -ERROR_DB_NOT_INSTALLED="is not installed or not found in PATH. Please install it." -if [ "$DB_SYSTEM" == "mysql" ]; then - command -v mysql &>/dev/null || { echo "MySQL $ERROR_DB_NOT_INSTALLED"; exit 1; } -elif [ "$DB_SYSTEM" == "psql" ]; then - command -v psql &>/dev/null || { echo "PostgreSQL $ERROR_DB_NOT_INSTALLED"; exit 1; } -elif [ "$DB_SYSTEM" == "sqlite" ]; then - command -v sqlite3 &>/dev/null || { echo "SQLite $ERROR_DB_NOT_INSTALLED"; exit 1; } -else - echo "Invalid database system. Please choose either 'mysql', 'psql', or 'sqlite'." - exit 1 -fi - -# Parámetros básicos -DEFAULT_DB_NAME="drust" -DEFAULT_DB_USER="drust" -DEFAULT_DB_HOST="localhost" -DEFAULT_DB_PORT="" -DEFAULT_DB_ADMIN="root" - -echo -echo "You will be prompted to provide details for deleting database." -echo "Press ENTER to accept the default values." -echo - -read -p "Enter database name to delete [$DEFAULT_DB_NAME]: " DB_NAME -DB_NAME=${DB_NAME:-$DEFAULT_DB_NAME} - -if [[ -z "$DB_NAME" || ! "$DB_NAME" =~ ^[a-zA-Z0-9_\-]+$ ]]; then - echo "Invalid database name. Use only alphanumeric characters, dashes, or underscores." - exit 1 -fi - -if [ "$DB_SYSTEM" == "sqlite" ]; then - # Verifica si el archivo tiene una extensión válida para SQLite - [[ "$DB_NAME" != *".sqlite" && "$DB_NAME" != *".db" ]] && DB_NAME="$DB_NAME.sqlite" -else - read -p "Enter database user to delete [$DEFAULT_DB_USER]: " DB_USER - DB_USER=${DB_USER:-$DEFAULT_DB_USER} - - read -p "Enter database host [$DEFAULT_DB_HOST]: " DB_HOST - DB_HOST=${DB_HOST:-$DEFAULT_DB_HOST} - - # Puerto por defecto para MySQL - [ "$DB_SYSTEM" == "mysql" ] && DEFAULT_DB_PORT="3306" - # Puerto por defecto para PostgreSQL - [ "$DB_SYSTEM" == "psql" ] && DEFAULT_DB_PORT="5432" - read -p "Enter database port [$DEFAULT_DB_PORT]: " DB_PORT - DB_PORT=${DB_PORT:-$DEFAULT_DB_PORT} - - read -p "Enter $DB_SYSTEM admin user [$DEFAULT_DB_ADMIN]: " DB_ADMIN - DB_ADMIN=${DB_ADMIN:-$DEFAULT_DB_ADMIN} - read -sp "Enter $DB_SYSTEM admin password: " DB_ADMIN_PASS - echo -fi - -# Confirmar antes de proceder -echo -echo "You are about to delete the database \"$DB_NAME\" and user \"$DB_USER\"." -read -p "Are you sure you want to proceed? (y/N): " confirm -if [[ ! "$confirm" =~ ^[Yy]$ ]]; then - echo "Operation cancelled." - exit 1 -fi - -setup_database_deletion - -if [ $? -eq 0 ]; then - echo "Database and user deleted successfully." - exit 0 -else - echo "An error occurred during database deletion." - exit 1 -fi diff --git a/tools/publish.sh b/tools/publish.sh index 05736d43..f0d265e6 100755 --- a/tools/publish.sh +++ b/tools/publish.sh @@ -10,7 +10,7 @@ command -v git > /dev/null || { echo "Error: Git is not installed"; exit 1; } command -v cargo > /dev/null || { echo "Error: Cargo is not installed"; exit 1; } # Cambia al directorio raíz del espacio de trabajo -cd "$(dirname "$0")" +cd "$(dirname "$0")" || exit 1 cd .. # Verifica si el repositorio del proyecto tiene cambios locales sin preparar @@ -32,7 +32,7 @@ if [[ $REPLY =~ ^[Yy]$ ]]; then else read -p "Are you sure you don't want to update the 'latest' branch? (y/n) " -n 1 -r echo - if [[ $REPLY =~ ^[Nn]$ ]]; then + if [[ ! $REPLY =~ ^[Yy]$ ]]; then echo "Exiting without completing the process" exit 1 fi