Initial commit: CloudOps infrastructure platform
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace MauticPlugin\GrapesJsBuilderBundle\Controller;
|
||||
|
||||
use Mautic\CoreBundle\Controller\AjaxController;
|
||||
use Mautic\CoreBundle\Exception\FileUploadException;
|
||||
use MauticPlugin\GrapesJsBuilderBundle\Helper\FileManager;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class FileManagerController extends AjaxController
|
||||
{
|
||||
private const DEFAULT_PAGE = 1;
|
||||
private const DEFAULT_LIMIT = 20;
|
||||
|
||||
public function uploadAction(Request $request, FileManager $fileManager): Response
|
||||
{
|
||||
try {
|
||||
$response = $this->sendJsonResponse(['data'=> $fileManager->uploadFiles($request)]);
|
||||
} catch (FileUploadException $error) {
|
||||
return new Response($error->getMessage(), Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
public function deleteAction(Request $request, FileManager $fileManager): JsonResponse
|
||||
{
|
||||
$fileName = basename($request->get('filename'));
|
||||
$filePath = $fileManager->getCompleteFilePath($fileName);
|
||||
|
||||
if (!file_exists($filePath) || !exif_imagetype($filePath)) {
|
||||
return $this->sendJsonResponse(['success'=> false]);
|
||||
}
|
||||
|
||||
$fileManager->deleteFile($fileName);
|
||||
|
||||
return $this->sendJsonResponse(['success'=> true]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated since Mautic 5.2, to be removed in 6.0. Use FileManagerController::getMediaAction instead
|
||||
*/
|
||||
public function assetsAction(FileManager $fileManager): JsonResponse
|
||||
{
|
||||
return $this->sendJsonResponse([
|
||||
'data' => $fileManager->getImages(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function getMediaAction(Request $request, FileManager $fileManager): JsonResponse
|
||||
{
|
||||
$page = $request->query->getInt('page', self::DEFAULT_PAGE);
|
||||
$limit = $request->query->getInt('limit', self::DEFAULT_LIMIT);
|
||||
|
||||
return $this->sendJsonResponse($fileManager->getMediaFiles($page, $limit));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace MauticPlugin\GrapesJsBuilderBundle\Controller;
|
||||
|
||||
use Mautic\CoreBundle\Controller\CommonController;
|
||||
use Mautic\CoreBundle\Helper\EmojiHelper;
|
||||
use Mautic\CoreBundle\Helper\InputHelper;
|
||||
use Mautic\CoreBundle\Helper\ThemeHelper;
|
||||
use Mautic\EmailBundle\Entity\Email;
|
||||
use Mautic\PageBundle\Entity\Page;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class GrapesJsController extends CommonController
|
||||
{
|
||||
public const OBJECT_TYPE = ['email', 'page'];
|
||||
|
||||
/**
|
||||
* Activate the custom builder.
|
||||
*
|
||||
* @param string $objectType
|
||||
* @param int $objectId
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function builderAction(
|
||||
Request $request,
|
||||
LoggerInterface $mauticLogger,
|
||||
ThemeHelper $themeHelper,
|
||||
$objectType,
|
||||
$objectId,
|
||||
) {
|
||||
if (!in_array($objectType, self::OBJECT_TYPE)) {
|
||||
throw new \Exception('Object not authorized to load custom builder', Response::HTTP_CONFLICT);
|
||||
}
|
||||
|
||||
/** @var \Mautic\EmailBundle\Model\EmailModel|\Mautic\PageBundle\Model\PageModel $model */
|
||||
$model = $this->getModel($objectType);
|
||||
$aclToCheck = 'email:emails:';
|
||||
|
||||
if ('page' === $objectType) {
|
||||
$aclToCheck = 'page:pages:';
|
||||
}
|
||||
|
||||
// permission check
|
||||
if (str_contains((string) $objectId, 'new')) {
|
||||
$isNew = true;
|
||||
|
||||
if (!$this->security->isGranted($aclToCheck.'create')) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
|
||||
/** @var Email|Page $entity */
|
||||
$entity = $model->getEntity();
|
||||
$entity->setSessionId($objectId);
|
||||
} else {
|
||||
/** @var Email|Page $entity */
|
||||
$entity = $model->getEntity($objectId);
|
||||
$isNew = false;
|
||||
|
||||
if (null == $entity
|
||||
|| !$this->security->hasEntityAccess(
|
||||
$aclToCheck.'viewown',
|
||||
$aclToCheck.'viewother',
|
||||
$entity->getCreatedBy()
|
||||
)
|
||||
) {
|
||||
return $this->accessDenied();
|
||||
}
|
||||
}
|
||||
|
||||
$type = 'html';
|
||||
$template = InputHelper::clean($request->query->get('template'));
|
||||
if (!$template) {
|
||||
$mauticLogger->warning('Grapesjs: no template in query');
|
||||
|
||||
return $this->json(false);
|
||||
}
|
||||
$templateName = '@themes/'.$template.'/html/'.$objectType;
|
||||
$content = $entity->getContent();
|
||||
|
||||
// Check for MJML template
|
||||
// @deprecated - use mjml directly in email.html.twig
|
||||
if ($logicalName = $this->checkForMjmlTemplate($templateName.'.mjml.twig')) {
|
||||
$type = 'mjml';
|
||||
} else {
|
||||
$logicalName = $themeHelper->checkForTwigTemplate($templateName.'.html.twig');
|
||||
}
|
||||
|
||||
// Replace short codes to emoji
|
||||
$content = array_map(fn ($text) => EmojiHelper::toEmoji($text, 'short'), $content);
|
||||
|
||||
$renderedTemplate = $this->renderView(
|
||||
$logicalName,
|
||||
[
|
||||
'isNew' => $isNew,
|
||||
'content' => $content,
|
||||
$objectType => $entity,
|
||||
'template' => $template,
|
||||
'basePath' => $request->getBasePath(),
|
||||
]
|
||||
);
|
||||
|
||||
if (str_contains($renderedTemplate, '<mjml>')) {
|
||||
$type = 'mjml';
|
||||
}
|
||||
|
||||
$renderedTemplateHtml = ('html' === $type) ? $renderedTemplate : '';
|
||||
$renderedTemplateMjml = ('mjml' === $type) ? $renderedTemplate : '';
|
||||
|
||||
return $this->render(
|
||||
'@GrapesJsBuilder/Builder/template.html.twig',
|
||||
[
|
||||
'templateHtml' => $renderedTemplateHtml,
|
||||
'templateMjml' => $renderedTemplateMjml,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated deprecated since version 5.0 - use mjml directly in email.html.twig
|
||||
*/
|
||||
private function checkForMjmlTemplate($template)
|
||||
{
|
||||
$twig = $this->container->get('twig');
|
||||
|
||||
if ($twig->getLoader()->exists($template)) {
|
||||
return $template;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user