diff --git a/composer.json b/composer.json index 659f59e..2a9a1fd 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "authors": [ { "name": "Dave Mc Nicoll", - "email": "mcndave@gmail.com" + "email": "info@mcnd.ca" } ], "require": { diff --git a/meta/definitions/cronard.php b/meta/definitions/cronard.php new file mode 100644 index 0000000..3fc0ff5 --- /dev/null +++ b/meta/definitions/cronard.php @@ -0,0 +1,32 @@ + function($c) { + $cronardMiddleware = new CronardMiddleware($c, getenv('CRON_KEY'), function() : ResponseInterface { + return new HtmlResponse(sprintf("%s - cron task begin...", date('Y-m-d H:i:s'))); + }, [], $c->get(TaskFetcher::class)); + + 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; + }, +]; diff --git a/meta/definitions/event.php b/meta/definitions/event.php new file mode 100644 index 0000000..fa8cb15 --- /dev/null +++ b/meta/definitions/event.php @@ -0,0 +1,26 @@ + autowire(Event\EventManager::class), + + Event\EventMiddleware::class => function($c) { + $mw = new Event\EventMiddleware($c, $c->get(Event\EventManager::class)); + + return $mw->fromAttributes($c->get(Notes\Event\EventFetcher::class)); + }, + + Notes\Event\EventFetcher::class => function($c) { + $fetcher = new Notes\Event\EventFetcher(null, null, $c->get('events.caching')); + + $fetcher->setFolderList(array_map(function($item) { + return $item; + }, $c->get(Lean::class)->getEvents())); + + return $fetcher; + }, +]; diff --git a/meta/definitions/routes.php b/meta/definitions/routes.php index bbd2d1f..0c9d3ae 100644 --- a/meta/definitions/routes.php +++ b/meta/definitions/routes.php @@ -81,7 +81,7 @@ return [ }; }, - 'routes.middlewares' => [ "dump", "errorHandler", SessionMiddleware::class, CronardMiddleware::class, HttpBasicAuthentication::class ], + 'routes.middlewares' => [ "dump", "errorHandler", SessionMiddleware::class, CronardMiddleware::class, Mcnd\Event\EventMiddleware::class, HttpBasicAuthentication::class ], 'routes.list' => function($c) { return function (ContainerInterface $container) { diff --git a/meta/definitions/software.php b/meta/definitions/software.php index 0b6a091..3a5c08e 100644 --- a/meta/definitions/software.php +++ b/meta/definitions/software.php @@ -66,24 +66,6 @@ return [ Lean::class => autowire(Lean::class), - CronardMiddleware::class => function($c) { - $cronardMiddleware = new CronardMiddleware($c, getenv('CRON_KEY'), function() : ResponseInterface { - return new HtmlResponse(sprintf("%s - cron task begin...", date('Y-m-d H:i:s'))); - }, [], $c->get(TaskFetcher::class)); - - 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; - }, - JavascriptMiddleware::class => create(JavascriptMiddleware::class), Cookie::class => create(Cookie::class)->constructor([ 'secure' => true, 'path' => getenv('URL_BASE') ?: '/', ], getenv("LEAN_RANDOM")), diff --git a/meta/i18n/fr/lean.error.json b/meta/i18n/fr/lean.error.json index 04021b7..cced617 100644 --- a/meta/i18n/fr/lean.error.json +++ b/meta/i18n/fr/lean.error.json @@ -14,7 +14,7 @@ "back": "Revenir à la page précédente" }, "500": { - "title": "Une erreur semble s'être produite", + "title": "Une erreur s'est produite", "page-title": "Une erreur semble s'être produite", "subtitle": "L'action que vous avez tenté d'effectué semble avoir échoué.", "message": "Un message d'erreur a été envoyé au développeur de cette application.", diff --git a/skeleton/.env b/skeleton/.env index e11d9d8..57ff9c5 100644 --- a/skeleton/.env +++ b/skeleton/.env @@ -13,6 +13,7 @@ META_DIR = "meta" LOGS_DIR = "var/logs" PUBLIC_DIR = "public" PRIVATE_DIR = "private" +TMP_DIR = "var/tmp" VIEW_DIR = "view" I18N_DIR = "i18n" diff --git a/skeleton/meta/definitions/definitions.php b/skeleton/meta/definitions/definitions.php index 4eaf0e4..75be0fb 100644 --- a/skeleton/meta/definitions/definitions.php +++ b/skeleton/meta/definitions/definitions.php @@ -26,6 +26,14 @@ return array_merge( 'routes' => [ '%ESCAPED_NAMESPACE%\\Controller' => getenv("PROJECT_PATH") . '/src/Controller/', ], + + 'events' => [ + '%ESCAPED_NAMESPACE%\\Controller' => implode(DIRECTORY_SEPARATOR, [ getenv("PROJECT_PATH"), 'src', 'Controller', '' ]), + ], + + 'cronard' => [ + '%ESCAPED_NAMESPACE%\\Controller' => implode(DIRECTORY_SEPARATOR, [ getenv("PROJECT_PATH"), 'src', 'Controller', '' ]), + ], ], ], diff --git a/skeleton/meta/definitions/env/dev.php b/skeleton/meta/definitions/env/dev.php index 8a94859..e49d6b2 100644 --- a/skeleton/meta/definitions/env/dev.php +++ b/skeleton/meta/definitions/env/dev.php @@ -15,4 +15,5 @@ return [ 'breadcrumbs.caching' => create(Kash\ArrayCache::class)->constructor( get(Kash\CacheInvalidator::class), "lean.breadcrumbs", 30), 'ulmus.caching' => create(Kash\ArrayCache::class)->constructor( get(Kash\CacheInvalidator::class), "ulmus.entities", 30), 'cronard.caching' => create(Kash\ArrayCache::class)->constructor( get(Kash\CacheInvalidator::class), "lean.cronards", 30), + 'events.caching' => create(Kash\ArrayCache::class)->constructor( get(Kash\CacheInvalidator::class), "lean.events", random_int(3600, 7200)), ]; diff --git a/skeleton/meta/definitions/env/prod.php b/skeleton/meta/definitions/env/prod.php index 8cbe1b1..a4b653e 100644 --- a/skeleton/meta/definitions/env/prod.php +++ b/skeleton/meta/definitions/env/prod.php @@ -2,7 +2,10 @@ use Picea\Picea; -use CSLSJ\Debogueur\DebogueurMiddleware; +#use CSLSJ\Debogueur\DebogueurMiddleware; +use Negundo\Client\{ NegundoMiddleware, SoftwareConfig }; + +use use Laminas\Diactoros\Response\HtmlResponse; @@ -27,7 +30,9 @@ return [ }; }, - "errorHandler" => create(DebogueurMiddleware::class)->constructor(getenv('DEBOGUEUR_HASH') ?: "", null, get('app.errorhandler.html')), + SoftwareConfig::class => create(SoftwareConfig::class)->constructor(getenv('NEGUNDO_HASH'), getenv('NEGUNDO_SERVER')), + + "errorHandler" => create(NegundoMiddleware::class)->constructor(get(SoftwareConfig::class), null, get('app.errorhandler.html')), 'app.errorhandler.html' => function($c, Picea $picea) { return function(\Throwable $exception) use ($picea) { @@ -46,4 +51,5 @@ return [ 'breadcrumbs.caching' => create(Kash\ApcuCache::class)->constructor(get(Kash\CacheInvalidator::class), "lean.breadcrumbs", random_int(3600, 7200)), 'ulmus.caching' => create(Kash\ApcuCache::class)->constructor( get(Kash\CacheInvalidator::class), "ulmus.entities", random_int(3600, 7200)), 'cronard.caching' => create(Kash\ApcuCache::class)->constructor( get(Kash\CacheInvalidator::class), "lean.cronards", random_int(3600, 7200)), + 'events.caching' => create(Kash\ApcuCache::class)->constructor( get(Kash\CacheInvalidator::class), "lean.events", random_int(3600, 7200)), ]; \ No newline at end of file diff --git a/skeleton/src/Controller/Home.php b/skeleton/src/Controller/Home.php index 9ceb2d3..73f6fbf 100644 --- a/skeleton/src/Controller/Home.php +++ b/skeleton/src/Controller/Home.php @@ -8,15 +8,11 @@ use %NAMESPACE%\{ Lib, Entity, Form, }; use function %NAMESPACE%\View\{ _, lang, url, route, form }; -/** - * @Language("%APPKEY%.home") - */ +#[Language("%APPKEY%.home")] class Home { use Lib\ControllerTrait; - /** - * @Route("/", "name" => "home") - */ + #[Route("/", name: "home")] public function index(ServerRequestInterface $request, array $arguments) : ResponseInterface { form(new Form\Form(), $this->pushContext(new Lib\FormContext($request, "form.name"))); diff --git a/skeleton/src/Entity/User.php b/skeleton/src/Entity/User.php index 25dc2ed..1ef3fb6 100644 --- a/skeleton/src/Entity/User.php +++ b/skeleton/src/Entity/User.php @@ -3,12 +3,11 @@ namespace %NAMESPACE%\Entity; use Ulmus\Entity\Field\Datetime; +use Ulmus\{Attribute\Obj\Table; use %NAMESPACE%\Lib; -/** - * @Table('name' => "user") - */ +#[Table(name: "user")] class User extends \Ulmus\User\Entity\User implements \JsonSerializable { use Lib\EntityTrait; diff --git a/skeleton/src/Kernel.php b/skeleton/src/Kernel.php index 3436682..adff807 100644 --- a/skeleton/src/Kernel.php +++ b/skeleton/src/Kernel.php @@ -14,6 +14,7 @@ new class(dirname(__DIR__)) extends \Lean\Kernel { 'META_PATH' => "META_DIR", 'PUBLIC_PATH' => "PUBLIC_DIR", 'PRIVATE_PATH' => "PRIVATE_DIR", + 'TMP_PATH' => "TMP_DIR", 'VIEW_PATH' => "VIEW_DIR", ]; diff --git a/skeleton/src/Lib/ControllerTrait.php b/skeleton/src/Lib/ControllerTrait.php index 3fb0279..21e6d1f 100644 --- a/skeleton/src/Lib/ControllerTrait.php +++ b/skeleton/src/Lib/ControllerTrait.php @@ -6,12 +6,14 @@ use Picea\Picea; use Storage\Session; use Ulmus\User\Entity\User; use Ulmus\User\Lib\Authenticate; +use Notes\Route\Attribute\Object\Route; +use Notes\Security\Attribute\Security; use %NAMESPACE%\Entity; -/** - * @Security("locked" => false) - * @RouteParam("methods" => [ "GET", "POST" ]) - */ +use Mcnd\Event\EventManager; + +#[Security(locked: false)] +#[Route(method: ['GET', 'POST', ])] trait ControllerTrait { use \Lean\ControllerTrait; @@ -19,14 +21,18 @@ trait ControllerTrait { protected Authenticate $authenticate; - public function __construct(Picea $picea, Session $session, Authenticate $authenticate) { - $this->initializeController($picea, $session, $authenticate); + protected EventManager $eventManager; + + public function __construct(Picea $picea, Session $session, Authenticate $authenticate, \Notes\Breadcrumb\Breadcrumb $breadcrumb, EventManager $eventManager) { + $this->initializeController($picea, $session, $authenticate, $breadcrumb, $eventManager); } - public function initializeController(Picea $picea, Session $session, Authenticate $authenticate) { + public function initializeController(Picea $picea, Session $session, Authenticate $authenticate, \Notes\Breadcrumb\Breadcrumb $breadcrumb, EventManager $eventManager) { $this->picea = $picea; $this->authenticate = $authenticate; $this->session = $session; + $this->eventManager = $eventManager; + $this->breadcrumb = $breadcrumb; $this->user = $authenticate->rememberMe( Entity\User::repository() ) ?: new Entity\User(); } diff --git a/skeleton/src/Middleware/Authentication.php b/skeleton/src/Middleware/Authentication.php index 328c276..c939356 100644 --- a/skeleton/src/Middleware/Authentication.php +++ b/skeleton/src/Middleware/Authentication.php @@ -23,13 +23,9 @@ class Authentication implements MiddlewareInterface { $this->session = $session; } - /** - * Middleware request handling - * - * @param ServerRequestInterface $request - * @param RequestHandlerInterface $handler - * @return ResponseInterface - */ + #[param ServerRequestInterface $request] + #[param RequestHandlerInterface $handler] + #[return ResponseInterface] public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface { $user = $this->session->get( $this->sessionUserVariable() ); @@ -41,12 +37,8 @@ class Authentication implements MiddlewareInterface { return $handler->handle($request); } - /** - * Getter / setter of Session User Variable - * - * @param string|null sessionUserVariable - * @return mixed - */ + #[param string|null sessionUserVariable] + #[return mixed] public function sessionUserVariable(?string $set = null) : string { return $set !== null ? $this->sessionUserVariable = $set : $this->sessionUserVariable; diff --git a/skeleton/view/base/layout/default.phtml b/skeleton/view/base/layout/default.phtml index 32353ae..ebfa87e 100644 --- a/skeleton/view/base/layout/default.phtml +++ b/skeleton/view/base/layout/default.phtml @@ -5,28 +5,7 @@