complete framework upload, make it to work with php5/php7/php8

* provide minimal instruction to start to work, adn minimal README also
* fix guachi libraries to work with php8 also
* fix the script to start a module, move or put missing files into docs as examples
* send real http code, specially on 404 response if controllers are not present or error
* fix index controller and not found logic model
* provide default index and default ini configuration files
main
mckaygerhard 2024-04-04 12:56:35 -04:00
parent 7ee4a28350
commit be6445a6ae
18 changed files with 193 additions and 278 deletions

1
.gitignore vendored
View File

@ -31,7 +31,6 @@ storage/
/*-shm
/*-wal
/guachi.ini
/modules.ini
/cache/*
/public/js/guachi.js
*.css

View File

@ -1,15 +1,18 @@
# Skindb-webdb
Huge Minetest/Multicraft skin database interface!
## Contenido
## Introduction
A huge Minetest/Multicraft skin database interface that makes it possible to search for the skin of your choice.
this repository handle the sourcecode of the skin database web interface at https://skindb.sourceforge.io/
## Introduccion
This is the web front of huge skin database files at https://codeberg.org/minetest-stuffs/minetest-skindb-skindata
or the prefered site of https://git.minetest.io/minetest-stuffs/minetest-skindb-skindata repository files!
## HOW TO
[docs/README.md](docs/README.md)**
This uses the GUACHI mini api framework, please refers to [docs/README.md](docs/README.md)
## LICENSE

18
controllers/index.php Normal file
View File

@ -0,0 +1,18 @@
<?php
/*
____ _ _
/ ___|_ _ __ _ ___| |__ (_)
| | _| | | |/ _` |/ __| '_ \| |
| |_| | |_| | (_| | (__| | | | |
\____|\__,_|\__,_|\___|_| |_|_|
Copyright (c) 2014 Díaz Víctor aka (Máster Vitronic)
Copyright (c) 2018 Díaz Víctor aka (Máster Vitronic)
<vitronic2@gmail.com> <mastervitronic@vitronic.com.ve>
*/
class index_controller extends controller {
public function execute() {
$this->model->show();
}
}

9
controllers/notFound.php Normal file
View File

@ -0,0 +1,9 @@
<?php
/*Controlador del modulo error 404*/
class notFound_controller extends controller {
public function execute() {
$this->model->show();
}
}

View File

