Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
bfa8a09
[C0-3455] Добавил сущности, репозитории, маппинг для файлов и каталогов
Mar 17, 2021
bc27b03
[C0-3455] Добавил типы в doctrine конфиг
Mar 17, 2021
e8e66e0
[C0-3455] Добавил создание файлов и каталогов
Mar 17, 2021
a2282c8
[C0-3455] Убрал параметр upload_destination, добавил получение маппин…
Mar 17, 2021
709f943
[C0-3455] удалил бинд
Mar 17, 2021
c6f05da
[C0-3455] Обновил события листенера, обновил фильтры
Mar 17, 2021
1094b6b
[C0-3455] Добавил копирование ссылок и html, добавил кнопку перехода …
Mar 18, 2021
b9e58fc
[C0-3455] Добавил валидацию, добавил поле для оригинального название,…
Mar 18, 2021
45013ca
[C0-3455] Поменял неймер при загрузке файлов, доработал логику работы…
Mar 18, 2021
21dcbd4
[C0-3455] Правки после код ревью
Mar 18, 2021
9dddb54
C0 3477 Небольшие улучшения для работы с конфигом Vich uploader (#8)
andrey-erdikov Mar 19, 2021
c82cc8f
[C0-3455] Увеличил количество колонок для HTML
Mar 19, 2021
587cb18
Merge remote-tracking branch 'origin/C0-3455' into C0-3455
Mar 19, 2021
0b79172
[C0-3455] Пофиксил ошибки, добавил controls для video, убрал возможно…
Mar 22, 2021
3152b47
[C0-3455] Убрал валидацию из конфига для обязательного файла, перенес…
Mar 23, 2021
835e3a6
[C0-3455] Добавил дефолтные значения для order и published
Mar 19, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"psr/http-message": "*",
"ramsey/uuid": "^4.1",
"ramsey/uuid-doctrine": "^1.6",
"symfony/validator": "4.4.*"
"symfony/validator": "4.4.*",
"vich/uploader-bundle": "^1.16"
},
"require-dev": {
"codeception/codeception": "^2.5",
Expand Down
49 changes: 49 additions & 0 deletions src/Application/Cms/MediaFile/Service/MediaFilePathResolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

declare(strict_types=1);

namespace Skyeng\MarketingCmsBundle\Application\Cms\MediaFile\Service;

use Skyeng\MarketingCmsBundle\Domain\Entity\MediaFile;
use Vich\UploaderBundle\Templating\Helper\UploaderHelper;

class MediaFilePathResolver
{
private const IMAGE_HTML_MASK = '<img src="%s" title="%s"/>';
private const VIDEO_HTML_MASK = '<video controls><source src="%s"></video>';
private const PDF_HTML_MASK = '<embed src="%s"/>';

/**
* @var UploaderHelper
*/
private $uploaderHelper;

public function __construct(UploaderHelper $uploaderHelper)
{
$this->uploaderHelper = $uploaderHelper;
}

public function getFileUrl(MediaFile $file): ?string
{
return $this->uploaderHelper->asset($file, 'file');
}

public function getFileHtml(MediaFile $file): ?string
{
$url = $this->getFileUrl($file);

if ($file->getType()->isImage()) {
return sprintf(self::IMAGE_HTML_MASK, $url, $file->getTitle());
}

if ($file->getType()->isVideo()) {
return sprintf(self::VIDEO_HTML_MASK, $url);
}

if ($file->getType()->isPdf()) {
return sprintf(self::PDF_HTML_MASK, $url);
}

return null;
}
}
43 changes: 43 additions & 0 deletions src/Application/Cms/MediaFile/Service/MediaFileTypeResolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

declare(strict_types=1);

namespace Skyeng\MarketingCmsBundle\Application\Cms\MediaFile\Service;

use Skyeng\MarketingCmsBundle\Application\Exception\ApplicationException;
use Skyeng\MarketingCmsBundle\Domain\Entity\ValueObject\MediaFileType;
use Symfony\Component\HttpFoundation\File\File;

class MediaFileTypeResolver
{
private const IMAGE_MIME_TYPES = [
'image/jpeg',
'image/png',
'image/gif',
];

private const PDF_MIME_TYPE = 'application/pdf';

private const VIDEO_MIME_TYPES = [
'video/mp4',
];

public function getMediaFileTypeByFile(File $file): MediaFileType
{
$mimeType = $file->getMimeType();

if ($mimeType === self::PDF_MIME_TYPE) {
return new MediaFileType(MediaFileType::PDF_TYPE);
}

if (in_array($mimeType, self::IMAGE_MIME_TYPES, true)) {
return new MediaFileType(MediaFileType::IMAGE_TYPE);
}

if (in_array($mimeType, self::VIDEO_MIME_TYPES, true)) {
return new MediaFileType(MediaFileType::VIDEO_TYPE);
}

throw new ApplicationException('Mime type ' . $mimeType . ' is not supported');
}
}
60 changes: 60 additions & 0 deletions src/Application/EventListener/MediaFileUpdatedListener.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

declare(strict_types=1);

namespace Skyeng\MarketingCmsBundle\Application\EventListener;

use Doctrine\Persistence\Event\LifecycleEventArgs;
use Skyeng\MarketingCmsBundle\Application\Cms\MediaFile\Service\MediaFileTypeResolver;
use Skyeng\MarketingCmsBundle\Domain\Entity\MediaFile;
use Skyeng\MarketingCmsBundle\Domain\Entity\ValueObject\MediaFileStorage;
use Vich\UploaderBundle\Mapping\PropertyMappingFactory;

class MediaFileUpdatedListener
{
/**
* @var MediaFileTypeResolver
*/
private $mediaFileTypeResolver;

/**
* @var PropertyMappingFactory
*/
private $fileMappingFactory;

public function __construct(MediaFileTypeResolver $mediaFileTypeResolver, PropertyMappingFactory $fileMappingFactory)
{
$this->mediaFileTypeResolver = $mediaFileTypeResolver;
$this->fileMappingFactory = $fileMappingFactory;
}

public function preUpdate(LifecycleEventArgs $args): void
{
$this->handleEventArgs($args);
}

public function prePersist(LifecycleEventArgs $args): void
{
$this->handleEventArgs($args);
}

private function handleEventArgs(LifecycleEventArgs $args): void
{
$object = $args->getObject();

if (!$object instanceof MediaFile) {
return;
}

if (!$object->getFile()) {
return;
}

$object->setType($this->mediaFileTypeResolver->getMediaFileTypeByFile($object->getFile()));
$mapping = $this->fileMappingFactory->fromField($object, 'file');

if ($mapping) {
$object->setStorage(new MediaFileStorage($mapping->getUploadDestination()));
}
}
}
46 changes: 46 additions & 0 deletions src/Domain/Entity/MediaCatalog.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

declare(strict_types=1);

namespace Skyeng\MarketingCmsBundle\Domain\Entity;

use Skyeng\MarketingCmsBundle\Domain\Entity\ValueObject\Id;

class MediaCatalog
{
/**
* @var Id
*/
private $id;

/**
* @var string
*/
private $name;

public function __construct(Id $id, string $name)
{
$this->id = $id;
$this->name = $name;
}

public function __toString()
{
return $this->name;
}

public function getId(): Id
{
return $this->id;
}

public function getName(): string
{
return $this->name;
}

public function setName(string $name): void
{
$this->name = $name;
}
}
146 changes: 146 additions & 0 deletions src/Domain/Entity/MediaFile.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
<?php

declare(strict_types=1);

namespace Skyeng\MarketingCmsBundle\Domain\Entity;

use Skyeng\MarketingCmsBundle\Domain\Entity\ValueObject\Id;
use Skyeng\MarketingCmsBundle\Domain\Entity\ValueObject\MediaFileStorage;
use Skyeng\MarketingCmsBundle\Domain\Entity\ValueObject\MediaFileType;
use Symfony\Component\HttpFoundation\File\File;

class MediaFile
{
/**
* @var Id
*/
private $id;

/**
* @var MediaCatalog
*/
private $catalog;

/**
* @var string
*/
private $title;

/**
* @var MediaFileType
*/
private $type;

/**
* @var string|null
*/
private $name;

/**
* @var MediaFileStorage
*/
private $storage;

/**
* @var File|null
*/
private $file;

/**
* @var string|null
*/
private $originalName;

public function __construct(
Id $id,
MediaCatalog $catalog,
string $title,
MediaFileType $type,
?string $name,
MediaFileStorage $storage,
string $originalName
) {
$this->id = $id;
$this->catalog = $catalog;
$this->title = $title;
$this->type = $type;
$this->name = $name;
$this->storage = $storage;
$this->originalName = $originalName;
}

public function getId(): Id
{
return $this->id;
}

public function getCatalog(): MediaCatalog
{
return $this->catalog;
}

public function setCatalog(MediaCatalog $catalog): void
{
$this->catalog = $catalog;
}

public function getTitle(): string
{
return $this->title;
}

public function setTitle(string $title): void
{
$this->title = $title;
}

public function getType(): MediaFileType
{
return $this->type;
}

public function setType(MediaFileType $type): void
{
$this->type = $type;
}

public function getName(): string
{
return $this->name;
}

public function setName(?string $name): void
{
$this->name = $name;
}

public function getStorage(): MediaFileStorage
{
return $this->storage;
}

public function setStorage(MediaFileStorage $storage): void
{
$this->storage = $storage;
}

public function getFile(): ?File
{
return $this->file;
}

public function setFile(?File $file): void
{
$this->file = $file;
}

public function getOriginalName(): ?string
{
return $this->originalName;
}

public function setOriginalName(?string $originalName): void
{
$this->originalName = $originalName;
}
}
31 changes: 31 additions & 0 deletions src/Domain/Entity/ValueObject/MediaFileStorage.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

declare(strict_types=1);

namespace Skyeng\MarketingCmsBundle\Domain\Entity\ValueObject;

use Skyeng\MarketingCmsBundle\Domain\Traits\Exception\IncorrectValueObjectException;
use Skyeng\MarketingCmsBundle\Domain\Traits\ValueObjectTrait;

class MediaFileStorage
{
public const S3_STORAGE = 'uploads.s3';
public const NFS_STORAGE = 'uploads.nfs';

public const AVAILABLE_STORAGES = [
self::S3_STORAGE => self::S3_STORAGE,
self::NFS_STORAGE => self::NFS_STORAGE,
];

use ValueObjectTrait;

public function isS3(): bool
{
return $this->value === self::S3_STORAGE;
}

public function isNfs(): bool
{
return $this->value === self::NFS_STORAGE;
}
}
Loading