Merge branch 'master' of https://git.mcnd.ca/mcndave/lean
This commit is contained in:
		
						commit
						a9db9cd846
					
				| @ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "mcnd/lean", |     "name": "mcnd/lean", | ||||||
|     "description": "A more-than-micro framework for basic apps", |     "description": "A micro framework for rapid application development (RAD)", | ||||||
|     "type": "library", |     "type": "library", | ||||||
|     "license": "MIT", |     "license": "MIT", | ||||||
|     "authors": [ |     "authors": [ | ||||||
| @ -21,38 +21,18 @@ | |||||||
|         "laminas/laminas-httphandlerrunner": "2.5.x-dev", |         "laminas/laminas-httphandlerrunner": "2.5.x-dev", | ||||||
|         "vlucas/phpdotenv": "^3.4@dev", |         "vlucas/phpdotenv": "^3.4@dev", | ||||||
|         "middlewares/whoops": "dev-master", |         "middlewares/whoops": "dev-master", | ||||||
|         "guzzlehttp/guzzle": "^7@dev", |  | ||||||
|         "swiftmailer/swiftmailer": "^6.2@dev", |  | ||||||
|         "mcnd/storage": "dev-master", |         "mcnd/storage": "dev-master", | ||||||
|         "mcnd/lean": "dev-master", |  | ||||||
|         "mcnd/lean-console": "dev-master", |         "mcnd/lean-console": "dev-master", | ||||||
|         "mcnd/ulmus": "dev-master", |         "mcnd/ulmus": "dev-master", | ||||||
|         "mcnd/picea": "dev-master", |  | ||||||
|         "mcnd/picea-ui": "dev-master", |  | ||||||
|         "mcnd/cronard": "dev-master", |  | ||||||
|         "mcnd/tell": "dev-master", |         "mcnd/tell": "dev-master", | ||||||
|         "mcnd/dump": "dev-master", |         "mcnd/dump": "dev-master", | ||||||
|         "mcnd/event": "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/thebugs": "dev-master", | ||||||
|         "mcnd/taxus": "dev-master", |         "mcnd/taxus": "dev-master", | ||||||
|  |         "mcnd/notes": "dev-master", | ||||||
|         "psr/simple-cache": "*" |         "psr/simple-cache": "*" | ||||||
|     }, |     }, | ||||||
|     "repositories": [ |     "repositories": [ | ||||||
|         { |  | ||||||
|             "type": "vcs", |  | ||||||
|             "url": "https://git.mcnd.ca/mcndave/lean-console.git" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|             "type": "vcs", |  | ||||||
|             "url": "https://git.mcnd.ca/mcndave/cronard.git" |  | ||||||
|         }, |  | ||||||
|         { |         { | ||||||
|             "type": "vcs", |             "type": "vcs", | ||||||
|             "url": "https://git.mcnd.ca/mcndave/event.git" |             "url": "https://git.mcnd.ca/mcndave/event.git" | ||||||
| @ -69,46 +49,10 @@ | |||||||
|             "type": "vcs", |             "type": "vcs", | ||||||
|             "url": "https://git.mcnd.ca/mcndave/ulmus.git" |             "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", |             "type": "vcs", | ||||||
|             "url": "https://git.mcnd.ca/mcndave/notes.git" |             "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", |             "type": "vcs", | ||||||
|             "url": "https://git.mcnd.ca/mcndave/tell.git" |             "url": "https://git.mcnd.ca/mcndave/tell.git" | ||||||
| @ -134,5 +78,24 @@ | |||||||
|         "post-update-cmd": [ |         "post-update-cmd": [ | ||||||
|             "Lean\\Composer::postUpdate" |             "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) { |     Event\EventDefinition::class => function($c) { | ||||||
|  |         $ext = $c->has(\Picea\Extension\UrlExtension::class) ? $c->get(\Picea\Extension\UrlExtension::class) : null; | ||||||
|  | 
 | ||||||
|         return new Event\EventDefinition([ |         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 |                 public function execute(Routing $routing, Route $attribute) : void | ||||||
|                 { |                 { | ||||||
|                     if (null !== ($name = $attribute->name ?? null)) { |                     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
 |                     # Checking if user needs to be logged
 | ||||||
|                     if ( $container->has(SecurityHandler::class) ){ |                     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 ) { |                             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; |                                 $routing->response = $redirect; | ||||||
| 
 | 
 | ||||||
|                                 return; |                                 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) ) { |                             if ( $forbidden = $container->get(SecurityHandler::class)->taxus($class, $method, $object->user ?? null) ) { | ||||||
|                                 $routing->response = $forbidden; |                                 $routing->response = $forbidden; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -19,7 +19,6 @@ return [ | |||||||
|         return $i18n; |         return $i18n; | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|     # TODO -- accept folders from Lean Apps
 |  | ||||||
|     Tell\Reader\PhpReader::class => function($c) { |     Tell\Reader\PhpReader::class => function($c) { | ||||||
|         return new Tell\Reader\PhpReader($c->get(Lean\Lean::class)->getI18n('php'), false); |         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' => [], |         'routes' => [], | ||||||
| 
 | 
 | ||||||
|         'cronard' => [], |         'cronard' => [], | ||||||
|  | 
 | ||||||
|  |         'taxus' => [], | ||||||
|     ], |     ], | ||||||
| 
 | 
 | ||||||
|     Lean::class => autowire(Lean::class), |     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 function DI\autowire, DI\create, DI\get; | ||||||
| 
 | 
 | ||||||
| use Picea\{ | use Picea\{ Language\LanguageRegistration, }; | ||||||
|     Language\LanguageRegistration, |  | ||||||
|     Caching\Cache, |  | ||||||
|     Caching\Opcache, |  | ||||||
|     Compiler, |  | ||||||
|     Compiler\Context, |  | ||||||
|     Compiler\BaseContext, |  | ||||||
|     FileFetcher, |  | ||||||
|     Method\Request}; |  | ||||||
| 
 | 
 | ||||||
| use Picea\Extension\{ LanguageHandlerInterface, LanguageExtension, TitleExtension, NumberExtension, UrlExtension }; | use Picea\Extension\{ LanguageHandlerInterface, }; | ||||||
| 
 | 
 | ||||||
| use Picea\Ui\{ Method, Ui }; | use Picea\Ui\{ Ui }; | ||||||
| 
 | 
 | ||||||
| return [ | 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), |     LanguageHandlerInterface::class => autowire(\Lean\LanguageHandler::class), | ||||||
| 
 |  | ||||||
|     LanguageRegistration::class => create(\Lean\PiceaDefaultRegistration::class)->constructor(get('picea.extensions'), [], [], get(Ui::class), null), |     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" | DEFAULT_TIME_FALLBACK = "french.UTF-8" | ||||||
| 
 | 
 | ||||||
| # Database | # 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_PORT = "" | ||||||
| DATABASE_HOST = "" | DATABASE_HOST = "" | ||||||
| DATABASE_NAME = "" | DATABASE_NAME = "" | ||||||
|  | |||||||
| @ -1,12 +1,12 @@ | |||||||
| <?php | <?php | ||||||
| 
 | 
 | ||||||
|  | use Taxus\Privilege; | ||||||
|  | 
 | ||||||
| use function DI\autowire, DI\create, DI\get; | use function DI\autowire, DI\create, DI\get; | ||||||
| 
 | 
 | ||||||
| $dir = getenv("META_PATH") . "/definitions"; | $dir = getenv("META_PATH") . "/definitions"; | ||||||
| 
 | 
 | ||||||
| return array_merge( | return array_merge( | ||||||
|     Lean\Lean::definitions(), |  | ||||||
| 
 |  | ||||||
|     Lean\Lean::autoloadDefinitionsFromComposerExtra(), |     Lean\Lean::autoloadDefinitionsFromComposerExtra(), | ||||||
| 
 | 
 | ||||||
|     [ |     [ | ||||||
| @ -15,7 +15,6 @@ return array_merge( | |||||||
|                 'context' => "%ESCAPED_NAMESPACE%\\View", |                 'context' => "%ESCAPED_NAMESPACE%\\View", | ||||||
|                 'asset' => [], |                 'asset' => [], | ||||||
|                 'extensions' => [], |                 'extensions' => [], | ||||||
| 
 |  | ||||||
|             ], |             ], | ||||||
| 
 | 
 | ||||||
|             'ulmus' => [ |             'ulmus' => [ | ||||||
| @ -37,6 +36,13 @@ return array_merge( | |||||||
|             'cli' => [ |             'cli' => [ | ||||||
|                 '%ESCAPED_NAMESPACE%\\Controller' => implode(DIRECTORY_SEPARATOR, [ getenv("PROJECT_PATH"), 'src', 'Controller', '' ]), |                 '%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' => [], |         'app.middlewares' => [], | ||||||
|  | |||||||
| @ -11,10 +11,7 @@ use function DI\autowire, DI\create, DI\get; | |||||||
| return [ | return [ | ||||||
|     Taxus::class => function ($c) { |     Taxus::class => function ($c) { | ||||||
|         return ( new Taxus( $c->get(PermissionGrantInterface::class) ) )->add( |         return ( new Taxus( $c->get(PermissionGrantInterface::class) ) )->add( | ||||||
|             [ new Privilege("dev", "Is a developper of this application."), "is_dev" ], |             $c->get(Lean\Lean::class)->getTaxusPrivileges() | ||||||
|             [ 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" ], |  | ||||||
|         ); |         ); | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -19,6 +19,7 @@ return [ | |||||||
| 
 | 
 | ||||||
|     AdapterProxy::class => function (ContainerInterface $c) { |     AdapterProxy::class => function (ContainerInterface $c) { | ||||||
|         return new AdapterProxy( |         return new AdapterProxy( | ||||||
|  |             $c->get('lean:adapter.sqlite'), | ||||||
|             $c->get(ConnectionAdapter::class) |             $c->get(ConnectionAdapter::class) | ||||||
|         ); |         ); | ||||||
|     }, |     }, | ||||||
|  | |||||||
| @ -28,6 +28,8 @@ class Application | |||||||
| 
 | 
 | ||||||
|     public array $tellPhp; |     public array $tellPhp; | ||||||
| 
 | 
 | ||||||
|  |     public array $taxus; | ||||||
|  | 
 | ||||||
|     public array $data = []; |     public array $data = []; | ||||||
| 
 | 
 | ||||||
|     public function __construct(string $name) { |     public function __construct(string $name) { | ||||||
| @ -38,7 +40,14 @@ class Application | |||||||
|     { |     { | ||||||
|         $this->data = array_replace($this->data, $data); |         $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 ) { |             if ($picea['context'] ?? false ) { | ||||||
|                 $this->piceaContext = $picea['context']; |                 $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) { |             if ($ulmus['entities'] ?? false) { | ||||||
|                 $this->entities = $ulmus['entities']; |                 $this->entities = $ulmus['entities']; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (is_array($tell = $data['tell'] ?? false)) { |         if (is_array($tell = $this->data['tell'] ?? false)) { | ||||||
|             if ($tell['json'] ?? false) { |             if ($tell['json'] ?? false) { | ||||||
|                 $this->tellJson = $tell['json']; |                 $this->tellJson = $tell['json']; | ||||||
|             } |             } | ||||||
| @ -72,20 +81,24 @@ class Application | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (is_array($data['routes'] ?? false)) { |         if (is_array($this->data['routes'] ?? false)) { | ||||||
|             $this->routes = $data['routes']; |             $this->routes = $this->data['routes']; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (is_array($data['cronard'] ?? false)) { |         if (is_array($this->data['cronard'] ?? false)) { | ||||||
|             $this->cronard = $data['cronard']; |             $this->cronard = $this->data['cronard']; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (is_array($data['events'] ?? false)) { |         if (is_array($this->data['events'] ?? false)) { | ||||||
|             $this->events = $data['events']; |             $this->events = $this->data['events']; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (is_array($data['cli'] ?? false)) { |         if (is_array($this->data['cli'] ?? false)) { | ||||||
|             $this->cli = $data['cli']; |             $this->cli = $this->data['cli']; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (is_array($this->data['taxus'] ?? false)) { | ||||||
|  |             $this->taxus = $this->data['taxus']; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return $this; |         return $this; | ||||||
|  | |||||||
| @ -13,8 +13,8 @@ use Psr\Http\Message\{ ServerRequestInterface, ResponseInterface }; | |||||||
| 
 | 
 | ||||||
| use function file_get_contents; | use function file_get_contents; | ||||||
| 
 | 
 | ||||||
| #[Security(locked: true)]
 | #[Security(locked: true, realm: "Protected Area")]
 | ||||||
| #[Route(method: [ "GET", "POST", "DELETE" ])]
 | #[Route(method: [ "GET", "POST" ])]
 | ||||||
| trait ControllerTrait { | trait ControllerTrait { | ||||||
|     public ? \Notes\Breadcrumb\Breadcrumb $breadcrumb; |     public ? \Notes\Breadcrumb\Breadcrumb $breadcrumb; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4,10 +4,16 @@ namespace Lean\Factory; | |||||||
| 
 | 
 | ||||||
| use Laminas\Diactoros\Response\{EmptyResponse, HtmlResponse, JsonResponse, RedirectResponse, TextResponse}; | use Laminas\Diactoros\Response\{EmptyResponse, HtmlResponse, JsonResponse, RedirectResponse, TextResponse}; | ||||||
| use Lean\Response\{ DownloadResponse, ImageResponse, FileDownloadResponse, PdfResponse }; | use Lean\Response\{ DownloadResponse, ImageResponse, FileDownloadResponse, PdfResponse }; | ||||||
|  | use Laminas\Diactoros\Response; | ||||||
| use Psr\Http\Message\ResponseInterface; | use Psr\Http\Message\ResponseInterface; | ||||||
| 
 | 
 | ||||||
| class HttpFactory | 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 |     public static function createRedirectResponse(string $url, int $code = 302, array $headers = []) : ResponseInterface | ||||||
|     { |     { | ||||||
|         return new RedirectResponse($url, $code, $headers); |         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)); |         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 |     public function getEntities() : array | ||||||
|     { |     { | ||||||
|         return array_merge(...array_map(fn($app) => $app->entities ?? [], $this->applications)); |         return array_merge(...array_map(fn($app) => $app->entities ?? [], $this->applications)); | ||||||
| @ -150,24 +155,10 @@ class Lean | |||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     #[\Deprecated("Definitions are now loaded automatically from composer extra array.")]
 | ||||||
|     public static function definitions() : array |     public static function definitions() : array | ||||||
|     { |     { | ||||||
|         $path = dirname(__DIR__) . "/meta/definitions/"; |         return []; | ||||||
| 
 |  | ||||||
|         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") : [], |  | ||||||
|         ); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static function autoloadDefinitionsFromComposerExtra() : array |     public static function autoloadDefinitionsFromComposerExtra() : array | ||||||
| @ -218,4 +209,4 @@ class Lean | |||||||
| 
 | 
 | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,9 +2,6 @@ | |||||||
| 
 | 
 | ||||||
| namespace Lean; | namespace Lean; | ||||||
| 
 | 
 | ||||||
| use Notes\Annotation; |  | ||||||
| use Taxus\Taxus; |  | ||||||
| 
 |  | ||||||
| use League\Route\RouteGroup, | use League\Route\RouteGroup, | ||||||
|     League\Route\Router; |     League\Route\Router; | ||||||
| 
 | 
 | ||||||
| @ -14,55 +11,33 @@ use Psr\Http\Message\ServerRequestInterface, | |||||||
| 
 | 
 | ||||||
| use Notes\Route\RouteFetcher; | 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 Mcnd\Event\EventManager; | ||||||
| 
 | 
 | ||||||
| use function DI\autowire, DI\create; |  | ||||||
| 
 |  | ||||||
| class Routing { | class Routing { | ||||||
| 
 | 
 | ||||||
|     public Annotation $selectedRoute; |  | ||||||
| 
 |  | ||||||
|     public ResponseInterface $response; |     public ResponseInterface $response; | ||||||
| 
 | 
 | ||||||
|     public function __construct( |     public function __construct( | ||||||
|         public Session $session, |  | ||||||
|         public Cookie $cookie, |  | ||||||
|         public UrlExtension $extension, |  | ||||||
|         public Router $router, |         public Router $router, | ||||||
|         public RouteFetcher $fetcher, |         public RouteFetcher $fetcher, | ||||||
|         public SecurityHandler $security, |  | ||||||
|         public LanguageHandler $language, |  | ||||||
|         public Taxus $taxus, |  | ||||||
|         public EventManager $eventManager, |         public EventManager $eventManager, | ||||||
|     ) { } |     ) { } | ||||||
| 
 | 
 | ||||||
|     public function registerRoute(ContainerInterface $container, string $urlBase) { |     public function registerRoute(ContainerInterface $container, string $urlBase) { | ||||||
|         $this->router->group(rtrim($urlBase, "/"), function (RouteGroup $route) use ($container) { |         $this->router->group(rtrim($urlBase, "/"), function (RouteGroup $route) use ($container) { | ||||||
|             foreach($this->fetcher->compile() as $annotation) { |             foreach($this->fetcher->compile() as $attribute) { | ||||||
|                 $this->eventManager->execute(Event\RoutingCompileRoutes::class, $this, $annotation); |                 $this->eventManager->execute(Event\RoutingCompileRoutes::class, $this, $attribute); | ||||||
| 
 | 
 | ||||||
|                 /* @deprecated annotation->method will become standard when using native attributes */ |                 # Mapping every URLs from attributes in searched folders (Api, Controller, etc...)
 | ||||||
|                 foreach((array) ( $annotation->method ?? $annotation->methods ) as $method) { |                 foreach((array) $attribute->method as $method) { | ||||||
|                     # Mapping every URLs from annotations in searched folders (Api, Controller, etc...)
 |                     $route->map(strtoupper($method), $attribute->getRoute(), function (ServerRequestInterface $request, array $arguments) use ( | ||||||
|                     $route->map(strtoupper($method), $annotation->getRoute(), function (ServerRequestInterface $request, array $arguments) use ( |                         $container, $route, $attribute | ||||||
|                         $container, $route, $annotation |                     ) : ResponseInterface { | ||||||
|                     ) : ResponseInterface |                         $class = $attribute->class;     | ||||||
|                     { |                         $method = $attribute->classMethod; | ||||||
|                         $class = $annotation->class;     |  | ||||||
|                         $method = $annotation->classMethod; |  | ||||||
|                         $object = $container->get($class); |                         $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); |                         $container->set(ServerRequestInterface::class, $request); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user