diff --git a/Engine/Auth/.meta/.phpstorm.meta.php b/Engine/Auth/.meta/.phpstorm.meta.php index 69d4186..acdc239 100644 --- a/Engine/Auth/.meta/.phpstorm.meta.php +++ b/Engine/Auth/.meta/.phpstorm.meta.php @@ -3,7 +3,7 @@ namespace PHPSTORM_META { if (function_exists('override')) { - override(\Oforge\Engine\Core\Manager\Services\ServiceManager::get(0), map([ + override(\Oforge\Engine\Core\Managers\Services\ServiceManager::get(0), map([ 'auth' => \Oforge\Engine\Auth\Services\AuthService::class, 'backend.login' => \Oforge\Engine\Auth\Services\BackendLoginService::class, 'password' => \Oforge\Engine\Auth\Services\PasswordService::class, diff --git a/Engine/Auth/Controller/SecureController.php b/Engine/Auth/Controllers/SecureController.php similarity index 93% rename from Engine/Auth/Controller/SecureController.php rename to Engine/Auth/Controllers/SecureController.php index 9f0f48d..6132fee 100644 --- a/Engine/Auth/Controller/SecureController.php +++ b/Engine/Auth/Controllers/SecureController.php @@ -1,6 +1,6 @@ 'Engine', + 'name' => 'Cache', + 'version' => '20201009', + 'updateUrl' => '', +]; diff --git a/Engine/Cache/Helper/Cache.php b/Engine/Cache/Managers/CacheManager.php similarity index 77% rename from Engine/Cache/Helper/Cache.php rename to Engine/Cache/Managers/CacheManager.php index af7e170..c22339d 100644 --- a/Engine/Cache/Helper/Cache.php +++ b/Engine/Cache/Managers/CacheManager.php @@ -1,11 +1,16 @@ \Oforge\Engine\Console\Services\ConsoleService::class, ])); } diff --git a/Engine/Core/.meta/.phpstorm.meta.php b/Engine/Core/.meta/.phpstorm.meta.php index 3946af5..dddd5d8 100644 --- a/Engine/Core/.meta/.phpstorm.meta.php +++ b/Engine/Core/.meta/.phpstorm.meta.php @@ -3,18 +3,18 @@ namespace PHPSTORM_META { if (function_exists('override')) { - override(\Oforge\Engine\Core\Manager\Services\ServiceManager::get(0), map([ - 'config' => \Oforge\Engine\Core\Services\ConfigService::class, - 'encryption' => \Oforge\Engine\Core\Services\EncryptionService::class, - 'endpoint' => \Oforge\Engine\Core\Services\EndpointService::class, - 'middleware' => \Oforge\Engine\Core\Services\MiddlewareService::class, - 'ping' => \Oforge\Engine\Core\Services\PingService::class, - 'plugin.access' => \Oforge\Engine\Core\Services\PluginAccessService::class, - 'plugin.state' => \Oforge\Engine\Core\Services\PluginStateService::class, - 'redirect' => \Oforge\Engine\Core\Services\RedirectService::class, - 'session.management' => \Oforge\Engine\Core\Services\Session\SessionManagementService::class, - 'store.keyvalue' => \Oforge\Engine\Core\Services\KeyValueStoreService::class, - 'token' => \Oforge\Engine\Core\Services\TokenService::class, + override(\Oforge\Engine\Core\Managers\Services\ServiceManager::get(0), map([ + 'config' => \Oforge\Engine\Core\Services\ConfigService::class, + 'encryption' => \Oforge\Engine\Core\Services\EncryptionService::class, + 'endpoint' => \Oforge\Engine\Core\Services\EndpointService::class, + 'middleware' => \Oforge\Engine\Core\Services\MiddlewareService::class, + 'ping' => \Oforge\Engine\Core\Services\PingService::class, + 'plugin.access' => \Oforge\Engine\Core\Services\PluginAccessService::class, + 'plugin.state' => \Oforge\Engine\Core\Services\PluginStateService::class, + 'redirect' => \Oforge\Engine\Core\Services\RedirectService::class, + 'session' => \Oforge\Engine\Core\Services\Session\SessionService::class, + 'store.keyvalue' => \Oforge\Engine\Core\Services\KeyValueStoreService::class, + 'token' => \Oforge\Engine\Core\Services\TokenService::class, ])); registerArgumentsSet('oforge_flash_message_types', 'success', 'error', 'warning', 'info'); diff --git a/Engine/Core/Annotation/Cache/Cache.php b/Engine/Core/Annotations/Cache/Cache.php similarity index 76% rename from Engine/Core/Annotation/Cache/Cache.php rename to Engine/Core/Annotations/Cache/Cache.php index aee9664..3561960 100644 --- a/Engine/Core/Annotation/Cache/Cache.php +++ b/Engine/Core/Annotations/Cache/Cache.php @@ -1,29 +1,20 @@ slot = $config['slot'] ?? 'default'; + $this->slot = $config['slot'] ?? 'default'; } /** diff --git a/Engine/Core/Annotation/Endpoint/AssetBundlesMode.php b/Engine/Core/Annotations/Endpoint/AssetBundleMode.php similarity index 54% rename from Engine/Core/Annotation/Endpoint/AssetBundlesMode.php rename to Engine/Core/Annotations/Endpoint/AssetBundleMode.php index 3fcd45b..eabf1bd 100644 --- a/Engine/Core/Annotation/Endpoint/AssetBundlesMode.php +++ b/Engine/Core/Annotations/Endpoint/AssetBundleMode.php @@ -1,13 +1,13 @@ assetBundles = $config['assetBundles'] ?? null; - $this->assetBundlesMode = $config['assetBundlesMode'] ?? null; + $this->assetBundles = $config['assetBundles'] ?? null; + $this->assetBundleMode = $config['AssetBundleMode'] ?? null; $this->method = $config['method'] ?? EndpointMethod::ANY; $this->name = $config['name'] ?? ''; @@ -100,8 +100,8 @@ public function getAssetBundles() { /** * @return string|null */ - public function getAssetBundlesMode() : ?string { - return $this->assetBundlesMode; + public function getAssetBundleMode() : ?string { + return $this->assetBundleMode; } /** diff --git a/Engine/Core/Annotation/Endpoint/EndpointClass.php b/Engine/Core/Annotations/Endpoint/EndpointClass.php similarity index 83% rename from Engine/Core/Annotation/Endpoint/EndpointClass.php rename to Engine/Core/Annotations/Endpoint/EndpointClass.php index f20af37..80f7090 100644 --- a/Engine/Core/Annotation/Endpoint/EndpointClass.php +++ b/Engine/Core/Annotations/Endpoint/EndpointClass.php @@ -1,6 +1,6 @@ assetBundles = $config['assetBundles'] ?? null; - $this->assetBundlesMode = $config['assetBundlesMode'] ?? null; + $this->assetBundles = $config['assetBundles'] ?? null; + $this->assetBundleMode = $config['AssetBundleMode'] ?? null; $this->name = $config['name'] ?? ''; $this->order = $config['order'] ?? null; @@ -95,8 +95,8 @@ public function getAssetBundles() { /** * @return string|null */ - public function getAssetBundlesMode() : ?string { - return $this->assetBundlesMode; + public function getAssetBundleMode() : ?string { + return $this->assetBundleMode; } /** diff --git a/Engine/Core/BlackSmith.php b/Engine/Core/BlackSmith.php index 43db959..956ad1d 100644 --- a/Engine/Core/BlackSmith.php +++ b/Engine/Core/BlackSmith.php @@ -7,14 +7,15 @@ use Oforge\Engine\Core\Forge\ForgeDatabase; use Oforge\Engine\Core\Forge\ForgeSettings; use Oforge\Engine\Core\Forge\ForgeSlimApp; -use Oforge\Engine\Core\Manager\Bootstrap\BootstrapManager; -use Oforge\Engine\Core\Manager\Cache\CacheManager; -use Oforge\Engine\Core\Manager\Events\EventManager; -use Oforge\Engine\Core\Manager\Logger\LoggerManager; -use Oforge\Engine\Core\Manager\Modules\ModuleManager; -use Oforge\Engine\Core\Manager\Plugins\PluginManager; -use Oforge\Engine\Core\Manager\Services\ServiceManager; -use Oforge\Engine\Core\Manager\Slim\SlimRouteManager; +use Oforge\Engine\Core\Managers\Bootstrap\BootstrapManager; +use Oforge\Engine\Core\Managers\Cache\CacheManager; +use Oforge\Engine\Core\Managers\Events\EventManager; +use Oforge\Engine\Core\Managers\Logger\LoggerManager; +use Oforge\Engine\Core\Managers\Modules\ModuleManager; +use Oforge\Engine\Core\Managers\Plugins\PluginManager; +use Oforge\Engine\Core\Managers\Services\ServiceManager; +use Oforge\Engine\Core\Managers\Slim\SlimRouteManager; +use Oforge\Engine\Core\Services\Session\SessionService; use Slim\Container; use Slim\Exception\MethodNotAllowedException; use Slim\Exception\NotFoundException; @@ -32,23 +33,11 @@ class BlackSmith { * @var BlackSmith */ protected static $instance = null; - /** - * BootstrapManager - * - * @var BootstrapManager $bootstrapManager - */ + /** @var BootstrapManager $bootstrapManager */ private $bootstrapManager = null; - /** - * Container - * - * @var Container $container - */ + /** @var Container $container Container */ private $container = null; - /** - * DataBase - * - * @var ForgeDatabase $db - */ + /** @var ForgeDatabase $db DataBase */ private $db = null; /** @var EventManager $eventManager */ private $eventManager = null; @@ -119,7 +108,7 @@ class BlackSmith { */ protected function __construct() { Oforge($this); - $this->viewManager = \Oforge\Engine\Core\Manager\View\DefaultViewManager::getInstance(); + $this->viewManager = \Oforge\Engine\Core\Managers\View\DefaultViewManager::getInstance(); } /** @@ -297,10 +286,6 @@ public function forge($start = true, $test = false) { $this->forgeSlimApp = ForgeSlimApp::getInstance(); $this->container = $this->App()->getContainer(); - if ($start) { - $this->forgeSlimApp->sessionStart(); - } - // Init modules and plugins $this->bootstrapManager = BootstrapManager::getInstance(); $this->bootstrapManager->init(); @@ -309,6 +294,12 @@ public function forge($start = true, $test = false) { $this->moduleManager = ModuleManager::getInstance(); $this->moduleManager->init(); + if ($start) { + /** @var SessionService $sessionService */ + $sessionService = Oforge()->Services()->get('session'); + $sessionService->start(); + } + // Init and load plugins $this->pluginManager = PluginManager::getInstance(); $this->pluginManager->init(); diff --git a/Engine/Core/Bootstrap.php b/Engine/Core/Bootstrap.php index fc27649..97d20d6 100644 --- a/Engine/Core/Bootstrap.php +++ b/Engine/Core/Bootstrap.php @@ -5,9 +5,6 @@ use Doctrine\ORM\OptimisticLockException; use Doctrine\ORM\ORMException; use Oforge\Engine\Core\Abstracts\AbstractBootstrap; -use Oforge\Engine\Core\Controller\Api\PingController; -use Oforge\Engine\Core\Controller\Frontend\NotFoundController; -use Oforge\Engine\Core\Controller\Frontend\ServerErrorController; use Oforge\Engine\Core\Models\Config\Config; use Oforge\Engine\Core\Models\Config\ConfigType; use Oforge\Engine\Core\Models\Config\Value; @@ -26,7 +23,7 @@ use Oforge\Engine\Core\Services\PluginAccessService; use Oforge\Engine\Core\Services\PluginStateService; use Oforge\Engine\Core\Services\RedirectService; -use Oforge\Engine\Core\Services\Session\SessionManagementService; +use Oforge\Engine\Core\Services\Session\SessionService; use Oforge\Engine\Core\Services\TokenService; /** @@ -38,9 +35,9 @@ class Bootstrap extends AbstractBootstrap { public function __construct() { $this->endpoints = [ - PingController::class, - NotFoundController::class, - ServerErrorController::class, + Controllers\Api\PingController::class, + Controllers\Frontend\NotFoundController::class, + Controllers\Frontend\ServerErrorController::class, ]; $this->models = [ @@ -55,17 +52,17 @@ public function __construct() { ]; $this->services = [ - 'config' => ConfigService::class, - 'encryption' => EncryptionService::class, - 'endpoint' => EndpointService::class, - 'middleware' => MiddlewareService::class, - 'ping' => PingService::class, - 'plugin.access' => PluginAccessService::class, - 'plugin.state' => PluginStateService::class, - 'redirect' => RedirectService::class, - 'session.management' => SessionManagementService::class, - 'store.keyvalue' => KeyValueStoreService::class, - 'token' => TokenService::class, + 'config' => ConfigService::class, + 'encryption' => EncryptionService::class, + 'endpoint' => EndpointService::class, + 'middleware' => MiddlewareService::class, + 'ping' => PingService::class, + 'plugin.access' => PluginAccessService::class, + 'plugin.state' => PluginStateService::class, + 'redirect' => RedirectService::class, + 'session' => SessionService::class, + 'store.keyvalue' => KeyValueStoreService::class, + 'token' => TokenService::class, ]; $this->order = 0; @@ -147,7 +144,7 @@ public function install() { 'name' => 'system_format_datetime', 'type' => ConfigType::STRING, 'group' => 'date_format', - 'default' => 'd.m.Y H:i:s', + 'default' => 'Y-m-d H:i:s', 'label' => 'config_system_format_datetime', 'required' => true, ]); @@ -155,7 +152,7 @@ public function install() { 'name' => 'system_format_date', 'type' => ConfigType::STRING, 'group' => 'date_format', - 'default' => 'd.m.Y', + 'default' => 'Y-m-d', 'label' => 'config_system_format_date', 'required' => true, ]); diff --git a/Engine/Core/Controller/Api/PingController.php b/Engine/Core/Controllers/Api/PingController.php similarity index 53% rename from Engine/Core/Controller/Api/PingController.php rename to Engine/Core/Controllers/Api/PingController.php index dfb65a7..d10b633 100644 --- a/Engine/Core/Controller/Api/PingController.php +++ b/Engine/Core/Controllers/Api/PingController.php @@ -1,18 +1,19 @@ 'Ping']); + /** @var PingService $pingService */ + $pingService = Oforge()->Services()->get('ping'); + + return ResponseHelper::json($response, ['message' => $pingService->me()]); } } diff --git a/Engine/Core/Controller/Frontend/NotFoundController.php b/Engine/Core/Controllers/Frontend/NotFoundController.php similarity index 70% rename from Engine/Core/Controller/Frontend/NotFoundController.php rename to Engine/Core/Controllers/Frontend/NotFoundController.php index 09481e3..1cb9277 100644 --- a/Engine/Core/Controller/Frontend/NotFoundController.php +++ b/Engine/Core/Controllers/Frontend/NotFoundController.php @@ -1,17 +1,17 @@ settings = $settings; @@ -104,17 +101,19 @@ public function init(array $settings) { $this->configuration->setMetadataDriverImpl($annotationDriver); // $this->configuration->setMetadataCacheImpl($filesystemCache); $this->configuration->setQueryCacheImpl($filesystemCache); - // proxy classes: true in dev | false in production - - if(!$isDevMode) { + if (!$isDevMode) { $this->configuration->setAutoGenerateProxyClasses(false); } - $this->configuration->setProxyDir(ROOT_PATH . Statics::DIR_CACHE_PROXY); - $this->configuration->addCustomStringFunction('ST_Distance_Sphere', ST_Distance_Sphere::class); - $this->configuration->addCustomStringFunction('POINT', POINT::class); - $this->configuration->addCustomStringFunction('DATEDIFF', DateDiffFunction::class); + $customStringFunctions = [ + 'DATEDIFF' => DateDiffFunction::class, + 'POINT' => Point::class, + 'ST_Distance_Sphere' => ST_Distance_Sphere::class, + ]; + foreach ($customStringFunctions as $name => $className) { + $this->configuration->addCustomStringFunction($name, $className); + } } /** @@ -200,7 +199,7 @@ private function loadLoadedModelSchemata() { * * @param string[] $schema */ - private function saveAddedModelSchemata($schema) { + private function saveAddedModelSchemata(array $schema) { $content = implode("\n", $schema); file_put_contents(self::PATH_CACHE_FILE, $content . "\n", FILE_APPEND); } diff --git a/Engine/Core/Forge/ForgeEntityManager.php b/Engine/Core/Forge/ForgeEntityManager.php index 4599790..28ad7b1 100644 --- a/Engine/Core/Forge/ForgeEntityManager.php +++ b/Engine/Core/Forge/ForgeEntityManager.php @@ -2,7 +2,6 @@ namespace Oforge\Engine\Core\Forge; -use Doctrine\Common\Persistence\Mapping\MappingException; use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\NativeQuery; @@ -10,6 +9,7 @@ use Doctrine\ORM\ORMException; use Doctrine\ORM\Query\ResultSetMapping; use Doctrine\ORM\QueryBuilder; +use Doctrine\Persistence\Mapping\MappingException; /** * Class ForgeEntityManager @@ -47,7 +47,7 @@ public function clear(?string $className = null) { * @return ForgeEntityManager * @throws ORMException */ - public function create($entity, $flush = true) : ForgeEntityManager { + public function create(object $entity, bool $flush = true) : ForgeEntityManager { $this->entityManager->persist($entity); if ($flush) { $this->entityManager->flush($entity); @@ -65,7 +65,7 @@ public function create($entity, $flush = true) : ForgeEntityManager { * @return ForgeEntityManager * @throws ORMException */ - public function update(&$entity, $flush = true) : ForgeEntityManager { + public function update(object &$entity, bool $flush = true) : ForgeEntityManager { if (!$this->entityManager->contains($entity)) { $entity = $this->entityManager->merge($entity); } @@ -83,7 +83,7 @@ public function update(&$entity, $flush = true) : ForgeEntityManager { * @throws ORMException * @throws OptimisticLockException */ - public function remove($entity, $flush = true) { + public function remove(object $entity, bool $flush = true) { $this->entityManager->remove($entity); if ($flush) { $this->entityManager->flush($entity); @@ -96,7 +96,7 @@ public function remove($entity, $flush = true) { * @throws ORMException * @throws OptimisticLockException */ - public function flush($entity = null) { + public function flush(?object $entity = null) { $this->entityManager->flush($entity); } diff --git a/Engine/Core/Forge/ForgeSlimApp.php b/Engine/Core/Forge/ForgeSlimApp.php index 7fcdcd5..275156f 100644 --- a/Engine/Core/Forge/ForgeSlimApp.php +++ b/Engine/Core/Forge/ForgeSlimApp.php @@ -36,18 +36,26 @@ public function __construct() { $message = $exception->getMessage(); Oforge()->Logger()->get()->error($message, $exception->getTrace()); - echo $message, "
", $exception->getTraceAsString(); - die; - + $trace = str_replace("\n", "
\n", $exception->getTraceAsString()); + $file = $exception->getFile(); + $line = $exception->getLine(); + $html = <<Exception: $message +
+
File
$file
+
Line
$line
+
Trace
$trace
+
+TAG; if (Oforge()->Settings()->isDevelopmentMode()) { - return $response->withStatus(500); + return $response->write($html)->withStatus(500); } else { - Oforge()->Logger()->get()->error($message, $exception->getTrace()); + // TODO something to do??? + return $response; } }; }; - $container['errorHandler'] = $errorHandler; $container['phpErrorHandler'] = $errorHandler; @@ -56,9 +64,7 @@ public function __construct() { }; } - /** - * @return ForgeSlimApp - */ + /** @return ForgeSlimApp */ public static function getInstance() : ForgeSlimApp { if (!isset(self::$instance)) { self::$instance = new ForgeSlimApp(); @@ -68,44 +74,15 @@ public static function getInstance() : ForgeSlimApp { } /** - * Start the session + * @param bool $silent * - * @param int $lifetimeSeconds - * @param string $path - * @param null $domain - * @param null $secure + * @return ResponseInterface + * @throws \Throwable */ - public function sessionStart($lifetimeSeconds = 0, $path = '/', $domain = null, $secure = null) { - $sessionStatus = session_status(); - - if ($sessionStatus != PHP_SESSION_ACTIVE) { - session_name("oforge_session"); - if (!empty($_SESSION['deleted_time']) - && $_SESSION['deleted_time'] < time() - 180) { - session_destroy(); - } - // Set the domain to default to the current domain. - $domain = isset($domain) ? $domain : $_SERVER['SERVER_NAME']; - - // Set the default secure value to whether the site is being accessed with SSL - $secure = isset($secure) ? $secure : isset($_SERVER['HTTPS']) ? true : false; - - // Set the cookie settings and start the session - session_set_cookie_params($lifetimeSeconds, $path, $domain, $secure, true); - session_start(); - $_SESSION['created_time'] = time(); - } - } - public function run($silent = false) { - /** - * @var $response ResponseInterface - */ + /** @var ResponseInterface $response */ $response = $this->getContainer()->get('response'); - - /** - * @var $request ServerRequestInterface - */ + /** @var ServerRequestInterface $request */ $request = $this->getContainer()->get('request'); try { @@ -119,6 +96,7 @@ public function run($silent = false) { if (!$silent) { $this->respond($response); } + return $response; } @@ -134,7 +112,7 @@ private function createLog(array $data, string $keyPrefix = '') { if (is_array($value)) { $message .= $this->createLog($value, ltrim($keyPrefix . '.' . $key, '.')); } else { - $message .= (empty($keyPrefix) ? '' : ($keyPrefix . '.')) . $key . ' => ' . $value . "\n";; + $message .= ltrim($keyPrefix . '.' . $key, '.') . ' => ' . $value . "\n";; } } diff --git a/Engine/Core/Annotation/ORM/Discriminator/DiscriminatorEntry.php b/Engine/Core/Forge/ORM/Annotations/Discriminator/DiscriminatorEntry.php similarity index 86% rename from Engine/Core/Annotation/ORM/Discriminator/DiscriminatorEntry.php rename to Engine/Core/Forge/ORM/Annotations/Discriminator/DiscriminatorEntry.php index 05a9244..e9925bd 100644 --- a/Engine/Core/Annotation/ORM/Discriminator/DiscriminatorEntry.php +++ b/Engine/Core/Forge/ORM/Annotations/Discriminator/DiscriminatorEntry.php @@ -1,6 +1,6 @@ getEventManager()->addEventSubscriber(new static()); } @@ -47,9 +52,9 @@ public function getSubscribedEvents() : array { /** * @param LoadClassMetadataEventArgs $eventArgs * - * @throws \Doctrine\ORM\ORMException - * @throws \ReflectionException - * @throws \Doctrine\Common\Annotations\AnnotationException + * @throws ORMException + * @throws ReflectionException + * @throws AnnotationException */ public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs) { $class = $eventArgs->getClassMetadata()->getName(); @@ -95,15 +100,15 @@ public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs) { * @param string $annotationName * * @return Annotation|null - * @throws \Doctrine\Common\Annotations\AnnotationException - * @throws \ReflectionException + * @throws ReflectionException */ protected function getAnnotationForCass(string $class, string $annotationName) { - $reflectionClass = new \ReflectionClass($class); + $reflectionClass = new ReflectionClass($class); if (isset($this->annotations[$reflectionClass->getName()][$annotationName])) { return $this->annotations[$reflectionClass->getName()][$annotationName]; } - $reader = new AnnotationReader(); + $reader = new AnnotationReader(); + /** @var Annotation|null $annotation */ $annotation = $reader->getClassAnnotation($reflectionClass, $annotationName); if (isset($annotation)) { $this->annotations[$reflectionClass->getName()][$annotationName] = $annotation; @@ -116,10 +121,9 @@ protected function getAnnotationForCass(string $class, string $annotationName) { * @param string $class * * @return bool - * @throws \ReflectionException - * @throws \Doctrine\Common\Annotations\AnnotationException + * @throws ReflectionException */ - protected function isDiscriminatorParent($class) { + protected function isDiscriminatorParent(string $class) { if (!$this->getAnnotationForCass($class, self::ANNOTATION_PARENT)) { return false; } @@ -142,11 +146,11 @@ protected function getDiscriminatorValue(string $class, ?DiscriminatorEntry $dis * @param string $currentClass * * @return bool - * @throws \ReflectionException - * @throws \Doctrine\Common\Annotations\AnnotationException + * @throws ReflectionException + * @throws AnnotationException */ - private function isDiscriminatorChild($parentClass, $currentClass) { - $reflectionClass = new \ReflectionClass($currentClass); + private function isDiscriminatorChild(string $parentClass, string $currentClass) { + $reflectionClass = new ReflectionClass($currentClass); $parentReflectionClass = $reflectionClass->getParentClass(); if ($parentReflectionClass === false) { return false; diff --git a/Engine/Core/Forge/Doctrine/Point.php b/Engine/Core/Forge/ORM/CustomStringFunctions/Point.php similarity index 71% rename from Engine/Core/Forge/Doctrine/Point.php rename to Engine/Core/Forge/ORM/CustomStringFunctions/Point.php index cd115eb..41512eb 100644 --- a/Engine/Core/Forge/Doctrine/Point.php +++ b/Engine/Core/Forge/ORM/CustomStringFunctions/Point.php @@ -8,16 +8,42 @@ /* This file is auto-generated. Don't edit directly! */ -namespace Oforge\Engine\Core\Forge\Doctrine; +namespace Oforge\Engine\Core\Forge\ORM\CustomStringFunctions; use Doctrine\ORM\Query\AST\Functions\FunctionNode; use Doctrine\ORM\Query\Lexer; use Doctrine\ORM\Query\Parser; +use Doctrine\ORM\Query\QueryException; use Doctrine\ORM\Query\SqlWalker; +/** + * Class Point + * + * @package Oforge\Engine\Core\Forge\ORM\CustomStringFunctions + */ class Point extends FunctionNode { + /** @var array $expressions */ protected $expressions = []; + /** + * @param SqlWalker $sqlWalker + * + * @return string + */ + public function getSql(SqlWalker $sqlWalker) { + $arguments = []; + foreach ($this->expressions as $expression) { + $arguments[] = $expression->dispatch($sqlWalker); + } + + return 'Point(' . implode(', ', $arguments) . ')'; + } + + /** + * @param Parser $parser + * + * @throws QueryException + */ public function parse(Parser $parser) { $parser->match(Lexer::T_IDENTIFIER); $parser->match(Lexer::T_OPEN_PARENTHESIS); @@ -27,12 +53,4 @@ public function parse(Parser $parser) { $parser->match(Lexer::T_CLOSE_PARENTHESIS); } - public function getSql(SqlWalker $sqlWalker) { - $arguments = []; - foreach ($this->expressions as $expression) { - $arguments[] = $expression->dispatch($sqlWalker); - } - - return 'Point(' . implode(', ', $arguments) . ')'; - } } diff --git a/Engine/Core/Forge/Doctrine/ST_Distance_Sphere.php b/Engine/Core/Forge/ORM/CustomStringFunctions/ST_Distance_Sphere.php similarity index 61% rename from Engine/Core/Forge/Doctrine/ST_Distance_Sphere.php rename to Engine/Core/Forge/ORM/CustomStringFunctions/ST_Distance_Sphere.php index 4808ae4..b9fd2c3 100644 --- a/Engine/Core/Forge/Doctrine/ST_Distance_Sphere.php +++ b/Engine/Core/Forge/ORM/CustomStringFunctions/ST_Distance_Sphere.php @@ -6,20 +6,45 @@ * Time: 09:13 */ - /* This file is auto-generated. Don't edit directly! */ -namespace Oforge\Engine\Core\Forge\Doctrine; + +namespace Oforge\Engine\Core\Forge\ORM\CustomStringFunctions; use Doctrine\ORM\Query\AST\Functions\FunctionNode; use Doctrine\ORM\Query\Lexer; use Doctrine\ORM\Query\Parser; +use Doctrine\ORM\Query\QueryException; use Doctrine\ORM\Query\SqlWalker; -class ST_Distance_Sphere extends FunctionNode -{ +/** + * Class ST_Distance_Sphere + * + * @package Oforge\Engine\Core\Forge\ORM\CustomStringFunctions + */ +class ST_Distance_Sphere extends FunctionNode { + /** @var array $expressions */ protected $expressions = []; - public function parse(Parser $parser) - { + + /** + * @param SqlWalker $sqlWalker + * + * @return string + */ + public function getSql(SqlWalker $sqlWalker) { + $arguments = []; + foreach ($this->expressions as $expression) { + $arguments[] = $expression->dispatch($sqlWalker); + } + + return 'ST_Distance_Sphere(' . implode(', ', $arguments) . ')'; + } + + /** + * @param Parser $parser + * + * @throws QueryException + */ + public function parse(Parser $parser) { $parser->match(Lexer::T_IDENTIFIER); $parser->match(Lexer::T_OPEN_PARENTHESIS); $this->expressions[] = $parser->ArithmeticFactor(); @@ -27,12 +52,5 @@ public function parse(Parser $parser) $this->expressions[] = $parser->ArithmeticFactor(); $parser->match(Lexer::T_CLOSE_PARENTHESIS); } - public function getSql(SqlWalker $sqlWalker) - { - $arguments = []; - foreach ($this->expressions as $expression) { - $arguments[] = $expression->dispatch($sqlWalker); - } - return 'ST_Distance_Sphere(' . implode(', ', $arguments) . ')'; - } + } diff --git a/Engine/Core/Helper/Cookie.php b/Engine/Core/Helper/CookieHelper.php similarity index 53% rename from Engine/Core/Helper/Cookie.php rename to Engine/Core/Helper/CookieHelper.php index e4dad98..d591b5f 100644 --- a/Engine/Core/Helper/Cookie.php +++ b/Engine/Core/Helper/CookieHelper.php @@ -8,16 +8,22 @@ namespace Oforge\Engine\Core\Helper; +use DateTime; +use DateTimeImmutable; use Exception; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; /** - * Class Cookie + * Class CookieHelper * * @package Oforge\Engine\Core\Helper */ -class Cookie { +class CookieHelper { + + /** Prevent instance. */ + private function __construct() { + } /** * Delete the cookie by putting the expiration date in the past. @@ -27,11 +33,11 @@ class Cookie { * * @return Response */ - public function deleteCookie(Response $response, string $cookieName) : Response { - $cookie = urlencode($cookieName) . '=' . urlencode('deleted') . '; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; secure; httponly'; - $response = $response->withAddedHeader('Set-Cookie', $cookie); + public static function deleteCookie(Response $response, string $cookieName) : Response { + $cookie = urlencode($cookieName) . '=' . urlencode('deleted')# + . '; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; secure; httponly'; - return $response; + return $response->withAddedHeader('Set-Cookie', $cookie); } /** @@ -45,16 +51,17 @@ public function deleteCookie(Response $response, string $cookieName) : Response * @return Response * @throws Exception If an error occurs while creating the expiration date (DateTimeImmutable). */ - public function addCookie(Response $response, string $cookieName, $cookieValue, int $expirationMinutes = 300) : Response { + public static function addCookie(Response $response, string $cookieName, $cookieValue, int $expirationMinutes = 300) : Response { if ($expirationMinutes < 0) { $expirationMinutes = 0; } - $expiry = new \DateTimeImmutable('now + ' . $expirationMinutes . 'minutes'); - $cookie = urlencode($cookieName) . '=' . urlencode($cookieValue) . '; expires=' . $expiry->format(\DateTime::COOKIE) . '; Max-Age=' - . $expirationMinutes * 60 . '; path=/; secure; httponly'; - $response = $response->withAddedHeader('Set-Cookie', $cookie); + $expiry = new DateTimeImmutable('now + ' . $expirationMinutes . 'minutes'); + $cookie = urlencode($cookieName) . '=' . urlencode($cookieValue)# + . '; expires=' . $expiry->format(DateTime::COOKIE)# + . '; Max-Age=' . $expirationMinutes# + . '; path=/; secure; httponly'; - return $response; + return $response->withAddedHeader('Set-Cookie', $cookie); } /** @@ -64,7 +71,7 @@ public function addCookie(Response $response, string $cookieName, $cookieValue, * * @return mixed|null */ - public function getCookieValue(Request $request, string $cookieName, $default = null) { + public static function getCookieValue(Request $request, string $cookieName, $default = null) { $cookies = $request->getCookieParams(); return isset($cookies[$cookieName]) ? urldecode($cookies[$cookieName]) : $default; diff --git a/Engine/Core/Helper/DateTimeFormatter.php b/Engine/Core/Helper/DateTimeFormatter.php index 8a606b2..94e4166 100644 --- a/Engine/Core/Helper/DateTimeFormatter.php +++ b/Engine/Core/Helper/DateTimeFormatter.php @@ -2,6 +2,7 @@ namespace Oforge\Engine\Core\Helper; +use DateTimeImmutable; use DateTimeInterface; use Exception; use Oforge\Engine\Core\Services\ConfigService; @@ -46,6 +47,58 @@ public static function time(?DateTimeInterface $dateTimeObject) : string { return self::format($dateTimeObject, 'system_format_time', 'H:i:s'); } + /** + * @param string $input + * + * @return DateTimeImmutable|null + */ + public static function parseDate(string $input) : ?DateTimeImmutable { + return self::parse($input, 'system_format_date', 'Y-m-d'); + } + + /** + * @param string $input + * + * @return DateTimeImmutable|null + */ + public static function parseDatetime(string $input) : ?DateTimeImmutable { + return self::parse($input, 'system_format_datetime', 'Y-m-d H:i:s'); + } + + /** + * @param string $input + * + * @return DateTimeImmutable|null + */ + public static function parseTime(string $input) : ?DateTimeImmutable { + return self::parse($input, 'system_format_time', 'H:i:s'); + } + + /** + * @param string|null $input + * @param string $configKey + * @param string $defaultFormat + * + * @return DateTimeImmutable|null + */ + protected static function parse(?string $input, string $configKey, string $defaultFormat) : ?DateTimeImmutable { + if (empty($input)) { + return null; + } + try { + if (!isset(self::$configService)) { + self::$configService = Oforge()->Services()->get('config'); + } + $format = self::$configService->get($configKey); + + } catch (Exception $exception) { + $format = $defaultFormat; + } + $result = DateTimeImmutable::createFromFormat($format, $input); + + return ($result === false ? null : $result); + } + /** * Format DateTimeObjects. * diff --git a/Engine/Core/Manager/Bootstrap/BootstrapManager.php b/Engine/Core/Managers/Bootstrap/BootstrapManager.php similarity index 98% rename from Engine/Core/Manager/Bootstrap/BootstrapManager.php rename to Engine/Core/Managers/Bootstrap/BootstrapManager.php index e3aef70..52fad71 100644 --- a/Engine/Core/Manager/Bootstrap/BootstrapManager.php +++ b/Engine/Core/Managers/Bootstrap/BootstrapManager.php @@ -1,6 +1,6 @@ Services()->get('config'); - $debugMode = $configService->get('debug_mode'); - if ($debugMode) { - $debugData = []; - $debugConsole = $configService->get('debug_console'); - if ($debugConsole) { - $debugData['console'] = true; - } - Oforge()->View()->assign(['debug' => $debugData]); - } - - return $next($request, $response); - } - -} diff --git a/Engine/Core/Middlewares/DebugModeMiddleware.php b/Engine/Core/Middlewares/DebugModeMiddleware.php new file mode 100644 index 0000000..34098ae --- /dev/null +++ b/Engine/Core/Middlewares/DebugModeMiddleware.php @@ -0,0 +1,43 @@ +Services()->get('config'); + $debugMode = $configService->get('debug_mode'); + if ($debugMode) { + $debugData = []; + $debugConsole = $configService->get('debug_console'); + if ($debugConsole) { + $debugData['console'] = true; + } + Oforge()->View()->assign(['debug' => $debugData]); + } + + return $next($request, $response); + } + +} diff --git a/Engine/Core/Middleware/SessionMiddleware.php b/Engine/Core/Middlewares/SessionMiddleware.php similarity index 50% rename from Engine/Core/Middleware/SessionMiddleware.php rename to Engine/Core/Middlewares/SessionMiddleware.php index d2f43f6..4fd132b 100644 --- a/Engine/Core/Middleware/SessionMiddleware.php +++ b/Engine/Core/Middlewares/SessionMiddleware.php @@ -1,42 +1,39 @@ Services()->get('session.management'); - $sessionManager->sessionStart(); + public function __invoke(RequestInterface $request, ResponseInterface $response, callable $next) { + /** @var SessionService $sessionService */ + $sessionService = Oforge()->Services()->get('session'); + $sessionService->start(); /** @var ConfigService $configService */ $configService = Oforge()->Services()->get('config'); - $debugMode = $configService->get('debug_mode'); - - if ($debugMode) { - /** for debugging purposes */ - $debugSession = $configService->get('debug_session'); - if ($debugSession) { + if ($configService->get('debug_mode')) { + // for debugging purposes + if ($configService->get('debug_session')) { Oforge()->View()->assign(['debug.session' => $_SESSION]); } } diff --git a/Engine/Core/Models/Endpoint/EndpointMethod.php b/Engine/Core/Models/Endpoint/EndpointMethod.php index 18ca02c..0506814 100644 --- a/Engine/Core/Models/Endpoint/EndpointMethod.php +++ b/Engine/Core/Models/Endpoint/EndpointMethod.php @@ -5,7 +5,7 @@ /** * Class EndpointMethod * - * @package Oforge\Engine\Core\Annotation\Endpoint + * @package Oforge\Engine\Core\Models\Endpoint */ class EndpointMethod { public const ANY = 'any'; diff --git a/Engine/Core/Services/EndpointService.php b/Engine/Core/Services/EndpointService.php index 5f584d4..c426052 100644 --- a/Engine/Core/Services/EndpointService.php +++ b/Engine/Core/Services/EndpointService.php @@ -9,9 +9,9 @@ use Doctrine\ORM\OptimisticLockException; use Doctrine\ORM\ORMException; use Oforge\Engine\Core\Abstracts\AbstractDatabaseAccess; -use Oforge\Engine\Core\Annotation\Endpoint\AssetBundlesMode; -use Oforge\Engine\Core\Annotation\Endpoint\EndpointAction; -use Oforge\Engine\Core\Annotation\Endpoint\EndpointClass; +use Oforge\Engine\Core\Annotations\Endpoint\AssetBundleMode; +use Oforge\Engine\Core\Annotations\Endpoint\EndpointAction; +use Oforge\Engine\Core\Annotations\Endpoint\EndpointClass; use Oforge\Engine\Core\Helper\FileSystemHelper; use Oforge\Engine\Core\Helper\Statics; use Oforge\Engine\Core\Helper\StringHelper; @@ -291,7 +291,7 @@ protected function buildEndpointConfig( $order = null; $httpMethod = EndpointMethod::ANY; - $assetBundlesMode = $classAnnotation->getAssetBundlesMode(); + $AssetBundleMode = $classAnnotation->getAssetBundleMode(); $classAssetBundles = $classAnnotation->getAssetBundles(); $methodAssetBundles = null; @@ -306,7 +306,7 @@ protected function buildEndpointConfig( if (isset($methodAnnotation)) { $order = $methodAnnotation->getOrder(); $methodAssetBundles = $methodAnnotation->getAssetBundles(); - $assetBundlesMode = $methodAnnotation->getAssetBundlesMode() ?? $assetBundlesMode; + $AssetBundleMode = $methodAnnotation->getAssetBundleMode() ?? $AssetBundleMode; if (EndpointMethod::isValid($methodAnnotation->getMethod())) { $httpMethod = $methodAnnotation->getMethod(); } @@ -326,8 +326,8 @@ protected function buildEndpointConfig( $path = StringHelper::leading($path, '/'); $order = $order ?? $classAnnotation->getOrder() ?? Statics::DEFAULT_ORDER; - $assetBundlesMode = $assetBundlesMode ?? AssetBundlesMode::OVERRIDE; - $assetBundles = $this->prepareEndpointAssetBundles($assetBundlesMode, $classAssetBundles, $methodAssetBundles); + $AssetBundleMode = $AssetBundleMode ?? AssetBundleMode::OVERRIDE; + $assetBundles = $this->prepareEndpointAssetBundles($AssetBundleMode, $classAssetBundles, $methodAssetBundles); return [ 'name' => $name, @@ -344,13 +344,13 @@ protected function buildEndpointConfig( } /** - * @param string $assetBundlesMode + * @param string $AssetBundleMode * @param string|string[]|null $classAssetBundles * @param string|string[]|null $methodAssetBundles * * @return string[] */ - private function prepareEndpointAssetBundles(string $assetBundlesMode, $classAssetBundles, $methodAssetBundles) { + private function prepareEndpointAssetBundles(string $AssetBundleMode, $classAssetBundles, $methodAssetBundles) { /** * @param string|string[]|null $values * @@ -367,14 +367,14 @@ private function prepareEndpointAssetBundles(string $assetBundlesMode, $classAss return $values; }; - switch ($assetBundlesMode) { - case AssetBundlesMode::MERGE: + switch ($AssetBundleMode) { + case AssetBundleMode::MERGE: $assetBundles = array_unique(array_merge($convert($classAssetBundles), $convert($methodAssetBundles))); break; - case AssetBundlesMode::NONE: + case AssetBundleMode::NONE: $assetBundles = []; break; - case AssetBundlesMode::OVERRIDE: + case AssetBundleMode::OVERRIDE: default: $assetBundles = $convert($methodAssetBundles); if (empty($assetBundles)) { diff --git a/Engine/Core/Services/PingService.php b/Engine/Core/Services/PingService.php index 52d84ec..dfa01b1 100644 --- a/Engine/Core/Services/PingService.php +++ b/Engine/Core/Services/PingService.php @@ -16,7 +16,7 @@ class PingService { * * @return string */ - public function me($echo = false) { + public function me(bool $echo = false) { $text = "Hail to the Oforge King! When you see this, everything looks good"; if ($echo) { echo $text, "\n"; diff --git a/Engine/Core/Services/Session/SessionManagementService.php b/Engine/Core/Services/Session/SessionManagementService.php deleted file mode 100644 index 4f6cf6e..0000000 --- a/Engine/Core/Services/Session/SessionManagementService.php +++ /dev/null @@ -1,71 +0,0 @@ -sessionDestroy(); - $this->sessionStart(0); - $_SESSION = array_merge($_SESSION, $oldSessionData); - $_SESSION['created_time'] = time(); - } - - /** - * Destroy the session an the corresponding cookie - */ - public function sessionDestroy() { - $_SESSION = []; - session_destroy(); - session_id(session_create_id()); - } -} diff --git a/Engine/Core/Services/Session/SessionService.php b/Engine/Core/Services/Session/SessionService.php new file mode 100644 index 0000000..145e683 --- /dev/null +++ b/Engine/Core/Services/Session/SessionService.php @@ -0,0 +1,71 @@ +sessionDestroy(); + $this->start(0); + $_SESSION = array_merge($_SESSION, $oldSessionData); + + $_SESSION['session_created'] = time(); + } + + /** + * Destroy the session an the corresponding cookie + */ + public function sessionDestroy() { + // $oldCookieParams = session_get_cookie_params(); + // setcookie(session_name(), '', time() - 3600, $oldCookieParams['path'], $oldCookieParams['domain'], $oldCookieParams['secure'], isset($oldCookieParams['httponly'])); + // TODO destroyen des alten cookies testen + + $_SESSION = []; + session_destroy(); + session_id(session_create_id()); + } + +} diff --git a/Engine/Core/Controller/Traits/TraitInitializer.php b/Engine/Core/Traits/Controller/TraitInitializer.php similarity index 87% rename from Engine/Core/Controller/Traits/TraitInitializer.php rename to Engine/Core/Traits/Controller/TraitInitializer.php index 0829669..b35b60c 100644 --- a/Engine/Core/Controller/Traits/TraitInitializer.php +++ b/Engine/Core/Traits/Controller/TraitInitializer.php @@ -1,11 +1,11 @@ \Oforge\Engine\Crud\Service\GenericCrudService::class, + override(\Oforge\Engine\Core\Managers\Services\ServiceManager::get(0), map([ + 'crud' => \Oforge\Engine\Crud\Services\GenericCrudService::class, ])); } diff --git a/Engine/Crud/Bootstrap.php b/Engine/Crud/Bootstrap.php index 418b6c3..77a6768 100644 --- a/Engine/Crud/Bootstrap.php +++ b/Engine/Crud/Bootstrap.php @@ -4,7 +4,7 @@ use Oforge\Engine\Core\Abstracts\AbstractBootstrap; use Oforge\Engine\Core\Exceptions\LoggerAlreadyExistException; -use Oforge\Engine\Crud\Service\GenericCrudService; +use Oforge\Engine\Crud\Services\GenericCrudService; /** * Class Bootstrap diff --git a/Engine/Crud/Enum/CrudDataAccessLevel.php b/Engine/Crud/Enums/CrudDataAccessLevel.php similarity index 78% rename from Engine/Crud/Enum/CrudDataAccessLevel.php rename to Engine/Crud/Enums/CrudDataAccessLevel.php index cf8be7d..fcb7e8a 100644 --- a/Engine/Crud/Enum/CrudDataAccessLevel.php +++ b/Engine/Crud/Enums/CrudDataAccessLevel.php @@ -1,11 +1,11 @@ 'parseDate', + CrudDataType::DATETIME => 'parseDatetime', + CrudDataType::TIME => 'parseTime', + ]; + $this->iterateModelProperties(function ($property, $propertyConfig) use (&$data, $map) { + if (ArrayHelper::dotExist($data, $property) && isset($map[$propertyConfig['type']])) { + $method = $map[$propertyConfig['type']]; + $value = DateTimeFormatter::$method(ArrayHelper::dotGet($data, $property)); + $data = ArrayHelper::dotSet($data, $property, $value); + } + }); + } + + /** + * @param array $data + */ + protected function prepareOutputDataConvertDateTime2String(array &$data) { + $map = [ + CrudDataType::DATE => 'date', + CrudDataType::DATETIME => 'datetime', + CrudDataType::TIME => 'time', + ]; + $this->iterateModelProperties(function ($property, $propertyConfig) use (&$data, $map) { + if (ArrayHelper::dotExist($data, $property) && isset($map[$propertyConfig['type']])) { + $method = $map[$propertyConfig['type']]; + $value = DateTimeFormatter::$method(ArrayHelper::dotGet($data, $property)); + $data = ArrayHelper::dotSet($data, $property, $value); + } + }); + } + +} diff --git a/Engine/Crud/Controller/Traits/CrudBaseTrait.php b/Engine/Crud/Traits/Controller/CrudBaseTrait.php similarity index 81% rename from Engine/Crud/Controller/Traits/CrudBaseTrait.php rename to Engine/Crud/Traits/Controller/CrudBaseTrait.php index fd39769..756611f 100644 --- a/Engine/Crud/Controller/Traits/CrudBaseTrait.php +++ b/Engine/Crud/Traits/Controller/CrudBaseTrait.php @@ -1,18 +1,18 @@ filterArrayByModelPropertyMode($data, $this->strictWriteMode, $accessLevel, $context); + $data = $this->filterArrayByModelPropertyMode($data, $this->strictWriteMode, $accessLevel, $context); + if (method_exists($this, 'processInputDataConvertDateTimeFromString')) { + $this->processInputDataConvertDateTimeFromString($data); + } + + return $data; + } + + /** + * Prepare item data for output, e.G. DateTime to string or additional custom data. + * + * @param AbstractModel|null $entity + * @param string $context Crud action or custom contexts. + * + * @return array + * @throws Exception + */ + protected function prepareOutputData(?AbstractModel $entity, string $context) : array { + $data = $entity === null ? [] : $entity->toArray(); + + $data = $this->filterArrayByModelPropertyMode($data, $this->strictReadMode, CrudDataAccessLevel::READ, $context); + if (method_exists($this, 'prepareOutputDataConvertDateTime2String')) { + $this->prepareOutputDataConvertDateTime2String($data); + } + + return $data; } /** @@ -130,31 +155,17 @@ protected function filterArrayByModelPropertyMode(array $array, bool $strictMode if (ArrayHelper::get($propertyConfig, 'mode', CrudDataAccessLevel::OFF) < $accessLevel) { continue; } - $value = ArrayHelper::dotGet($array, $property, null); - if ($value !== null || ArrayHelper::dotGet($array, $property, false) !== false) { - $result = ArrayHelper::dotSet($result, $property, $value); + if (!ArrayHelper::dotExist($array, $property)) { + continue; } + $value = ArrayHelper::dotGet($array, $property, null); + $result = ArrayHelper::dotSet($result, $property, $value); } } return $result; } - /** - * Prepare Item data for view, e.G. DateTime to string or custom column data. - * - * @param AbstractModel|null $entity - * @param string $context Crud action or custom contexts. - * - * @return array - * @throws Exception - */ - protected function prepareEntityDataArray(?AbstractModel $entity, string $context) : array { - $data = $entity === null ? [] : $entity->toArray(); - - return $this->filterArrayByModelPropertyMode($data, $this->strictReadMode, CrudDataAccessLevel::READ, $context); - } - /** * Adjustments of modelProperties config at runtime, e.g. for adding options by configs. * @@ -218,4 +229,16 @@ protected function replaceI18NConfig(array &$array, $keys) { } } + /** + * @param callable $callable With params $property, $propertyConfig + */ + protected function iterateModelProperties(callable $callable) { + $modelProperties = $this->modelProperties; + if (empty(!$modelProperties)) { + foreach ($modelProperties as $property => $propertyConfig) { + $callable($property, $propertyConfig); + } + } + } + } diff --git a/Engine/Crud/Controller/Traits/CrudBundleCrudActionsTrait.php b/Engine/Crud/Traits/Controller/CrudBundleCrudActionsTrait.php similarity index 68% rename from Engine/Crud/Controller/Traits/CrudBundleCrudActionsTrait.php rename to Engine/Crud/Traits/Controller/CrudBundleCrudActionsTrait.php index b499eab..ed3cb35 100644 --- a/Engine/Crud/Controller/Traits/CrudBundleCrudActionsTrait.php +++ b/Engine/Crud/Traits/Controller/CrudBundleCrudActionsTrait.php @@ -1,11 +1,11 @@ getParsedBody())) { @@ -36,10 +36,10 @@ public function createAction(Request $request, Response $response) { if (method_exists($this, 'handleFileUploads')) { $this->handleFileUploads($data, $request, 'create'); } - $data = $this->convertData($data, 'create'); + $data = $this->processInputData($data, 'create'); $entity = $this->crudService->create($this->model, $data); - return ResponseHelper::json($response, $this->prepareEntityDataArray($entity, 'create'))->withStatus(201); + return ResponseHelper::json($response, $this->prepareOutputData($entity, 'create'))->withStatus(201); } catch (EntityAlreadyExistException | UniqueConstraintViolationException $exception) { Oforge()->Logger()->logException($exception, 'crud', Logger::WARNING); diff --git a/Engine/Crud/Controller/Traits/CrudDeleteActionTrait.php b/Engine/Crud/Traits/Controller/CrudDeleteActionTrait.php similarity index 82% rename from Engine/Crud/Controller/Traits/CrudDeleteActionTrait.php rename to Engine/Crud/Traits/Controller/CrudDeleteActionTrait.php index 68d9883..e393431 100644 --- a/Engine/Crud/Controller/Traits/CrudDeleteActionTrait.php +++ b/Engine/Crud/Traits/Controller/CrudDeleteActionTrait.php @@ -1,10 +1,10 @@ getQueryParams(); @@ -91,7 +91,7 @@ public function indexAction(Request $request, Response $response) { } foreach ($entities as $index => $entity) { try { - $entities[$index] = $this->prepareEntityDataArray($entity, 'index'); + $entities[$index] = $this->prepareOutputData($entity, 'index'); } catch (Exception $exception) { Oforge()->Logger()->logException($exception, 'crud'); } diff --git a/Engine/Crud/Controller/Traits/CrudReadActionTrait.php b/Engine/Crud/Traits/Controller/CrudReadActionTrait.php similarity index 80% rename from Engine/Crud/Controller/Traits/CrudReadActionTrait.php rename to Engine/Crud/Traits/Controller/CrudReadActionTrait.php index 8b964d7..137f7f5 100644 --- a/Engine/Crud/Controller/Traits/CrudReadActionTrait.php +++ b/Engine/Crud/Traits/Controller/CrudReadActionTrait.php @@ -1,11 +1,11 @@ model, $args['id']); } - return ResponseHelper::json($response, $this->prepareEntityDataArray($entity, 'get')); + return ResponseHelper::json($response, $this->prepareOutputData($entity, 'get')); } catch (EntityNotFoundException $exception) { Oforge()->Logger()->logException($exception, 'crud', Logger::WARNING); diff --git a/Engine/Crud/Controller/Traits/CrudUpdateActionTrait.php b/Engine/Crud/Traits/Controller/CrudUpdateActionTrait.php similarity index 81% rename from Engine/Crud/Controller/Traits/CrudUpdateActionTrait.php rename to Engine/Crud/Traits/Controller/CrudUpdateActionTrait.php index 7d396d8..a6d6e2d 100644 --- a/Engine/Crud/Controller/Traits/CrudUpdateActionTrait.php +++ b/Engine/Crud/Traits/Controller/CrudUpdateActionTrait.php @@ -1,10 +1,10 @@ getParsedBody())) { @@ -33,10 +33,10 @@ public function updateAction(Request $request, Response $response, array $args) if (method_exists($this, 'handleFileUploads')) { $this->handleFileUploads($data, $request, 'update'); } - $data = $this->convertData($data, 'update'); + $data = $this->processInputData($data, 'update'); $entity = $this->crudService->update($this->model, $args['id'], $data); - return ResponseHelper::json($response, $this->prepareEntityDataArray($entity, 'update')); + return ResponseHelper::json($response, $this->prepareOutputData($entity, 'update')); } catch (EntityNotFoundException $exception) { Oforge()->Logger()->logException($exception, 'crud', Logger::WARNING); diff --git a/Engine/Crud/Controller/Traits/CrudValidateAndSanitizeTrait.php b/Engine/Crud/Traits/Controller/CrudValidateAndSanitizeTrait.php similarity index 96% rename from Engine/Crud/Controller/Traits/CrudValidateAndSanitizeTrait.php rename to Engine/Crud/Traits/Controller/CrudValidateAndSanitizeTrait.php index ca98b5e..2568e4a 100644 --- a/Engine/Crud/Controller/Traits/CrudValidateAndSanitizeTrait.php +++ b/Engine/Crud/Traits/Controller/CrudValidateAndSanitizeTrait.php @@ -1,15 +1,15 @@ \Oforge\Engine\File\Services\FileAccessService::class, 'file.management' => \Oforge\Engine\File\Services\FileManagementService::class, 'file.mimeType' => \Oforge\Engine\File\Services\AllowedFileMimeTypeService::class, @@ -15,11 +15,11 @@ /** * Events */ - override(\Oforge\Engine\Core\Manager\Events\Event::create(0), map([ + override(\Oforge\Engine\Core\Managers\Events\Event::create(0), map([ \Oforge\Engine\File\Models\File::class . '::created' => '', \Oforge\Engine\File\Models\File::class . '::removed' => '', ])); - override(\Oforge\Engine\Core\Manager\Events\EventManager::attach(0), map([ + override(\Oforge\Engine\Core\Managers\Events\EventManager::attach(0), map([ \Oforge\Engine\File\Models\File::class . '::created' => '', \Oforge\Engine\File\Models\File::class . '::removed' => '', ])); diff --git a/Engine/File/.meta/plugin.meta.php b/Engine/File/.meta/plugin.meta.php new file mode 100644 index 0000000..ba141e1 --- /dev/null +++ b/Engine/File/.meta/plugin.meta.php @@ -0,0 +1,8 @@ + 'Engine', + 'name' => 'File', + 'version' => '20201012', + 'updateUrl' => '', +]; diff --git a/Engine/File/Bootstrap.php b/Engine/File/Bootstrap.php index 7bf82f7..dcc77db 100644 --- a/Engine/File/Bootstrap.php +++ b/Engine/File/Bootstrap.php @@ -15,9 +15,9 @@ class Bootstrap extends AbstractBootstrap { /** Bootstrap constructor. */ public function __construct() { - // $this->endpoints = [ - // Controllers\Api\FileController::class, - // ]; + $this->endpoints = [ + Controllers\Api\FileController::class, + ]; $this->services = [ 'file.access' => Services\FileAccessService::class, diff --git a/Engine/File/Controllers/Api/FileController.php b/Engine/File/Controllers/Api/FileController.php index 2ea0b6d..5703074 100644 --- a/Engine/File/Controllers/Api/FileController.php +++ b/Engine/File/Controllers/Api/FileController.php @@ -3,18 +3,18 @@ namespace Oforge\Engine\File\Controllers\Api; use Exception; -use Oforge\Engine\Core\Annotation\Endpoint\AssetBundlesMode; -use Oforge\Engine\Core\Annotation\Endpoint\EndpointAction; -use Oforge\Engine\Core\Annotation\Endpoint\EndpointClass; -use Oforge\Engine\Core\Controller\Traits\TraitInitializer; +use Oforge\Engine\Core\Annotations\Endpoint\AssetBundleMode; +use Oforge\Engine\Core\Annotations\Endpoint\EndpointAction; +use Oforge\Engine\Core\Annotations\Endpoint\EndpointClass; +use Oforge\Engine\Core\Traits\Controller\TraitInitializer; use Oforge\Engine\Core\Exceptions\ServiceNotFoundException; use Oforge\Engine\Core\Helper\ArrayHelper; use Oforge\Engine\Core\Helper\ResponseHelper; use Oforge\Engine\Core\Models\Endpoint\EndpointMethod; -use Oforge\Engine\Crud\Controller\Traits\CrudBaseTrait; -use Oforge\Engine\Crud\Controller\Traits\CrudBundleReadActionsTrait; -use Oforge\Engine\Crud\Enum\CrudDataAccessLevel; -use Oforge\Engine\Crud\Enum\CrudDataType; +use Oforge\Engine\Crud\Traits\Controller\CrudBaseTrait; +use Oforge\Engine\Crud\Traits\Controller\CrudBundleReadActionsTrait; +use Oforge\Engine\Crud\Enums\CrudDataAccessLevel; +use Oforge\Engine\Crud\Enums\CrudDataType; use Oforge\Engine\File\Exceptions\FileEntryNotFoundException; use Oforge\Engine\File\Exceptions\FileInUsageException; use Oforge\Engine\File\Models\File; @@ -26,14 +26,14 @@ * Class FileController * * @package Oforge\Engine\File\Controllers\Api - * @EndpointClass(path="/api/file", name="api_file", assetBundles=null, assetBundlesMode=AssetBundlesMode::NONE) + * @EndpointClass(path="/api/file", name="api_file", assetBundles=null, AssetBundleMode=AssetBundleMode::NONE) */ class FileController { use TraitInitializer, CrudBaseTrait, CrudBundleReadActionsTrait; /** FileController constructor. */ public function __construct() { - [AssetBundlesMode::class, EndpointAction::class, EndpointMethod::class];// Required for imports in nested traits + [AssetBundleMode::class, EndpointAction::class, EndpointMethod::class];// Required for imports in nested traits $this->model = File::class; @@ -83,7 +83,7 @@ public function __construct() { * @param Response $response * * @return Response - * @EndpointAction(path="[/]", method=EndpointMethod::POST, assetBundles="", assetBundlesMode=AssetBundlesMode::NONE) + * @EndpointAction(path="[/]", method=EndpointMethod::POST, assetBundles="", AssetBundleMode=AssetBundleMode::NONE) */ public function uploadAction(Request $request, Response $response) { /** @var FileManagementService $fileManagementService */ @@ -111,7 +111,7 @@ public function uploadAction(Request $request, Response $response) { foreach ($uploadedFiles as $uploadedFile) { try { $file = $fileManagementService->importUploadedFile($uploadedFile, $options); - $result[] = $this->prepareEntityDataArray($file, 'create'); + $result[] = $this->prepareOutputData($file, 'create'); } catch (Exception $exception) { $result[] = ['error' => $exception->getMessage()]; } @@ -127,7 +127,7 @@ public function uploadAction(Request $request, Response $response) { * @param array $args * * @return Response - * @EndpointAction(path="/{id}", method=EndpointMethod::DELETE, assetBundles="", assetBundlesMode=AssetBundlesMode::NONE) + * @EndpointAction(path="/{id}", method=EndpointMethod::DELETE, assetBundles="", AssetBundleMode=AssetBundleMode::NONE) */ public function deleteAction(Request $request, Response $response, array $args) { try { diff --git a/Engine/File/Services/AllowedFileMimeTypeService.php b/Engine/File/Services/AllowedFileMimeTypeService.php index 9f36362..b9dbf33 100644 --- a/Engine/File/Services/AllowedFileMimeTypeService.php +++ b/Engine/File/Services/AllowedFileMimeTypeService.php @@ -5,7 +5,7 @@ use Doctrine\ORM\ORMException; use Exception; use InvalidArgumentException; -use Oforge\Engine\Cache\Helper\Cache; +use Oforge\Engine\Cache\Managers\CacheManager; use Oforge\Engine\Cache\Lib\ArrayCache; use Oforge\Engine\Core\Abstracts\AbstractDatabaseAccess; use Oforge\Engine\Core\Exceptions\ConfigOptionKeyNotExistException; @@ -26,7 +26,7 @@ class AllowedFileMimeTypeService extends AbstractDatabaseAccess { /** AllowedFileMimeTypeService constructor. */ public function __construct() { parent::__construct(FileMimeType::class); - $this->cache = Cache::initArrayCache(); + $this->cache = CacheManager::initArrayCache(); } /** diff --git a/Engine/File/Services/FileAccessService.php b/Engine/File/Services/FileAccessService.php index 8e96ef9..85ab5c3 100644 --- a/Engine/File/Services/FileAccessService.php +++ b/Engine/File/Services/FileAccessService.php @@ -3,7 +3,7 @@ namespace Oforge\Engine\File\Services; use Oforge\Engine\Core\Abstracts\AbstractDatabaseAccess; -use Oforge\Engine\Crud\Service\GenericCrudService; +use Oforge\Engine\Crud\Services\GenericCrudService; use Oforge\Engine\File\Models\File; /** diff --git a/Engine/File/Services/FileManagementService.php b/Engine/File/Services/FileManagementService.php index 61a5d24..57743e3 100644 --- a/Engine/File/Services/FileManagementService.php +++ b/Engine/File/Services/FileManagementService.php @@ -10,7 +10,7 @@ use Oforge\Engine\Core\Helper\FileSystemHelper; use Oforge\Engine\Core\Helper\Statics; use Oforge\Engine\Core\Helper\StringHelper; -use Oforge\Engine\Core\Manager\Events\Event; +use Oforge\Engine\Core\Managers\Events\Event; use Oforge\Engine\File\Enums\FileTypeGroup; use Oforge\Engine\File\Exceptions\FileEntryNotFoundException; use Oforge\Engine\File\Exceptions\FileImportException; diff --git a/Engine/Image/.meta/.phpstorm.meta.php b/Engine/Image/.meta/.phpstorm.meta.php index 246e0d0..32629df 100644 --- a/Engine/Image/.meta/.phpstorm.meta.php +++ b/Engine/Image/.meta/.phpstorm.meta.php @@ -3,7 +3,7 @@ namespace PHPSTORM_META { if (function_exists('override')) { - override(\Oforge\Engine\Core\Manager\Services\ServiceManager::get(0), map([ + override(\Oforge\Engine\Core\Managers\Services\ServiceManager::get(0), map([ 'image' => \Oforge\Engine\Image\Services\ImageService::class, 'image.cleanup' => \Oforge\Engine\Image\Services\ImageCleanupService::class, ])); diff --git a/Engine/Image/.meta/plugin.meta.php b/Engine/Image/.meta/plugin.meta.php new file mode 100644 index 0000000..35494e4 --- /dev/null +++ b/Engine/Image/.meta/plugin.meta.php @@ -0,0 +1,8 @@ + 'Engine', + 'name' => 'Image', + 'version' => '20201015', + 'updateUrl' => '', +]; diff --git a/Engine/Image/Services/ImageCleanupService.php b/Engine/Image/Services/ImageCleanupService.php index 914f7d3..c1b49b5 100644 --- a/Engine/Image/Services/ImageCleanupService.php +++ b/Engine/Image/Services/ImageCleanupService.php @@ -3,7 +3,7 @@ namespace Oforge\Engine\Image\Services; use Oforge\Engine\Core\Helper\Statics; -use Oforge\Engine\Core\Manager\Events\Event; +use Oforge\Engine\Core\Managers\Events\Event; use Oforge\Engine\File\Enums\FileTypeGroup; use Oforge\Engine\File\Exceptions\FileEntryNotFoundException; use Oforge\Engine\File\Models\File; diff --git a/Engine/Image/Services/ImageService.php b/Engine/Image/Services/ImageService.php index 3f94a8d..9c3fb32 100644 --- a/Engine/Image/Services/ImageService.php +++ b/Engine/Image/Services/ImageService.php @@ -5,7 +5,7 @@ use Exception; use Oforge\Engine\Core\Exceptions\InvalidClassException; use Oforge\Engine\Core\Helper\FileHelper; -use Oforge\Engine\Core\Manager\Events\Event; +use Oforge\Engine\Core\Managers\Events\Event; use Oforge\Engine\Core\Services\ConfigService; use Oforge\Engine\File\Enums\FileTypeGroup; use Oforge\Engine\File\Enums\MimeType; diff --git a/Modules/CoreApi/Bootstrap.php b/Modules/CoreApi/Bootstrap.php index c6b791d..ffbeb76 100644 --- a/Modules/CoreApi/Bootstrap.php +++ b/Modules/CoreApi/Bootstrap.php @@ -16,7 +16,7 @@ class Bootstrap extends AbstractBootstrap { */ public function __construct() { $this->endpoints = [ - Controller\Api\KeyValueController::class, + Controllers\Api\KeyValueController::class, ]; } diff --git a/Modules/CoreApi/Controller/Api/KeyValueController.php b/Modules/CoreApi/Controllers/Api/KeyValueController.php similarity index 57% rename from Modules/CoreApi/Controller/Api/KeyValueController.php rename to Modules/CoreApi/Controllers/Api/KeyValueController.php index 375b73f..5daa94a 100644 --- a/Modules/CoreApi/Controller/Api/KeyValueController.php +++ b/Modules/CoreApi/Controllers/Api/KeyValueController.php @@ -1,30 +1,30 @@ model = KeyValue::class; diff --git a/doc/development/backend_crud_model.md b/doc/development/backend_crud_model.md index 86ea995..c431f26 100644 --- a/doc/development/backend_crud_model.md +++ b/doc/development/backend_crud_model.md @@ -4,7 +4,7 @@ The model **muss contains id property**. ## ViewController -Create a ViewController class that inherits from **Oforge\Engine\Modules\CRUD\Controller\Backend\BaseCrudController** and register it in Bootstrap. +Create a ViewController class that inherits from **Oforge\Engine\CRUD\Controller\Backend\BaseCrudController** and register it in Bootstrap. Now the properties **model** and **modelProperties** of the class have to be overwritten: