Skip to content

Commit

Permalink
file storage manager
Browse files Browse the repository at this point in the history
  • Loading branch information
yurikuzn committed Feb 9, 2017
1 parent b69f829 commit f49677b
Show file tree
Hide file tree
Showing 16 changed files with 363 additions and 33 deletions.
2 changes: 1 addition & 1 deletion application/Espo/Controllers/Attachment.php
Expand Up @@ -54,7 +54,7 @@ public function actionUpload($params, $data, $request)

$attachment = $this->getEntityManager()->getEntity('Attachment');
$this->getEntityManager()->saveEntity($attachment);
$this->getContainer()->get('fileManager')->putContents('data/upload/' . $attachment->id, $contents);
$this->getContainer()->get('fileStorageManager')->putContents($attachment, $contents);

return array(
'attachmentId' => $attachment->id
Expand Down
6 changes: 3 additions & 3 deletions application/Espo/Controllers/Import.php
Expand Up @@ -68,9 +68,9 @@ public function actionRemoveLink($params, $data, $request)
throw new BadRequest();
}

protected function getFileManager()
protected function getFileStorageManager()
{
return $this->getContainer()->get('fileManager');
return $this->getContainer()->get('fileStorageManager');
}

protected function getEntityManager()
Expand All @@ -92,7 +92,7 @@ public function actionUploadFile($params, $data, $request)
$attachment->set('name', 'import-file.csv');
$this->getEntityManager()->saveEntity($attachment);

$this->getFileManager()->putContents('data/upload/' . $attachment->id, $contents);
$this->getFileStorageManager()->putContents($attachment, $contents);

return array(
'attachmentId' => $attachment->id
Expand Down
8 changes: 8 additions & 0 deletions application/Espo/Core/Container.php
Expand Up @@ -128,6 +128,14 @@ protected function loadSlim()
return new \Espo\Core\Utils\Api\Slim();
}

protected function loadFileStorageManager()
{
return new \Espo\Core\FileStorage\Manager(
$this->get('metadata')->get(['app', 'fileStorage', 'implementationClassNameMap']),
$this
);
}

