VENOM: Hardcode WIP (versustunez)

This commit is contained in:
engineerTrooper 2020-12-22 18:07:13 +01:00
parent 7b90160c48
commit 32a78ed1b9
21 changed files with 285 additions and 158 deletions

View file

@ -40,6 +40,8 @@ create table if not exists users
(
id int(255) auto_increment not null unique primary key,
username varchar(255) not null unique,
firstname varchar(255) not null,
lastname varchar(255) not null,
email varchar(255) not null,
password varchar(255) not null,
token varchar(255) not null,
@ -48,3 +50,11 @@ create table if not exists users
isActive tinyint(1) default 1 null
)
comment 'User File';
create table if not exists roles
(
id int(255) auto_increment not null unique primary key,
name varchar(255) not null unique,
content JSON not null,
isActive tinyint(1) default 1 null
)

View file

@ -1 +1 @@
main{display:flex;height:100vh;overflow:hidden}main h1{margin-top:30px;margin-bottom:20px}main h2{margin-top:35px;margin-bottom:25px}main h3{margin-top:20px;margin-bottom:15px}main h4{margin-top:15px;margin-bottom:10px}main.nav-open .menu{transform:translateX(0)}main.nav-open .app{transform:translateX(220px)}main.nav-open .app .nav-toggle span{transition:width .3s;width:0}main.nav-open .app .nav-toggle span:before{transform:translateY(8px) rotate(-135deg)}main.nav-open .app .nav-toggle span:after{transform:translateY(-8px) rotate(135deg)}.app{transform:translateX(0);transition:transform .4s;flex-grow:1;overflow-y:auto;margin:.6rem .8rem;width:100%;max-height:100%;background:rgba(27,27,27,.5);position:relative}.app .nav-toggle{position:absolute;top:1rem;left:1rem;margin-top:10px;height:25px}.app .nav-toggle span,.app .nav-toggle span:after,.app .nav-toggle span:before{cursor:pointer;border-radius:1px;height:2px;width:25px;background:#fff;position:absolute;content:'';transition:transform .5s,width .4s ease-in}.app .nav-toggle span:before{top:-8px}.app .nav-toggle span:after{bottom:-8px}.menu{width:220px;background-color:#1b1b1b;box-shadow:0 3px 6px rgba(0,0,0,.16),0 3px 6px rgba(0,0,0,.23);height:100%;position:fixed;z-index:1;top:0;left:0;overflow-x:hidden;transition:.4s;transform:translateX(-220px);display:flex;flex-direction:column}.menu .logo{text-align:center;font-family:monospace}.menu div[data-link]{padding:.75rem .5rem;position:relative}.menu div[data-link]:after{background-color:#3949ab;content:"";position:absolute;left:0;bottom:0;height:3px;width:100%;transform:scaleX(0);transition:transform .4s;transform-origin:left}.menu div[data-link]:hover:after{transform:scaleX(1)}.menu div[data-link]:last-child{margin-top:auto}.menu div[data-link].active{font-weight:700}.content-area{width:calc(100% - 20px);padding-top:30px;margin:0 auto;display:block}.content-area header{display:block;text-align:center}.content-area header h2{margin:25px 0}.content-area .back-arrow{width:36px;height:36px}.content-area textarea{background:rgba(27,27,27,.5);color:#fff;margin:15px 0 0 0;font-family:sans-serif;font-size:1.1rem;min-width:100%}.content-area .modules div{padding:6px 20px 6px 0}.content-area .add-new,.content-area .overview{width:100%}.content-area .overview div[data-link]{margin-right:10px;padding:10px;background-color:rgba(0,0,0,.3)}.content-area .overview div[data-link]:hover{background-color:rgba(0,0,0,.5)}.content-area .overview .icon{display:inline-block}.content-area .add-new{padding-top:25px}@media only screen and (min-width:768px){.content-area{width:calc(100% - 40px)}.content-area .flexbox{display:flex}.content-area .overview{flex-grow:1;width:60%}.content-area .add-new{padding-top:0;flex-grow:1;width:40%}}@media only screen and (min-width:1024px){.content-area{max-width:860px;padding-top:0;margin:0 0 0 20px}}@media only screen and (min-width:1024px){main,main.nav-open{display:flex}main .app,main.nav-open .app{transform:translateX(0)}main .menu,main.nav-open .menu{position:relative;transform:translateX(0)}main .nav-toggle,main.nav-open .nav-toggle{display:none}}.role-edit .privileges .name{font-size:1.15rem}
main{display:flex;height:100vh;overflow:hidden}main h1{margin-top:30px;margin-bottom:20px}main h2{margin-top:35px;margin-bottom:25px}main h3{margin-top:20px;margin-bottom:15px}main h4{margin-top:15px;margin-bottom:10px}main.nav-open .menu{transform:translateX(0)}main.nav-open .app{transform:translateX(220px)}main.nav-open .app .nav-toggle span{transition:width .3s;width:0}main.nav-open .app .nav-toggle span:before{transform:translateY(8px) rotate(-135deg)}main.nav-open .app .nav-toggle span:after{transform:translateY(-8px) rotate(135deg)}.app{transform:translateX(0);transition:transform .4s;flex-grow:1;overflow-y:auto;margin:.6rem .8rem;width:100%;max-height:100%;background:rgba(27,27,27,.5);position:relative}.app .nav-toggle{position:absolute;cursor:pointer;left:1rem;height:25px;width:25px}.app .nav-toggle span{transform:translateY(21px)}.app .nav-toggle span,.app .nav-toggle span:after,.app .nav-toggle span:before{border-radius:1px;height:2px;width:25px;background:#fff;position:absolute;content:'';transition:transform .5s,width .4s ease-in}.app .nav-toggle span:before{top:-8px}.app .nav-toggle span:after{bottom:-8px}.menu{width:220px;background-color:#1b1b1b;box-shadow:0 3px 6px rgba(0,0,0,.16),0 3px 6px rgba(0,0,0,.23);height:100%;position:fixed;z-index:1;top:0;left:0;overflow-x:hidden;transition:.4s;transform:translateX(-220px);display:flex;flex-direction:column}.menu .logo{text-align:center;font-family:monospace}.menu div[data-link]{padding:.75rem .5rem;position:relative}.menu div[data-link]:after{background-color:#3949ab;content:"";position:absolute;left:0;bottom:0;height:3px;width:100%;transform:scaleX(0);transition:transform .4s;transform-origin:left}.menu div[data-link]:hover:after{transform:scaleX(1)}.menu div[data-link]:last-child{margin-top:auto}.menu div[data-link].active{font-weight:700}.content-area{width:calc(100% - 20px);padding-top:30px;margin:0 auto;display:block}.content-area header{display:block;text-align:center}.content-area header h2{margin:25px 0}.content-area .back-arrow{width:36px;height:36px}.content-area textarea{background:rgba(27,27,27,.5);color:#fff;margin:15px 0 0 0;font-family:sans-serif;font-size:1.1rem;min-width:100%}.content-area .modules div{padding:6px 20px 6px 0}.content-area .add-new,.content-area .overview{width:100%}.content-area .overview div[data-link]{margin-right:10px;padding:10px;background-color:rgba(0,0,0,.3)}.content-area .overview div[data-link]:hover{background-color:rgba(0,0,0,.5)}.content-area .overview .icon{display:inline-block}.content-area .add-new{padding-top:25px}@media only screen and (min-width:768px){.content-area{width:calc(100% - 40px)}.content-area .flexbox{display:flex}.content-area .overview{flex-grow:1;width:60%}.content-area .add-new{padding-top:0;flex-grow:1;width:40%}}@media only screen and (min-width:1024px){.content-area{max-width:860px;padding-top:0;margin:0 0 0 20px}}@media only screen and (min-width:1024px){main,main.nav-open{display:flex}main .app,main.nav-open .app{transform:translateX(0)}main .menu,main.nav-open .menu{position:relative;transform:translateX(0)}main .nav-toggle,main.nav-open .nav-toggle{display:none}}.role-edit .privileges .name{font-size:1.15rem}

View file

@ -3,18 +3,24 @@
namespace Venom\Admin;
use Modules\Meta\MetaDataModule;
use Modules\PageModule;
use Modules\RoleModule;
use Modules\SeoUrlModule;
use Modules\User\UserModule;
use Modules\VenomStatusModule;
class AdminModulesLoader
{
public static function getModules(): array
{
return [
'metaData' => \Modules\MetaDataModule::class,
'overview' => \Modules\OverviewModule::class,
'pages' => \Modules\PageModule::class,
'role' => \Modules\RoleModule::class,
'seoUrl' => \Modules\SeoUrlModule::class,
'users' => \Modules\UserModule::class,
'venomStatus' => \Modules\VenomStatusModule::class,
'metaData' => MetaDataModule::class,
'pages' => PageModule::class,
'role' => RoleModule::class,
'seoUrl' => SeoUrlModule::class,
'users' => UserModule::class,
'venomStatus' => VenomStatusModule::class,
];
}
}

View file

@ -71,4 +71,22 @@ class DatabaseHandler
$stmt = $this->db->prepare($query);
return $stmt->execute($args);
}
// Returns a Select like this: SELECT id, name, ... FROM table || do what you want
public static function createEasySelect(array $fields, string $table): string
{
return "SELECT " . implode(",", $fields) . " FROM " . $table;
}
public static function getUpdateString(array $data, string $table, string $where): array
{
$string = [];
$save = [];
foreach ($data as $key => $value) {
$k = ":" . strtolower($key);
$string[] = $key . "= " . $k;
$save[$k] = $value;
}
return ["UPDATE " . $table . " SET " . implode(",", $string) . " " . $where, $save];
}
}

