231 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php declare(strict_types=1);
 | 
						|
 | 
						|
namespace Lean;
 | 
						|
 | 
						|
use Lean\Factory\HttpFactory;
 | 
						|
use Notes\Attribute\Ignore;
 | 
						|
use Notes\Route\Attribute\Object\Route;
 | 
						|
use Notes\Security\Attribute\Security;
 | 
						|
use Picea, Picea\Ui\Method\FormContext;
 | 
						|
use TheBugs\Email\MailerInterface;
 | 
						|
use League\CommonMark\CommonMarkConverter;
 | 
						|
use Storage\{ Session, Cookie };
 | 
						|
 | 
						|
use Psr\Http\Message\{ ServerRequestInterface, ResponseInterface };
 | 
						|
 | 
						|
use function file_get_contents;
 | 
						|
 | 
						|
#[Security(locked: true, realm: "Protected Area")]
 | 
						|
#[Route(method: [ "GET", "POST" ])]
 | 
						|
trait ControllerTrait {
 | 
						|
    public ? \Notes\Breadcrumb\Breadcrumb $breadcrumb;
 | 
						|
 | 
						|
    public ? Cookie $cookie;
 | 
						|
 | 
						|
    public ? Session $session;
 | 
						|
 | 
						|
    public ? Picea\Picea $picea;
 | 
						|
 | 
						|
    public ? MailerInterface $mailer;
 | 
						|
 | 
						|
    public array $contextList = [];
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function exportJson(ServerRequestInterface $request, string $entityClass, bool $includeRelations = true, ? callable $callback = null) : ResponseInterface
 | 
						|
    {
 | 
						|
        foreach($entityClass::repository()->filterServerRequest( $entityClass::searchRequest()->fromRequest($request->withQueryParams($request->getQueryParams() + ['limit' => PHP_INT_MAX,])) )->loadAll() as $entity) {
 | 
						|
            $data[] = $callback ? call_user_func($callback, $entity->toArray($includeRelations)) : $entity->toArray($includeRelations);
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->renderJson( array_filter($data ?? [], function($row) { return $row !== null; }));
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function renderRawView(string $view, ?array $variables = null) : string
 | 
						|
    {
 | 
						|
        if ( null === $content = $this->picea->renderHtml($view, $variables ?? [], $this) ) {
 | 
						|
            throw new \RuntimeException("Picea's renderHtml() returned NULL as result ; an error occurred within your template `$view`.");
 | 
						|
        }
 | 
						|
 | 
						|
        return $content;
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function renderView(string $view, ?array $variables = null) : ResponseInterface
 | 
						|
    {
 | 
						|
        return static::renderHtml(
 | 
						|
            $this->renderRawView($view, $variables ?? [])
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function renderError(string $errorCode, ?array $variables = null) : ResponseInterface
 | 
						|
    {
 | 
						|
        return static::renderHtml(
 | 
						|
            $this->renderRawView("lean/error/{$errorCode}", $variables ?? [])
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function renderDocumentation(string $filename) : ResponseInterface
 | 
						|
    {
 | 
						|
        return $this->renderMarkdown( file_get_contents(getenv("PROJECT_PATH") . "/meta/doc/$filename.md") );
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    protected function redirect(string $url, int $code = 302, array $headers = []) {
 | 
						|
        return HttpFactory::createRedirectResponse($url, $code, $headers);
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public static function renderNothing(int $code = 204, array $headers = []) : ResponseInterface
 | 
						|
    {
 | 
						|
	    return HttpFactory::createEmptyResponse($code, $headers);
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public static function renderText(string $text, int $code = 200, array $headers = []) : ResponseInterface
 | 
						|
    {
 | 
						|
        return HttpFactory::createTextResponse($text, $code, $headers);
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public static function renderHtml(string $html, int $code = 200, array $headers = []) : ResponseInterface
 | 
						|
    {
 | 
						|
        return HttpFactory::createHtmlResponse($html, $code, $headers);
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public static function renderJson(mixed $data, int $code = 200, array $headers = []) : ResponseInterface
 | 
						|
    {
 | 
						|
        return HttpFactory::createJsonResponse($data, $code, $headers);
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function renderPdf($rawdata, int $status = 200, array $headers = []) : ResponseInterface
 | 
						|
    {
 | 
						|
        return HttpFactory::createPdfResponse($rawdata, $status, $headers);
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public static function renderDownloadable(string $data, string $filename, int $code = 200, array $headers = []) : ResponseInterface
 | 
						|
    {
 | 
						|
        return HttpFactory::createDownloadableResponse($data, $filename, $code, $headers);
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public static function renderImage(string $data, int $code = 200, array $headers = []) : ResponseInterface
 | 
						|
    {
 | 
						|
        return HttpFactory::createImageResponse($data, $code, $headers);
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public static function renderAsset(string $path, int $code = 200, array $headers = []) : ResponseInterface
 | 
						|
    {
 | 
						|
        return HttpFactory::createFileDownloadResponse($path, $code, $headers);
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function renderMarkdown(string $filepath, int $code = 200, array $headers = []) : ResponseInterface
 | 
						|
    {
 | 
						|
        if ( ! class_exists(CommonMarkConverter::class)) {
 | 
						|
            throw new \BadFunctionCallException("League\CommonMark seems to be missing, please install dependency before trying to render Markdown content");
 | 
						|
        }
 | 
						|
 | 
						|
        $markdown = ( new CommonMarkConverter() )->convert(file_get_contents($filepath));
 | 
						|
 | 
						|
        return $this->renderView("lean/layout/docs", get_defined_vars());
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function renderCLI(ServerRequestInterface $request, mixed $data) : ResponseInterface
 | 
						|
    {
 | 
						|
        if ($data instanceof \JsonSerializable ) {
 | 
						|
            return $this->renderJson(
 | 
						|
                $data
 | 
						|
            );
 | 
						|
        }
 | 
						|
        elseif ( is_array($data) ) {
 | 
						|
            var_export($data);
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->renderText(
 | 
						|
            $data . PHP_EOL
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function fromResponse(ResponseInterface $response)
 | 
						|
    {
 | 
						|
        if ( $response->getStatusCode() === 200 ) {
 | 
						|
            if ( $response instanceof \Laminas\Diactoros\Response\JsonResponse) {
 | 
						|
                return $response->getPayload();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return null;
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function asset(string $url, array $parameters = []) : string
 | 
						|
    {
 | 
						|
        if (! $this->picea ) {
 | 
						|
            throw new \Exception("A picea object must be provided on class initialization to use this method.");
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->picea->compiler->getExtensionFromToken('asset')->buildAssetUrl($url, $parameters);
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function url(string $url, array $parameters = []) : string
 | 
						|
    {
 | 
						|
        if (! $this->picea ) {
 | 
						|
            throw new \Exception("A picea object must be provided on class initialization to use this method.");
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->picea->compiler->getExtensionFromToken('url')->buildUrl($url, $parameters);
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function route(string $name, array $parameters = []) : string
 | 
						|
    {
 | 
						|
        if (! $this->picea ) {
 | 
						|
            throw new \Exception("A picea object must be provided on class initialization to use this method.");
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->picea->compiler->getExtensionFromToken('route')->buildRouteUrl($name, $parameters);
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function json($data, int $flags = 0) : string
 | 
						|
    {
 | 
						|
        return htmlentities(json_encode($data, $flags), ENT_QUOTES, 'UTF-8');
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function pushContext(FormContext $context) : FormContext
 | 
						|
    {
 | 
						|
        $this->contextList[$context->formName ?? uniqid("context_")] = $context;
 | 
						|
 | 
						|
        return $context;
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function context(? string $name = null) : ? FormContext
 | 
						|
    {
 | 
						|
        return $name ? $this->contextList[$name] : array_values($this->contextList)[0] ?? null;
 | 
						|
    }
 | 
						|
 | 
						|
    #[Ignore]
 | 
						|
    public function isRoute(mixed $name, ServerRequestInterface $request) : bool
 | 
						|
    {
 | 
						|
        foreach((array) $name as $item) {
 | 
						|
            if ( fnmatch($item, $request->getAttribute('lean.route')->name) ) {
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
}
 |