protected function loadFileManager()
{
return new \Espo\Core\Utils\File\Manager(
Expand Down
103 changes: 103 additions & 0 deletions application/Espo/Core/FileStorage/Manager.php
@@ -0,0 +1,103 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2017 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/

namespace Espo\Core\FileStorage;

use \Espo\Entities\Attachment;

use \Espo\Core\Exceptions\Error;

class Manager
{
private $implementations = array();

private $implementationClassNameMap = array();

private $container;

public function __construct(array $implementationClassNameMap, $container)
{
$this->implementationClassNameMap = $implementationClassNameMap;
$this->container = $container;
}

private function getImplementation($storage = null)
{
if (!$storage) {
$storage = 'EspoUploadDir';
}

if (array_key_exists($storage, $this->implementations)) {
return $this->implementations[$storage];
}

if (!array_key_exists($storage, $this->implementationClassNameMap)) {
throw new Error("FileStorageManager: Unknown storage '{$storage}'");
}
$className = $this->implementationClassNameMap[$storage];

$implementation = new $className();
foreach ($implementation->getDependencyList() as $dependencyName) {
$implementation->inject($dependencyName, $this->container->get($dependencyName));
}
$this->implementations[$storage] = $implementation;

return $implementation;
}

public function isFile(Attachment $attachment)
{
$implementation = $this->getImplementation($attachment->get('storage'));
return $implementation->isFile($attachment);
}

public function getContents(Attachment $attachment)
{
$implementation = $this->getImplementation($attachment->get('storage'));
return $implementation->getContents($attachment);
}

public function putContents(Attachment $attachment, $contents)
{
$implementation = $this->getImplementation($attachment->get('storage'));
return $implementation->putContents($attachment, $contents);
}

public function unlink(Attachment $attachment)
{
$implementation = $this->getImplementation($attachment->get('storage'));
return $implementation->unlink($attachment);
}

public function getLocalFilePath(Attachment $attachment)
{
$implementation = $this->getImplementation($attachment->get('storage'));
return $implementation->getLocalFilePath($attachment);
}
}
85 changes: 85 additions & 0 deletions application/Espo/Core/FileStorage/Storages/Base.php
@@ -0,0 +1,85 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2017 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/

namespace Espo\Core\FileStorage\Storages;

use \Espo\Core\Interfaces\Injectable;

abstract class Base implements Injectable
{
protected $dependencyList = [];

protected $injections = array();

public function inject($name, $object)
{
$this->injections[$name] = $object;
}

public function __construct()
{
$this->init();
}

protected function init()
{
}

protected function getInjection($name)
{
return $this->injections[$name];
}

protected function addDependency($name)
{
$this->dependencyList[] = $name;
}

protected function addDependencyList(array $list)
{
foreach ($list as $item) {
$this->addDependency($item);
}
}

public function getDependencyList()
{
return $this->dependencyList;
}

abstract public function unlink(\Espo\Entities\Attachment $attachment);

abstract public function getContents(\Espo\Entities\Attachment $attachment);

abstract public function isFile(\Espo\Entities\Attachment $attachment);

abstract public function putContents(\Espo\Entities\Attachment $attachment, $contents);

abstract public function getLocalFilePath(\Espo\Entities\Attachment $attachment);
}
73 changes: 73 additions & 0 deletions application/Espo/Core/FileStorage/Storages/EspoUploadDir.php
@@ -0,0 +1,73 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2017 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/

namespace Espo\Core\FileStorage\Storages;

use \Espo\Entities\Attachment;

class EspoUploadDir extends Base
{
protected $dependencyList = ['fileManager'];

protected function getFileManager()
{
return $this->getInjection('fileManager');
}

public function unlink(Attachment $attachment)
{
return $this->getFileManager()->unlink($this->getFilePath($attachment));
}

public function isFile(Attachment $attachment)
{
return $this->getFileManager()->isFile($this->getFilePath($attachment));
}

public function getContents(Attachment $attachment)
{
return $this->getFileManager()->getContents($this->getFilePath($attachment));
}

public function putContents(Attachment $attachment, $contents)
{
return $this->getFileManager()->putContents($this->getFilePath($attachment), $contents);
}

public function getLocalFilePath(Attachment $attachment)
{
return $this->getFilePath($attachment);
}

protected function getFilePath(Attachment $attachment)
{
$sourceId = $attachment->getSourceId();
return 'data/upload/' . $sourceId;
}
}
26 changes: 23 additions & 3 deletions application/Espo/Core/Htmlizer/Htmlizer.php
Expand Up @@ -48,19 +48,27 @@ class Htmlizer

protected $acl;

public function __construct(FileManager $fileManager, DateTime $dateTime, NumberUtil $number, $acl = null)
protected $entityManager;

public function __construct(FileManager $fileManager, DateTime $dateTime, NumberUtil $number, $acl = null, $entityManager = null)
{
$this->fileManager = $fileManager;
$this->dateTime = $dateTime;
$this->number = $number;
$this->acl = $acl;
$this->entityManager = $entityManager;
}

protected function getAcl()
{
return $this->acl;
}

protected function getEntityManager()
{
return $this->entityManager;
}

protected function format($value)
{
if (is_float($value)) {
Expand Down Expand Up @@ -163,7 +171,8 @@ public function render(Entity $entity, $template, $id = null, $additionalData =
'helpers' => [
'file' => function ($context, $options) {
if (count($context) && $context[0]) {
return 'data/upload/'.$context[0];
$id = $context[0];
return "?entryPoint=attachment&id=" . $id;
}
}
]
Expand Down Expand Up @@ -192,8 +201,19 @@ public function render(Entity $entity, $template, $id = null, $additionalData =

$html = $renderer($data);


$html = str_replace('?entryPoint=attachment&amp;', '?entryPoint=attachment&', $html);
$html = preg_replace('/\?entryPoint=attachment\&id=(.*)/', 'data/upload/$1', $html);
$html = preg_replace_callback('/\?entryPoint=attachment\&id=([A-Za-z0-9]*)/', function ($matches) {
if (!$this->getEntityManager()) return $matches[0];

$id = $matches[1];
$attachment = $this->getEntityManager()->getEntity('Attachment', $id);

if ($attachment) {
$filePath = $this->getEntityManager()->getRepository('Attachment')->getFilePath($attachment);
return $filePath;
}
}, $html);

return $html;
}
Expand Down

0 comments on commit f49677b

Please sign in to comment.