View file

@ -8,6 +8,12 @@ use Venom\Venom;
interface Module
{
const NAME = "name";
const AUTHOR = "author";
const SECURE = "secure";
const ROUTE = "routes";
const DESC = "description";
public function register(Venom $venom): bool;
public function init(): void;

View file

@ -22,4 +22,16 @@ class AdminHelper
echo json_encode($response);
die();
}
public static function sendStatus(bool $isSuccess, string $message = "")
{
if ($message == "") {
$message = $isSuccess ? "Operation Success" : "Operation failed";
}
echo json_encode([
"status" => $isSuccess ? 'success' : 'failed',
"message" => $message
]);
die();
}
}

View file

@ -4,6 +4,7 @@
namespace Venom\Helper;
use http\Exception\RuntimeException;
use Venom\Core\ArgumentHandler;
class ErrorHandler

View file

@ -9,23 +9,15 @@ class DataModel
public const TYPE_CONTENT = 'content';
public const TYPE_FORM = 'form';
public string $id;
public string $raw;
public string $generated;
public string $type;
public int $active = 1;
public function __construct(
string $id,
string $type = self::TYPE_CONTENT,
string $raw = '',
string $generated = ''
public string $id,
public string $type = self::TYPE_CONTENT,
public string $raw = '',
public string $generated = ''
)
{
$this->id = $id;
$this->type = $type;
$this->raw = $raw;
$this->generated = $generated;
}
public function getId(): string

