Merge branch 'master' of https://git.mcnd.ca/mcndave/lean
This commit is contained in:
		
						commit
						a9db9cd846
					
				| @ -1,6 +1,6 @@ | ||||
| { | ||||
|     "name": "mcnd/lean", | ||||
|     "description": "A more-than-micro framework for basic apps", | ||||
|     "description": "A micro framework for rapid application development (RAD)", | ||||
|     "type": "library", | ||||
|     "license": "MIT", | ||||
|     "authors": [ | ||||
| @ -21,38 +21,18 @@ | ||||
|         "laminas/laminas-httphandlerrunner": "2.5.x-dev", | ||||
|         "vlucas/phpdotenv": "^3.4@dev", | ||||
|         "middlewares/whoops": "dev-master", | ||||
|         "guzzlehttp/guzzle": "^7@dev", | ||||
|         "swiftmailer/swiftmailer": "^6.2@dev", | ||||
|         "mcnd/storage": "dev-master", | ||||
|         "mcnd/lean": "dev-master", | ||||
|         "mcnd/lean-console": "dev-master", | ||||
|         "mcnd/ulmus": "dev-master", | ||||
|         "mcnd/picea": "dev-master", | ||||
|         "mcnd/picea-ui": "dev-master", | ||||
|         "mcnd/cronard": "dev-master", | ||||
|         "mcnd/tell": "dev-master", | ||||
|         "mcnd/dump": "dev-master", | ||||
|         "mcnd/event": "dev-master", | ||||
|         "mcnd/notes-breadcrumb": "dev-master", | ||||
|         "mcnd/notes-cronard": "dev-master", | ||||
|         "mcnd/notes-event": "dev-master", | ||||
|         "mcnd/notes-tell": "dev-master", | ||||
|         "mcnd/notes-route": "dev-master", | ||||
|         "mcnd/notes-security": "dev-master", | ||||
|         "mcnd/ulmus-user": "dev-master", | ||||
|         "mcnd/thebugs": "dev-master", | ||||
|         "mcnd/taxus": "dev-master", | ||||
|         "mcnd/notes": "dev-master", | ||||
|         "psr/simple-cache": "*" | ||||
|     }, | ||||
|     "repositories": [ | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/lean-console.git" | ||||
|         }, | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/cronard.git" | ||||
|         }, | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/event.git" | ||||
| @ -69,46 +49,10 @@ | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/ulmus.git" | ||||
|         }, | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/ulmus-user.git" | ||||
|         }, | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/picea.git" | ||||
|         }, | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/picea-ui.git" | ||||
|         }, | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/notes.git" | ||||
|         }, | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/notes-route.git" | ||||
|         }, | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/notes-cronard.git" | ||||
|         }, | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/notes-security.git" | ||||
|         }, | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/notes-breadcrumb.git" | ||||
|         }, | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/notes-event.git" | ||||
|         }, | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/notes-tell.git" | ||||
|         }, | ||||
|         { | ||||
|             "type": "vcs", | ||||
|             "url": "https://git.mcnd.ca/mcndave/tell.git" | ||||
| @ -134,5 +78,24 @@ | ||||
|         "post-update-cmd": [ | ||||
|             "Lean\\Composer::postUpdate" | ||||
|         ] | ||||
|     }, | ||||
|     "extra" : { | ||||
|         "lean" : { | ||||
|             "autoload": { | ||||
|                 "definitions" : [ | ||||
|                     "meta/definitions/authorize.php", | ||||
|                     "meta/definitions/email.php", | ||||
|                     "meta/definitions/event.php", | ||||
|                     "meta/definitions/http.php", | ||||
|                     "meta/definitions/language.php", | ||||
|                     "meta/definitions/routes.php", | ||||
|                     "meta/definitions/software.php", | ||||
|                     "meta/definitions/template.php" | ||||
|                 ], | ||||
|                 "config": [ | ||||
|                     "meta/config.php" | ||||
|                 ] | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| } | ||||
							
								
								
									
										3
									
								
								meta/config.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								meta/config.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| <?php | ||||
| 
 | ||||
| return []; | ||||
| @ -1,33 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| use function DI\autowire, DI\create, DI\get; | ||||
| 
 | ||||
| use Psr\Http\Message\ResponseInterface; | ||||
| 
 | ||||
| use Mcnd\CLI\CliMiddleware; | ||||
| 
 | ||||
| use Notes\CLI\CommandFetcher; | ||||
| 
 | ||||
| use Lean\{ Factory, Lean }; | ||||
| 
 | ||||
| return [ | ||||
|     CommandFetcher::class => function($c) { | ||||
|         $fetcher = new CommandFetcher(null, null, $c->get('cli.caching')); | ||||
| 
 | ||||
|         $fetcher->setFolderList(array_map(function($item) { | ||||
|             return $item; | ||||
|         }, $c->get(Lean::class)->getCli())); | ||||
| 
 | ||||
|         return $fetcher; | ||||
|     }, | ||||
| 
 | ||||
|     CliMiddleware::class => function($c) { | ||||
|         return new CliMiddleware($c, $c->get('cli.response:default'), $c->get(CommandFetcher::class)); | ||||
|     }, | ||||
| 
 | ||||
|     'cli.response:default' => function($c) { | ||||
|         return function() { | ||||
|             return Factory\HttpFactory::createTextResponse("This is the default response from CLI middleware which indicates that no command were registered for this application.\n"); | ||||
|         }; | ||||
|     }, | ||||
| ]; | ||||
| @ -1,30 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| use function DI\autowire, DI\create, DI\get; | ||||
| 
 | ||||
| use Cronard\CronardMiddleware, | ||||
|     Notes\Cronard\TaskFetcher; | ||||
| 
 | ||||
| use Psr\Http\Message\ResponseInterface; | ||||
| 
 | ||||
| use Lean\{ Factory, Lean }; | ||||
| 
 | ||||
| return [ | ||||
|     CronardMiddleware::class => function($c) { | ||||
|         $cronardMiddleware = new CronardMiddleware($c, getenv('CRON_KEY'), function() : ResponseInterface { | ||||
|             return Factory\HttpFactory::createHtmlResponse(sprintf("%s - cron task begin...", date('Y-m-d H:i:s'))); | ||||
|         }, []); | ||||
| 
 | ||||
|         return $cronardMiddleware->fromFile(getenv("META_PATH")."/crontab.php")->fromAnnotations($c->get(TaskFetcher::class)); | ||||
|     }, | ||||
| 
 | ||||
|     TaskFetcher::class => function($c) { | ||||
|         $fetcher = new TaskFetcher(null, null, $c->get('cronard.caching')); | ||||
| 
 | ||||
|         $fetcher->setFolderList(array_map(function($item) { | ||||
|             return $item; | ||||
|         }, $c->get(Lean::class)->getCronard())); | ||||
| 
 | ||||
|         return $fetcher; | ||||
|     }, | ||||
| ]; | ||||
| @ -24,12 +24,18 @@ return [ | ||||
|     }, | ||||
| 
 | ||||
|     Event\EventDefinition::class => function($c) { | ||||
|         $ext = $c->has(\Picea\Extension\UrlExtension::class) ? $c->get(\Picea\Extension\UrlExtension::class) : null; | ||||
| 
 | ||||
|         return new Event\EventDefinition([ | ||||
|             new class() implements RoutingCompileRoutes { | ||||
|             new class($ext) implements RoutingCompileRoutes { | ||||
|                 public function __construct( | ||||
|                     protected ? \Picea\Extension\UrlExtension $extension, | ||||
|                 ) {} | ||||
| 
 | ||||
|                 public function execute(Routing $routing, Route $attribute) : void | ||||
|                 { | ||||
|                     if (null !== ($name = $attribute->name ?? null)) { | ||||
|                         $routing->extension->registerRoute($name, $attribute->getRoute(), $attribute->class, $attribute->classMethod, $attribute->methods ?? (array)$attribute->method); | ||||
|                         $this->extension->registerRoute($name, $attribute->getRoute(), $attribute->class, $attribute->classMethod, $attribute->methods ?? (array)$attribute->method); | ||||
|                     } | ||||
|                 } | ||||
|             }, | ||||
| @ -45,16 +51,21 @@ return [ | ||||
| 
 | ||||
|                     # Checking if user needs to be logged
 | ||||
|                     if ( $container->has(SecurityHandler::class) ){ | ||||
|                         if ( $redirect = $container->get(SecurityHandler::class)->verify($class, $method) ) { | ||||
|                         $securityHandler = $container->get(SecurityHandler::class); | ||||
| 
 | ||||
|                         if ( $redirect = $securityHandler->verify($class, $method) ) { | ||||
|                             if ( empty($object->user) || ! $object->user->logged ) { | ||||
|                                 $routing->session->set('redirectedFrom', (string) $request->getUri()); | ||||
|                                 if ($container->has(Session::class)) { | ||||
|                                     $container->get(Session::class)->set('redirectedFrom', (string)$request->getUri()); | ||||
|                                 } | ||||
| 
 | ||||
|                                 $routing->response = $redirect; | ||||
| 
 | ||||
|                                 return; | ||||
|                             } | ||||
|                         } | ||||
| 
 | ||||
|                         if ( $container->has(Taxus::class) ) { | ||||
|                         if ( $securityHandler->isLocked($class, $method) && $container->has(Taxus::class) ) { | ||||
|                             if ( $forbidden = $container->get(SecurityHandler::class)->taxus($class, $method, $object->user ?? null) ) { | ||||
|                                 $routing->response = $forbidden; | ||||
| 
 | ||||
|  | ||||
| @ -19,7 +19,6 @@ return [ | ||||
|         return $i18n; | ||||
|     }, | ||||
| 
 | ||||
|     # TODO -- accept folders from Lean Apps
 | ||||
|     Tell\Reader\PhpReader::class => function($c) { | ||||
|         return new Tell\Reader\PhpReader($c->get(Lean\Lean::class)->getI18n('php'), false); | ||||
|     }, | ||||
|  | ||||
| @ -1,12 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| use function DI\autowire, DI\create, DI\get; | ||||
| 
 | ||||
| use Negundo\Client\{ SoftwareConfig, Dump, Task, NegundoMiddleware }; | ||||
| 
 | ||||
| return [ | ||||
|     SoftwareConfig::class => create(SoftwareConfig::class)->constructor(getenv('NEGUNDO_HASH'), getenv('NEGUNDO_SERVER')), | ||||
|     NegundoMiddleware::class => autowire(NegundoMiddleware::class), | ||||
|     Dump::class => autowire(Dump::class), | ||||
|     Task::class => autowire(Task::class), | ||||
| ]; | ||||
| @ -1,22 +0,0 @@ | ||||
| <?php | ||||
| 
 | ||||
| use function DI\autowire, DI\create, DI\get; | ||||
| 
 | ||||
| use Storage\Session; | ||||
| 
 | ||||
| use Taxus\{ Privilege, Taxus, PermissionGrantInterface, DefaultPermissionGrant }; | ||||
| 
 | ||||
| use Psr\Http\Message\ServerRequestInterface; | ||||
| 
 | ||||
| return [ | ||||
|     Taxus::class => function ($c) { | ||||
|         return ( new Taxus( $c->get(PermissionGrantInterface::class) ) )->add( | ||||
|             [ new Privilege("dev", "Is a developper of this application."), "is_dev" ], | ||||
|             [ new Privilege("admin", "Can manage mostly everything from this application."), "is_admin" ], | ||||
|             [ new Privilege("user", "Is an authenticated user."), "is_user" ], | ||||
|             [ new Privilege("anonymous", "Is an anonymous (unauthenticated) user."), "is_anonymous" ], | ||||
|         ); | ||||
|     }, | ||||
| 
 | ||||
|     PermissionGrantInterface::class => create(DefaultPermissionGrant::class)->constructor(get(ServerRequestInterface::class), get(Session::class)), | ||||
| ]; | ||||
| @ -64,6 +64,8 @@ return [ | ||||
|         'routes' => [], | ||||
| 
 | ||||
|         'cronard' => [], | ||||
| 
 | ||||
|         'taxus' => [], | ||||
|     ], | ||||
| 
 | ||||
|     Lean::class => autowire(Lean::class), | ||||
|  | ||||
							
								
								
									
										12
									
								
								meta/definitions/storage.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								meta/definitions/storage.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| <?php | ||||
| 
 | ||||
| use Ulmus\ConnectionAdapter; | ||||
| 
 | ||||
| return [ | ||||
|     'lean:adapter.sqlite' => function($c) { | ||||
|         $adapter = new ConnectionAdapter('sqlite', $c->get('config')['ulmus'], true); | ||||
|         $adapter->resolveConfiguration(); | ||||
| 
 | ||||
|         return $adapter; | ||||
|     } | ||||
| ]; | ||||
| @ -2,68 +2,13 @@ | ||||
| 
 | ||||
| use function DI\autowire, DI\create, DI\get; | ||||
| 
 | ||||
| use Picea\{ | ||||
|     Language\LanguageRegistration, | ||||
|     Caching\Cache, | ||||
|     Caching\Opcache, | ||||
|     Compiler, | ||||
|     Compiler\Context, | ||||
|     Compiler\BaseContext, | ||||
|     FileFetcher, | ||||
|     Method\Request}; | ||||
| use Picea\{ Language\LanguageRegistration, }; | ||||
| 
 | ||||
| use Picea\Extension\{ LanguageHandlerInterface, LanguageExtension, TitleExtension, NumberExtension, UrlExtension }; | ||||
| use Picea\Extension\{ LanguageHandlerInterface, }; | ||||
| 
 | ||||
| use Picea\Ui\{ Method, Ui }; | ||||
| use Picea\Ui\{ Ui }; | ||||
| 
 | ||||
| return [ | ||||
|     Picea\Picea::class => function($c) { | ||||
|         return new Picea\Picea($c->get(Context::class), $c->get(Cache::class), $c->get(Compiler::class), null, $c->get(FileFetcher::class), null, getenv("DEBUG")); | ||||
|     }, | ||||
| 
 | ||||
|     Context::class => function($c) { | ||||
|         return new BaseContext($c->get(Lean\Lean::class)->getPiceaContext()); | ||||
|     }, | ||||
| 
 | ||||
|     Ui::class => autowire(Ui::class), | ||||
| 
 | ||||
|     Compiler::class => autowire(Compiler::class), | ||||
| 
 | ||||
|     Request::class => autowire(Request::class), | ||||
| 
 | ||||
|     Method\Form::class => autowire(Method\Form::class), | ||||
| 
 | ||||
|     Method\Pagination::class => autowire(Method\Pagination::class), | ||||
| 
 | ||||
|     LanguageExtension::class => create(LanguageExtension::class)->constructor(get(LanguageHandlerInterface::class)), | ||||
| 
 | ||||
|     LanguageHandlerInterface::class => autowire(\Lean\LanguageHandler::class), | ||||
| 
 | ||||
|     LanguageRegistration::class => create(\Lean\PiceaDefaultRegistration::class)->constructor(get('picea.extensions'), [], [], get(Ui::class), null), | ||||
| 
 | ||||
|     'picea.extensions' => function(\Psr\Container\ContainerInterface $c) { | ||||
|         return array_merge([ | ||||
|             $c->get(LanguageExtension::class), | ||||
|             $c->get(TitleExtension::class), | ||||
|             $c->get(NumberExtension::class), | ||||
|             $c->get(UrlExtension::class), | ||||
|             $c->get(Method\Form::class), | ||||
|             $c->get(Method\Pagination::class), | ||||
|             $c->get(Request::class), | ||||
|         ], class_exists(\Taxus\Picea\Extension::class) ? [ $c->get(\Taxus\Picea\Extension::class) ] : [], | ||||
|             array_map(fn($class) => $c->get($class), $c->get(Lean\Lean::class)->getPiceaExtensions()) | ||||
|         ); | ||||
|     }, | ||||
| 
 | ||||
|     TitleExtension::class => autowire(TitleExtension::class), | ||||
| 
 | ||||
|     NumberExtension::class => autowire(NumberExtension::class), | ||||
| 
 | ||||
|     UrlExtension::class => create(UrlExtension::class)->constructor(getenv("URL_BASE"), get('git.commit'), explode(',', getenv('APP_URL')), (bool) getenv('FORCE_SSL')), | ||||
| 
 | ||||
|     Cache::class => create(Opcache::class)->constructor(getenv("CACHE_PATH"), get(Context::class)), | ||||
| 
 | ||||
|     FileFetcher::class => function($c) { | ||||
|         return new FileFetcher($c->get(Lean\Lean::class)->getViewPaths()); | ||||
|     }, | ||||
| ]; | ||||
| @ -23,6 +23,12 @@ DEFAULT_TIME = "fr.UTF-8" | ||||
| DEFAULT_TIME_FALLBACK = "french.UTF-8" | ||||
| 
 | ||||
| # Database | ||||
| #SQLITE_PATH = "var/home.sqlite3" | ||||
| #SQLITE_ADAPTER = "SQLite" | ||||
| #SQLITE_PRAGMA_BEGIN = "foreign_keys=ON,synchronous=NORMAL" | ||||
| #SQLITE_PRAGMA_DEBUG_BEGIN = "journal_mode=WAL" | ||||
| #SQLITE_PRAGMA_CLOSE = "analysis_limit=500,optimize" | ||||
| 
 | ||||
| DATABASE_PORT = "" | ||||
| DATABASE_HOST = "" | ||||
| DATABASE_NAME = "" | ||||
|  | ||||
| @ -1,12 +1,12 @@ | ||||
| <?php | ||||
| 
 | ||||
| use Taxus\Privilege; | ||||
| 
 | ||||
| use function DI\autowire, DI\create, DI\get; | ||||
| 
 | ||||
| $dir = getenv("META_PATH") . "/definitions"; | ||||
| 
 | ||||
| return array_merge( | ||||
|     Lean\Lean::definitions(), | ||||
| 
 | ||||
|     Lean\Lean::autoloadDefinitionsFromComposerExtra(), | ||||
| 
 | ||||
|     [ | ||||
| @ -15,7 +15,6 @@ return array_merge( | ||||
|                 'context' => "%ESCAPED_NAMESPACE%\\View", | ||||
|                 'asset' => [], | ||||
|                 'extensions' => [], | ||||
| 
 | ||||
|             ], | ||||
| 
 | ||||
|             'ulmus' => [ | ||||
| @ -37,6 +36,13 @@ return array_merge( | ||||
|             'cli' => [ | ||||
|                 '%ESCAPED_NAMESPACE%\\Controller' => implode(DIRECTORY_SEPARATOR, [ getenv("PROJECT_PATH"), 'src', 'Controller', '' ]), | ||||
|             ], | ||||
| 
 | ||||
|             'taxus' => [ | ||||
|                 [ new Privilege("dev", "Is a developper of this application."), "is_dev" ], | ||||
|                 [ new Privilege("admin", "Can manage mostly everything from this application."), "is_admin" ], | ||||
|                 [ new Privilege("user", "Is an authenticated user."), "is_user" ], | ||||
|                 [ new Privilege("anonymous", "Is an anonymous (unauthenticated) user."), "is_anonymous" ], | ||||
|             ] | ||||
|         ], | ||||
| 
 | ||||
|         'app.middlewares' => [], | ||||
|  | ||||
| @ -11,10 +11,7 @@ use function DI\autowire, DI\create, DI\get; | ||||
| return [ | ||||
|     Taxus::class => function ($c) { | ||||
|         return ( new Taxus( $c->get(PermissionGrantInterface::class) ) )->add( | ||||
|             [ new Privilege("dev", "Is a developper of this application."), "is_dev" ], | ||||
|             [ new Privilege("admin", "Can manage mostly everything from this application."), "is_admin" ], | ||||
|             [ new Privilege("user", "Is an authenticated user."), "is_user" ], | ||||
|             [ new Privilege("anonymous", "Is an anonymous (unauthenticated) user."), "is_anonymous" ], | ||||
|             $c->get(Lean\Lean::class)->getTaxusPrivileges() | ||||
|         ); | ||||
|     }, | ||||
| 
 | ||||
|  | ||||
| @ -19,6 +19,7 @@ return [ | ||||
| 
 | ||||
|     AdapterProxy::class => function (ContainerInterface $c) { | ||||
|         return new AdapterProxy( | ||||
|             $c->get('lean:adapter.sqlite'), | ||||
|             $c->get(ConnectionAdapter::class) | ||||
|         ); | ||||
|     }, | ||||
|  | ||||
| @ -28,6 +28,8 @@ class Application | ||||
| 
 | ||||
|     public array $tellPhp; | ||||
| 
 | ||||
|     public array $taxus; | ||||
| 
 | ||||
|     public array $data = []; | ||||
| 
 | ||||
|     public function __construct(string $name) { | ||||
| @ -38,7 +40,14 @@ class Application | ||||
|     { | ||||
|         $this->data = array_replace($this->data, $data); | ||||
| 
 | ||||
|         if (is_array($picea = $data['picea'] ?? false)) { | ||||
|         $this->loadData(); | ||||
| 
 | ||||
|         return $this; | ||||
|     } | ||||
| 
 | ||||
|     public function loadData() : static | ||||
|     { | ||||
|         if (is_array($picea = $this->data['picea'] ?? false)) { | ||||
|             if ($picea['context'] ?? false ) { | ||||
|                 $this->piceaContext = $picea['context']; | ||||
|             } | ||||
| @ -56,13 +65,13 @@ class Application | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (is_array($ulmus = $data['ulmus'] ?? false)) { | ||||
|         if (is_array($ulmus = $this->data['ulmus'] ?? false)) { | ||||
|             if ($ulmus['entities'] ?? false) { | ||||
|                 $this->entities = $ulmus['entities']; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (is_array($tell = $data['tell'] ?? false)) { | ||||
|         if (is_array($tell = $this->data['tell'] ?? false)) { | ||||
|             if ($tell['json'] ?? false) { | ||||
|                 $this->tellJson = $tell['json']; | ||||
|             } | ||||
| @ -72,20 +81,24 @@ class Application | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (is_array($data['routes'] ?? false)) { | ||||
|             $this->routes = $data['routes']; | ||||
|         if (is_array($this->data['routes'] ?? false)) { | ||||
|             $this->routes = $this->data['routes']; | ||||
|         } | ||||
| 
 | ||||
|         if (is_array($data['cronard'] ?? false)) { | ||||
|             $this->cronard = $data['cronard']; | ||||
|         if (is_array($this->data['cronard'] ?? false)) { | ||||
|             $this->cronard = $this->data['cronard']; | ||||
|         } | ||||
| 
 | ||||
|         if (is_array($data['events'] ?? false)) { | ||||
|             $this->events = $data['events']; | ||||
|         if (is_array($this->data['events'] ?? false)) { | ||||
|             $this->events = $this->data['events']; | ||||
|         } | ||||
| 
 | ||||
|         if (is_array($data['cli'] ?? false)) { | ||||
|             $this->cli = $data['cli']; | ||||
|         if (is_array($this->data['cli'] ?? false)) { | ||||
|             $this->cli = $this->data['cli']; | ||||
|         } | ||||
| 
 | ||||
|         if (is_array($this->data['taxus'] ?? false)) { | ||||
|             $this->taxus = $this->data['taxus']; | ||||
|         } | ||||
| 
 | ||||
|         return $this; | ||||
|  | ||||
| @ -13,8 +13,8 @@ use Psr\Http\Message\{ ServerRequestInterface, ResponseInterface }; | ||||
| 
 | ||||
| use function file_get_contents; | ||||
| 
 | ||||
| #[Security(locked: true)]
 | ||||
| #[Route(method: [ "GET", "POST", "DELETE" ])]
 | ||||
| #[Security(locked: true, realm: "Protected Area")]
 | ||||
| #[Route(method: [ "GET", "POST" ])]
 | ||||
| trait ControllerTrait { | ||||
|     public ? \Notes\Breadcrumb\Breadcrumb $breadcrumb; | ||||
| 
 | ||||
|  | ||||
| @ -4,10 +4,16 @@ namespace Lean\Factory; | ||||
| 
 | ||||
| use Laminas\Diactoros\Response\{EmptyResponse, HtmlResponse, JsonResponse, RedirectResponse, TextResponse}; | ||||
| use Lean\Response\{ DownloadResponse, ImageResponse, FileDownloadResponse, PdfResponse }; | ||||
| use Laminas\Diactoros\Response; | ||||
| use Psr\Http\Message\ResponseInterface; | ||||
| 
 | ||||
| class HttpFactory | ||||
| { | ||||
|     public static function createResponse(string $url, int $code = 302, array $headers = []) : ResponseInterface | ||||
|     { | ||||
|         return new Response($url, $code, $headers); | ||||
|     } | ||||
| 
 | ||||
|     public static function createRedirectResponse(string $url, int $code = 302, array $headers = []) : ResponseInterface | ||||
|     { | ||||
|         return new RedirectResponse($url, $code, $headers); | ||||
|  | ||||
							
								
								
									
										25
									
								
								src/Lean.php
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								src/Lean.php
									
									
									
									
									
								
							| @ -93,6 +93,11 @@ class Lean | ||||
|         return array_merge(...array_map(fn($app) => $app->events ?? [], $this->applications)); | ||||
|     } | ||||
| 
 | ||||
|     public function getTaxusPrivileges() : array | ||||
|     { | ||||
|         return array_merge(...array_map(fn($app) => $app->taxus ?? [], $this->applications)); | ||||
|     } | ||||
| 
 | ||||
|     public function getEntities() : array | ||||
|     { | ||||
|         return array_merge(...array_map(fn($app) => $app->entities ?? [], $this->applications)); | ||||
| @ -150,24 +155,10 @@ class Lean | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     #[\Deprecated("Definitions are now loaded automatically from composer extra array.")]
 | ||||
|     public static function definitions() : array | ||||
|     { | ||||
|         $path = dirname(__DIR__) . "/meta/definitions/"; | ||||
| 
 | ||||
|         return array_merge( | ||||
|         require($path . "authorize.php"), | ||||
|             class_exists(\Mcnd\CLI\CliMiddleware::class) ? require($path . "cli.php") : [], | ||||
|             class_exists(\Cronard\CronardMiddleware::class) ? require($path . "cronard.php") : [], | ||||
|             require($path . "email.php"), | ||||
|             require($path . "event.php"), | ||||
|             require($path . "http.php"), | ||||
|             require($path . "language.php"), | ||||
|             class_exists(\Negundo\Client\NegundoMiddleware::class) ? require($path . "negundo.php") : [], | ||||
|             require($path . "routes.php"), | ||||
|             # require($path . "security.php"),
 | ||||
|             require($path . "software.php"), | ||||
|             class_exists(\Picea\Picea::class) ?  require($path . "template.php") : [], | ||||
|         ); | ||||
|         return []; | ||||
|     } | ||||
| 
 | ||||
|     public static function autoloadDefinitionsFromComposerExtra() : array | ||||
| @ -218,4 +209,4 @@ class Lean | ||||
| 
 | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
| } | ||||
|  | ||||
| @ -2,9 +2,6 @@ | ||||
| 
 | ||||
| namespace Lean; | ||||
| 
 | ||||
| use Notes\Annotation; | ||||
| use Taxus\Taxus; | ||||
| 
 | ||||
| use League\Route\RouteGroup, | ||||
|     League\Route\Router; | ||||
| 
 | ||||
| @ -14,55 +11,33 @@ use Psr\Http\Message\ServerRequestInterface, | ||||
| 
 | ||||
| use Notes\Route\RouteFetcher; | ||||
| 
 | ||||
| use Notes\Security\SecurityHandler; | ||||
| 
 | ||||
| use Notes\Tell\LanguageHandler; | ||||
| 
 | ||||
| use Picea\Picea, | ||||
|     Picea\Extension\UrlExtension; | ||||
| 
 | ||||
| use Storage\Cookie, | ||||
|     Storage\Session; | ||||
| 
 | ||||
| use Mcnd\Event\EventManager; | ||||
| 
 | ||||
| use function DI\autowire, DI\create; | ||||
| 
 | ||||
| class Routing { | ||||
| 
 | ||||
|     public Annotation $selectedRoute; | ||||
| 
 | ||||
|     public ResponseInterface $response; | ||||
| 
 | ||||
|     public function __construct( | ||||
|         public Session $session, | ||||
|         public Cookie $cookie, | ||||
|         public UrlExtension $extension, | ||||
|         public Router $router, | ||||
|         public RouteFetcher $fetcher, | ||||
|         public SecurityHandler $security, | ||||
|         public LanguageHandler $language, | ||||
|         public Taxus $taxus, | ||||
|         public EventManager $eventManager, | ||||
|     ) { } | ||||
| 
 | ||||
|     public function registerRoute(ContainerInterface $container, string $urlBase) { | ||||
|         $this->router->group(rtrim($urlBase, "/"), function (RouteGroup $route) use ($container) { | ||||
|             foreach($this->fetcher->compile() as $annotation) { | ||||
|                 $this->eventManager->execute(Event\RoutingCompileRoutes::class, $this, $annotation); | ||||
|             foreach($this->fetcher->compile() as $attribute) { | ||||
|                 $this->eventManager->execute(Event\RoutingCompileRoutes::class, $this, $attribute); | ||||
| 
 | ||||
|                 /* @deprecated annotation->method will become standard when using native attributes */ | ||||
|                 foreach((array) ( $annotation->method ?? $annotation->methods ) as $method) { | ||||
|                     # Mapping every URLs from annotations in searched folders (Api, Controller, etc...)
 | ||||
|                     $route->map(strtoupper($method), $annotation->getRoute(), function (ServerRequestInterface $request, array $arguments) use ( | ||||
|                         $container, $route, $annotation | ||||
|                     ) : ResponseInterface | ||||
|                     { | ||||
|                         $class = $annotation->class;     | ||||
|                         $method = $annotation->classMethod; | ||||
|                 # Mapping every URLs from attributes in searched folders (Api, Controller, etc...)
 | ||||
|                 foreach((array) $attribute->method as $method) { | ||||
|                     $route->map(strtoupper($method), $attribute->getRoute(), function (ServerRequestInterface $request, array $arguments) use ( | ||||
|                         $container, $route, $attribute | ||||
|                     ) : ResponseInterface { | ||||
|                         $class = $attribute->class;     | ||||
|                         $method = $attribute->classMethod; | ||||
|                         $object = $container->get($class); | ||||
| 
 | ||||
|                         $this->eventManager->execute(Event\RoutingMapRoutes::class, $this, $container, $request, $annotation); | ||||
|                         $this->eventManager->execute(Event\RoutingMapRoutes::class, $this, $container, $request, $attribute); | ||||
| 
 | ||||
|                         $container->set(ServerRequestInterface::class, $request); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user