Initial commit: CloudOps infrastructure platform

This commit is contained in:
root
2026-04-09 19:58:57 +02:00
commit 1166a52f26
7762 changed files with 839452 additions and 0 deletions

View File

@@ -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));
}
}

View File

@@ -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;
}
}