View file

@ -4,12 +4,14 @@
namespace Venom\Models;
use JsonSerializable;
/**
* Database Object to use queries like this $obj->id, $obj->value
* also the option to print it in csv format ; as delimiter
* @package Venom\Database
*/
class DatabaseObject
class DatabaseObject implements JsonSerializable
{
private array $data = [];
@ -26,19 +28,29 @@ class DatabaseObject
$this->data[$name] = $value;
}
public function __isset($name)
public function __isset($name): bool
{
return isset($this->data[$name]);
}
public function toString()
public function toString(): string
{
return implode(';', $this->data);
}
public function getHead()
public function getHead(): string
{
$keys = array_keys($this->data);
return implode(';', $keys);
}
public function getData(): array
{
return $this->data;
}
public function jsonSerialize(): array
{
return $this->data;
}
}

View file

@ -12,9 +12,11 @@ class User
public const GUEST_ROLE = 'ROLE_GUEST';
private string $username = 'GUEST';
private string $email = 'GUEST';
private string $password = '---';
private string $salt = '---';
private string $token = '---';
private string $firstname = '';
private string $lastname = '';
private string $password = '';
private string $salt = '';
private string $token = '';
private string $id = '-1';
private array $roles = [];
private bool $isLoaded = false;

View file

@ -6,6 +6,7 @@ namespace Venom\Routing;
use Exception;
use Venom\Core\Config;
use Venom\Exceptions\ExceptionHandler;
use Venom\Models\User;
use Venom\Security\Security;
@ -122,6 +123,7 @@ class Router
$route->$fnc(...$params);
return true;
} catch (Exception $ex) {
ExceptionHandler::handleException($ex);
return false;
}
}

View file