@ -1,37 +1,50 @@
# skindb
# skindb-webdb
TODO
Huge Minetest/Multicraft skin database interface!
## Contenido
## Introduction
TODO
A huge Minetest/Multicraft skin database interface that makes it possible to search for the skin of your choice.
## Introduccion
TODO
This is the web front of huge skin database files at https://codeberg.org/minetest-stuffs/minetest-skindb-skindata
or the prefered site of https://git.minetest.io/minetest-stuffs/minetest-skindb-skindata repository files!
## How to use this repo
```
``` bash
rm -rf $HOME/Devel/minenux-skindb-webdb && mkdir $HOME/Devel
git clone --recursive https://codeberg.org/codeigniter/erp-recibosapi $HOME/Devel/minenux-skindb-webdb
git clone --recursive https://codeberg.org/minenux/minenux-skindb-webdb $HOME/Devel/minenux-skindb-webdb
cd $HOME/Devel && git submodule foreach git checkout develop && git submodule foreach git pull
cd $HOME/Devel/minenux-skindb-webdb && git submodule foreach git checkout develop && git submodule foreach git pull
./server-sample
```
## Deploy and develop
## How to start a module
TODO
``` bash
cd $HOME/Devel/minenux-skindb-webdb
./new_module public newlinktoshow
```
* `controllers/newlinktoshow.php`
* `models/newlinktoshow.php`
* http://localhost:<port>/newlinktoshow
## How to Deploy and develop
Start geany an browse the `Devel/minenux-skindb-webdb` directory for `skindb-webdb` proyect file!
#### Requisitos
* Linux:
* Debian 7+ o Alpine 3.12+ unicamente
* Debian 7+ Alpine 3.12+
* git 2.0+
* php 5+ 7+ o 8+
* database
* sqlite3 o perconadb 5.7+ (no se recomienda mariadb, pero sirve o tambien mysql 5.7) + myrocksdb
* sqlite3 / perconadb 5.7+
#### Despliegue

View File

@ -0,0 +1,16 @@
<?php
/*
____ _ _
/ ___|_ _ __ _ ___| |__ (_)
| | _| | | |/ _` |/ __| '_ \| |
| |_| | |_| | (_| | (__| | | | |
\____|\__,_|\__,_|\___|_| |_|_|
Copyright (c) 2014 Díaz Víctor aka (Máster Vitronic)
Copyright (c) 2018 Díaz Víctor aka (Máster Vitronic)
<vitronic2@gmail.com> <mastervitronic@vitronic.com.ve>
*/
class XXX_controller extends controller {
public function execute() {
$this->model->show();
}
}

25
docs/example_model.php Normal file
View File

@ -0,0 +1,25 @@
<?php
/*
____ _ _
/ ___|_ _ __ _ ___| |__ (_)
| | _| | | |/ _` |/ __| '_ \| |
| |_| | |_| | (_| | (__| | | | |
\____|\__,_|\__,_|\___|_| |_|_|
Copyright (c) 2014 Díaz Víctor aka (Máster Vitronic)
Copyright (c) 2018 Díaz Víctor aka (Máster Vitronic)
*/
class XXX_model extends model {
private $sql;
private $err;
public function notFound() {
$this->borrow('notFound')->show();
}
public function show() {
$this->save();
}
public function save() {
print 'Hola Mundo!';
}
private function save_ok() {
}
}

36
guachi.ini Normal file
View File

@ -0,0 +1,36 @@
[db]
use_db = Off
;sqlite , sqlite3 , pgsql , mysqli , mysql_pdo , pgsql_pdo
db_type = 'sqlite3'
db_database = '/home/general/Devel/minenux-skindb-webdb/skindb.sqlite'
db_hostname = ''
db_username = ''
db_password = ''
db_port = ''
[security]
session_timeout = '300'
allowed_uploads = 'jpg|jpeg|gif|png|pdf|doc|docx|xls|xlsx|txt|rtf'
enforce_https = Off
[theme]
start_module = 'index'
[site]
siteName = 'minenux-skindb'
site_url = ''
[locale]
default_date_timezone = 'America/Caracas'
locale = 'en_US.UTF-8'
locale_money = 'en_US'
months_of_year = 'enero|febrero|marzo|abril|mayo|junio|julio|augosto|septiembre|octubre|noviembre|diciembre'
days_of_week = 'lunes|martes|miercoles|jueves|viernes|sabado|domingo'
[datetime]
date_format = 'Ymd'
date_time_format = 'YmdHis'
time_format = 'His'
[production]
production = Off

View File

@ -10,6 +10,7 @@ Copyright (c) 2018 Díaz Víctor aka (Máster Vitronic)
<vitronic2@gmail.com> <mastervitronic@vitronic.com.ve>
*/
#[\AllowDynamicProperties]
class router {
/**

View File

@ -12,7 +12,7 @@
define("PASSWORD_MAX_LENGTH", 1000);
define("DIR_CONTROLLERS", ROOT . 'controllers' . DS );
define("DIR_MODELS", ROOT . 'models' . DS );
define("DIR_VIEWS", ROOT . 'views' . DS );
define("DIR_VIEWS", ROOT . 'public/views' . DS );
define("ERROR_MODULE",'notFound');
define("LOGIN_MODULE",'login');

View File

@ -1,253 +0,0 @@
<?php
/**!
* @package ReceiptAPI
* @filename upload.php
* @version 1.0
* @autor Díaz Urbaneja Víctor Eduardo Diex <diazvictor@tutamail.com>
* @date 22.11.2023 01:03:17 -04
*/
class api_v1_upload_model extends model {
private $sql;
private $err;
public function notFound() {
$this->borrow('notFound')->show();
}
/**
* Crea el directorio en el cloud
* @return string
*/
private function create_cloud_dir() {
$dir = sprintf('%scloud/%s/%s/%s/', ROOT, date('Y'),date('m'),date('d'));
mkdir($dir, 0777, true);
return $dir ;
}
/**
* Decodifica un base64 y lo guarda en el filesystem
*/
private function save_file($b64,$filepath) {
$ifp = fopen( $filepath, 'wb' );
$data = explode(',', $b64);
if (isset($data[1])){
fwrite( $ifp, base64_decode($data[1]));
} else {
fwrite( $ifp, base64_decode($data[0]));
}
fclose($ifp);
}
/**
* Crea el ID loco de PICCORO posta no es loco.. con esto identificas varias cosas, fecha, donde cuando
* ah y de paso se ordena solo ya que nunca dara unnumero menor a menos este el sistema trampeado
* @return string YYYYMMDDHHmmss
*/
private function mkid() {
return date('YmdHis');
}
private function save_ok($post) {
$result = true; /*esto es true a menos que algo salga mal*/
$validator = new validator(); /*inicializo la clase de validacion*/
/*los campos a validar en este arreglo, creo que se explica solos*/
$validations = [
'rif_agente' => [
'type' => 'string',
"required" => true
],
'fecha_recibo' => [
'type' => 'string',
"required" => true
],
'monto_recibo' => [
'type' => 'float',
"required" => true
],
'monto_excento' => [
'type' => 'float',
"required" => true
],
'monto_iva' => [
'type' => 'float',
"required" => true
],
'tasa_iva' => [
'type' => 'float',
"required" => true
],
'tipo_recibo' => [
'type' => 'enum',
'values' => ['factura', 'nota'],
"required" => true
],
'adjunto' => [
'type' => 'string',
"required" => true
]
];
if (!empty($post["rif_sujeto"])) {
$validations = $validations + [
'num_recibo' => [
'type' => 'string',
"required" => true
],
'num_control' => [
'type' => 'string',
"required" => true
],
];
}
$keys = [
"id_recibo",
"cod_recibo",
"num_recibo",
"num_control",
];
/*esto es una edicion por que id_recibo existe*/
if (isset($post["id_recibo"])) {
$validations = $validations + [
'id_recibo' => [
'type' => 'string',
"required" => true,
'maxlen' => 14,
'minlen' => 14,
]
];
$exist = $this->db->exist(
'apirec_recibo', $keys,
$post, 'id_recibo', $post["id_recibo"]
);
} else {
$exist = $this->db->exist(
'apirec_recibo', $keys, $post
);
}
if ($exist) {
$this->err = "El campo " . $exist . " ya existe.";
$result = false;
}
/*hago todas las validaciones*/
$check = $validator->execute($validations);
if ($check[0] === false ) {
$this->err = $check[1];
$result = false;
}
return $result;
}
public function save($post) {
$update = false;
$this->err = false;
$permission = $this->auth->getPermission('upload', $_SESSION['id_user']);
header('Content-Type: application/json; charset=utf-8');
if (isset($post['id_recibo']) and intval($post['id_recibo'])) {
$update = true;
if (is_false($permission['update'])){
$this->err = 'Sin permisos para actualizar';
}
} else {
if (is_false($permission['write'])) {
$this->err = 'Sin permisos de escritura';
}
}
if ($this->save_ok($post) === false || $this->err) {
print(json_encode([
'ok' => false,
'msg' => $this->err,
'id_recibo' => false
]));
return;
}
/*los campos a guardar*/
$keys = [
"id_recibo",
"rif_agente",
"rif_sujeto",
"cod_recibo",
"num_recibo",
"num_control",
"fecha_recibo",
"fecha_compra",
"monto_imponible",
"monto_excento",
"monto_iva",
"tasa_iva",
"tipo_recibo"
]; // @TODO: No se que son los *flags*
/*inicio la transaccion*/
if ($this->db->query("begin") == false) {
$this->notFound();
return false;
}
if ($update) {
$id_recibo = $post['id_recibo'];
/*hago el update*/
if ($this->db->update("apirec_recibo", $id_recibo, 'id_recibo', $post, $keys) === false) {
$this->db->query("rollback");
$this->notFound();
return false;
}
} else {
$post["id_recibo"] = $this->mkid();
/*hago el insert*/
if ($this->db->insert("apirec_recibo", $post, $keys) === false) {
$this->db->query("rollback");
$this->notFound();
return false;
}
$id_recibo = $post["id_recibo"];
}
if (!empty($post["adjunto"])) {
$this->db->delete('apirec_recibo_adjunto', 'id_recibo', $id_recibo);
$updir = $this->create_cloud_dir();
$filepath = $updir . $id_recibo;
$keys = ["id_recibo", "adjunto", "ruta"]; // @TODO: No se que son los *flags*
$values = [
"id_recibo" => $id_recibo,
"adjunto" => $post["adjunto"],
"ruta" => $filepath
];
if ($this->db->insert("apirec_recibo_adjunto", $values, $keys) === false) {
$this->db->query("rollback");
$this->notFound();
return false;
}
$this->save_file($post["adjunto"], $filepath);
}
/*finalmente hago el commit y retorno*/
if ($this->db->query("commit") != false) {
print(json_encode([
'ok' => true,
'msg' => 'Guardado con exito!',
'id_recibo' => $id_recibo
]));
return;
}
print(json_encode([
'ok' => false,
'msg' => 'Err: Will Robinson!',
'id_recibo' => false
]));
}
}

22
models/index.php Normal file
View File

@ -0,0 +1,22 @@
<?php
/*
____ _ _
/ ___|_ _ __ _ ___| |__ (_)
| | _| | | |/ _` |/ __| '_ \| |
| |_| | |_| | (_| | (__| | | | |
\____|\__,_|\__,_|\___|_| |_|_|
Copyright (c) 2014 Díaz Víctor aka (Máster Vitronic)
Copyright (c) 2018 Díaz Víctor aka (Máster Vitronic)
<vitronic2@gmail.com> <mastervitronic@vitronic.com.ve>
*/
class index_model extends model {
public function notFound() {
$this->borrow('notFound')->view();
}
public function show() {
include(DIR_VIEWS."index.php");
}
}

View File

@ -13,7 +13,9 @@ Copyright (c) 2018 Díaz Víctor aka (Máster Vitronic)
class notFound_model extends model {
public function show() {
header("Status: 404");
$protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
header($protocol . ' 404');
$GLOBALS['http_response_code'] = '404';
header('Content-Type: application/json; charset=utf-8');
print(json_encode([
'msg'=>'Not Found'

3
modules.ini Normal file
View File

@ -0,0 +1,3 @@
[public]
page[] = "index"

View File

@ -79,9 +79,9 @@
/* Copia de la plantillas*/
print "Creando el controlador, el modelo, la vista y los archivos asociados.\n";
safe_copy("extras/plantillas/controller.php", "controllers/$module.php");
safe_copy("docs/example_controller.php", "controllers/$module.php");
print "Creando controllers/$module.php.\n";
safe_copy("extras/plantillas/model.php", "models/$module.php");
safe_copy("docs/example_model.php", "models/$module.php");
/* Seteando el nombre del modulo*/

View File

@ -16,8 +16,7 @@ require_once realpath(dirname( __DIR__ ) ) . '/lib/security.php';
/*Iniciamos todas las instancias*/
$auth = auth::iniciar();
$router = router::iniciar();
//$view = view::iniciar();
$view = null;
$view = null;
/*Se incluye el modelo*/
if (file_exists($file = DIR_MODELS.$router->module.".php")) {
@ -38,3 +37,10 @@ if (file_exists($file = DIR_CONTROLLERS.$router->module.".php")) {
unset($_controller);
}
}
else
{
$protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
header($protocol . ' 412');
$GLOBALS['http_response_code'] = $code;
include(DIR_VIEWS."index.php");
}

1
public/views/index.html Normal file
View File

@ -0,0 +1 @@
<meta http-equiv="refresh" content="0; url=../" />

14
public/views/index.php Normal file
View File

@ -0,0 +1,14 @@
<?php
$htmlrender = '
<!DOCTYPE html>
<html>
<head>
<title>SkinsDB</title>
</head>
<body>
SkinDB API database!
</body>
</html>';
echo $htmlrender;