@ -0,0 +1,36 @@
<?php
namespace Modules\Meta\Controller;
use Venom\Core\DatabaseHandler;
use Venom\Helper\AdminHelper;
class MetaAPIController
{
public function get()
{
AdminHelper::sendResponse([]);
}
public function getById($id)
{
AdminHelper::sendResponse(MetaController::getById($id));
}
public function update($id)
{
return true;
}
public function delete($id)
{
return true;
}
public function create($id)
{
return true;
}
}

View file

@ -0,0 +1,18 @@
<?php
namespace Modules\Meta\Controller;
class MetaController
{
public static function get(): array
{
return [];
}
public static function getById($id): array
{
return [];
}
}

View file

@ -1,9 +1,9 @@
<?php
namespace Modules;
namespace Modules\Meta;
use Modules\Meta\Controller\MetaAPIController;
use Venom\Core\Config;
use Venom\Core\Module;
use Venom\Helper\AdminHelper;
@ -30,7 +30,7 @@ class MetaDataModule implements Module, Route
{
$venom->getRouter(Router::ADMIN_ROUTER)->addRoutes([
'/metaData' => [
'cl' => MetaDataModule::class,
'cl' => MetaAPIController::class,
'roles' => ['ROLE_ADMIN'],
'routes' => [
'*' => [
@ -40,6 +40,7 @@ class MetaDataModule implements Module, Route
"GET" => 'getById',
"POST" => 'update',
"PUT" => 'insert',
"DELETE" => 'delete'
]
]
]

View file

@ -0,0 +1,22 @@
<?php
use Venom\Core\Module;
/*$module = [
Module::NAME => 'MetaModule',
Module::DESC => 'Meta Data Module for SEO',
Module::AUTHOR => 'VstZ dev',
Module::SECURE => true,
MODULE::ROUTE => [
'/'
],
MODULE::TEMPLATES => [
// Include Templates with shorter names! $render->include("meta_roles")
'meta_roles' => 'PATH_TO_TEMPLATE'
],
MODULE::ADMIN_TEMPLATES => [
//
]
];
$venom = $venom ?? die();
$venom->registerModule($module);*/

View file

@ -1,81 +0,0 @@
<?php
namespace Modules;
use Venom\Core\Config;
use Venom\Core\Module;
use Venom\Helper\AdminHelper;
use Venom\Routing\Route;
use Venom\Routing\Router;
use Venom\Venom;
class OverviewModule implements Module, Route
{
public function register(Venom $venom): bool
{
if (Config::getInstance()->isAdmin()) {
$this->registerAdminRoutes($venom);
}
return true;
}
public function init(): void
{
}
private function registerAdminRoutes(Venom $venom)
{
$venom->getRouter(Router::ADMIN_ROUTER)->addRoutes([
'/overview' => [
'cl' => OverviewModule::class,
'roles' => ['ROLE_ADMIN'],
'routes' => [
'*' => [
"GET" => 'get',
],
'1' => [
"GET" => 'getById',
"POST" => 'update',
"PUT" => 'insert',
]
]
]
]);
}
public function get()
{
AdminHelper::sendResponse([
'pages' => [
['id' => 1, 'name' => 'Flamingos going wild!', 'icon' => 'vt-edit'],
['id' => 2, 'name' => 'Turbinen sind geil.', 'icon' => 'vt-edit'],
['id' => 3, 'name' => 'Aufbau und Umbau des neuen VENOMs Plugins', 'icon' => 'vt-edit'],
['id' => 4, 'name' => 'Aber Mama hat gesagt!', 'icon' => 'vt-edit'],
['id' => 5, 'name' => 'Frische Fische nur heute!', 'icon' => 'vt-edit']
]
]);
}
public function update(): bool
{
return false;
}
public function insert(): bool
{
return false;
}
public function getById($id)
{
AdminHelper::sendResponse([
'caseName' => 'ROLE_ADMIN',
'id' => $id,
'name' => 'Admin',
'icon' => 'vt-visibility',
]);
}
}

View file

@ -0,0 +1,64 @@
<?php
namespace Modules\User\Controller;
use Venom\Core\ArgumentHandler;
use Venom\Core\DatabaseHandler;
use Venom\Helper\AdminHelper;
class UserAPIController
{
public function get()
{
//['id' => 1, 'name' => 'engineertrooper', 'icon' => 'vt-edit'],
$data = UserController::get(["id", "username", "firstname", "lastname", "email", "isActive"]);
AdminHelper::sendResponse(["users" => $data]);
}
public function getById($id)
{
$d = UserController::getById($id, ["id", "username", "firstname", "lastname", "email", "isActive"]);
AdminHelper::sendResponse($d);
}
public function update($id)
{
$original = UserController::getById($id);
if ($original == null) {
AdminHelper::sendStatus(false, "User not Found");
}
$args = ArgumentHandler::get();
$data = [];
$d = $original->getData();
foreach ($d as $key => $item) {
if ($args->hasPostItem($key)) {
$val = $args->getPostItem($key);
if ($val != $item) {
$data[$key] = $val;
}
}
}
parse_str(file_get_contents('php://input'), $_PUT);
var_dump(array_keys($_PUT));
//var_dump($data, $d, $_POST);
// $args->getPostItem("username")//UPDATE users SET lastname='Doe', firstname='' WHERE id=2
AdminHelper::sendStatus(UserController::update($id, $data));
}
public function delete($id)
{
AdminHelper::sendStatus(DatabaseHandler::get()->execute(
"DELETE FROM users WHERE id=:id",
[
':id' => $id
]
));
}
public function create($id)
{
// INSERT INTO
AdminHelper::sendStatus(true);
}
}

View file

@ -0,0 +1,36 @@
<?php
namespace Modules\User\Controller;
use Venom\Core\DatabaseHandler;
use Venom\Models\DatabaseObject;
class UserController
{
public static function getById($id, array $fields = ["*"]): ?DatabaseObject
{
if (empty($id)) {
return null;
}
$sel = DatabaseHandler::createEasySelect($fields, "users") . " WHERE id = :id";
return DatabaseHandler::get()->getOne($sel, [
':id' => $id
]);
}
public static function get(array $fields = ["*"]): array
{
return DatabaseHandler::get()->getAll(DatabaseHandler::createEasySelect($fields, "users"));
}
public static function update($id, array $values = []): bool
{
if (count($values) === 0) {
return false;
}
return DatabaseHandler::get()->execute(...DatabaseHandler::getUpdateString($values, "users", "WHERE id = :id"));
}
}

View file

@ -1,9 +1,10 @@
<?php
namespace Modules;
namespace Modules\User;
use Modules\User\Controller\UserAPIController;
use Venom\Core\Config;
use Venom\Core\Module;
use Venom\Helper\AdminHelper;
@ -30,7 +31,7 @@ class UserModule implements Module, Route
{
$venom->getRouter(Router::ADMIN_ROUTER)->addRoutes([
'/users' => [
'cl' => UserModule::class,
'cl' => UserAPIController::class,
'roles' => ['ROLE_ADMIN'],
'routes' => [
'*' => [
@ -38,41 +39,11 @@ class UserModule implements Module, Route
],
'1' => [
"GET" => 'getById',
"POST" => 'update',
"PUT" => 'insert',
"POST" => 'insert',
"PUT" => 'update',
]
]
]
]);
}
public function get()
{
AdminHelper::sendResponse([
'users' => [
['id' => 1, 'name' => 'engineertrooper', 'icon' => 'vt-edit'],
['id' => 2, 'name' => 'versustunez', 'icon' => 'vt-edit']
]
]);
}
public function update(): bool
{
return false;
}
public function insert(): bool
{
return false;
}
public function getById($id)
{
AdminHelper::sendResponse([
'caseName' => 'ROLE_ADMIN',
'id' => $id,
'name' => 'Admin',
'icon' => 'vt-visibility',
]);
}
}

View file

@ -2,7 +2,6 @@
<nav class="menu">
<h1 class="logo">Venom</h1>
<div data-link="/metaData">Meta Data</div>
<div data-link="/overview" class="active">Overview</div>
<div data-link="/pages">Pages</div>
<div data-link="/roles">Roles</div>
<div data-link="/seoUrl">SEO-URL</div>

View file

@ -7,12 +7,12 @@
<div class="flexbox">
<div class="overview">
<h3>Overview</h3>
{foreach(users as user,key)}
{foreach(users as user)}
<div data-link="/users" data-id="${user.id}">
<span class="icon-text">
{include(includes/svg;icon=$user.icon)}
{include(includes/svg;icon=vt-edit)}
</span>
<span>${user.name}</span>
<span>${user.username} (${user.firstname} ${user.lastname})</span>
</div>
{/for}
</div>