diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Controller/NavigationController.php | 48 | ||||
-rw-r--r-- | lib/Db/CacheDocumentsRequest.php | 3 | ||||
-rw-r--r-- | lib/Migration/Version0002Date20190717000001.php | 105 | ||||
-rw-r--r-- | lib/Model/ActivityPub/Object/Document.php | 30 | ||||
-rw-r--r-- | lib/Service/CacheDocumentService.php | 49 | ||||
-rw-r--r-- | lib/Service/DocumentService.php | 25 |
6 files changed, 231 insertions, 29 deletions
diff --git a/lib/Controller/NavigationController.php b/lib/Controller/NavigationController.php index 331c7701..b9b256a0 100644 --- a/lib/Controller/NavigationController.php +++ b/lib/Controller/NavigationController.php @@ -34,6 +34,7 @@ use daita\MySmallPhpTools\Traits\Nextcloud\TNCDataResponse; use daita\MySmallPhpTools\Traits\TArrayTools; use Exception; use OC; +use OC\AppFramework\Http; use OC\User\NoUserException; use OCA\Social\AppInfo\Application; use OCA\Social\Exceptions\AccountAlreadyExistsException; @@ -139,7 +140,7 @@ class NavigationController extends Controller { 'firstrun' => false, 'setup' => false, 'isAdmin' => OC::$server->getGroupManager() - ->isAdmin($this->userId), + ->isAdmin($this->userId), 'cliUrl' => $this->getCliUrl() ] ]; @@ -289,18 +290,17 @@ class NavigationController extends Controller { * @return Response */ public function documentGet(string $id): Response { - try { $file = $this->documentService->getFromCache($id); - return new FileDisplayResponse($file); + return new FileDisplayResponse($file, Http::STATUS_OK); } catch (Exception $e) { return $this->fail($e); } } - /** + * * @PublicPage * @NoCSRFRequired * @@ -319,4 +319,44 @@ class NavigationController extends Controller { } } + + /** + * @NoAdminRequired + * @NoCSRFRequired + * + * @param string $id + * + * @return Response + */ + public function resizedGet(string $id): Response { + + try { + $file = $this->documentService->getResizedFromCache($id); + + return new FileDisplayResponse($file); + } catch (Exception $e) { + return $this->fail($e); + } + } + + + /** + * @PublicPage + * @NoCSRFRequired + * + * @param string $id + * + * @return Response + */ + public function resizedGetPublic(string $id): Response { + + try { + $file = $this->documentService->getResizedFromCache($id, true); + + return new FileDisplayResponse($file); + } catch (Exception $e) { + return $this->fail($e); + } + } + } diff --git a/lib/Db/CacheDocumentsRequest.php b/lib/Db/CacheDocumentsRequest.php index c8297599..bd7da9e9 100644 --- a/lib/Db/CacheDocumentsRequest.php +++ b/lib/Db/CacheDocumentsRequest.php @@ -56,6 +56,7 @@ class CacheDocumentsRequest extends CacheDocumentsRequestBuilder { ->setValue('mime_type', $qb->createNamedParameter($document->getMimeType())) ->setValue('error', $qb->createNamedParameter($document->getError())) ->setValue('local_copy', $qb->createNamedParameter($document->getLocalCopy())) + ->setValue('resized_copy', $qb->createNamedParameter($document->getResizedCopy())) ->setValue('parent_id', $qb->createNamedParameter($document->getParentId())) ->setValue('public', $qb->createNamedParameter(($document->isPublic()) ? '1' : '0')); @@ -86,6 +87,7 @@ class CacheDocumentsRequest extends CacheDocumentsRequestBuilder { ->set('mime_type', $qb->createNamedParameter($document->getMimeType())) ->set('error', $qb->createNamedParameter($document->getError())) ->set('local_copy', $qb->createNamedParameter($document->getLocalCopy())) + ->set('resized_copy', $qb->createNamedParameter($document->getResizedCopy())) ->set('parent_id', $qb->createNamedParameter($document->getParentId())) ->set('public', $qb->createNamedParameter(($document->isPublic()) ? '1' : '0')); @@ -127,6 +129,7 @@ class CacheDocumentsRequest extends CacheDocumentsRequestBuilder { $qb = $this->getCacheDocumentsUpdateSql(); $this->limitToIdString($qb, $document->getId()); $qb->set('local_copy', $qb->createNamedParameter($document->getLocalCopy())); + $qb->set('resized_copy', $qb->createNamedParameter($document->getResizedCopy())); $qb->set('error', $qb->createNamedParameter($document->getError())); $qb->execute(); diff --git a/lib/Migration/Version0002Date20190717000001.php b/lib/Migration/Version0002Date20190717000001.php new file mode 100644 index 00000000..7864e31b --- /dev/null +++ b/lib/Migration/Version0002Date20190717000001.php @@ -0,0 +1,105 @@ +<?php +declare(strict_types=1); + + +/** + * Nextcloud - Social Support + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Maxence Lange <maxence@artificial-owl.com> + * @copyright 2018, Maxence Lange <maxence@artificial-owl.com> + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + + +namespace OCA\Social\Migration; + + +use Closure; +use Doctrine\DBAL\Schema\SchemaException; +use Doctrine\DBAL\Types\Type; +use Exception; +use OCP\DB\ISchemaWrapper; +use OCP\IDBConnection; +use OCP\Migration\IOutput; +use OCP\Migration\SimpleMigrationStep; + + +/** + * Class Version0002Date20190717000001 + * + * @package OCA\Social\Migration + */ +class Version0002Date20190717000001 extends SimpleMigrationStep { + + + /** @var IDBConnection */ + private $connection; + + + /** + * @param IDBConnection $connection + */ + public function __construct(IDBConnection $connection) { + $this->connection = $connection; + } + + + /** + * @param IOutput $output + * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + * @param array $options + * + * @return ISchemaWrapper + * @throws SchemaException + */ + public function changeSchema(IOutput $output, Closure $schemaClosure, array $options + ): ISchemaWrapper { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + if (!$schema->hasTable('social_a2_cache_documts')) { + return $schema; + } + + $table = $schema->getTable('social_a2_cache_documts'); + if (!$table->hasColumn('resized_copy')) { + $table->addColumn( + 'resized_copy', Type::TEXT, + [ + 'notnull' => true + ] + ); + } + + return $schema; + } + + + /** + * @param IOutput $output + * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + * @param array $options + * + * @throws Exception + */ + public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) { + } + +} + diff --git a/lib/Model/ActivityPub/Object/Document.php b/lib/Model/ActivityPub/Object/Document.php index ca6e4a6f..6685fb62 100644 --- a/lib/Model/ActivityPub/Object/Document.php +++ b/lib/Model/ActivityPub/Object/Document.php @@ -59,6 +59,9 @@ class Document extends ACore implements JsonSerializable { /** @var string */ private $localCopy = ''; + /** @var string */ + private $resizedCopy = ''; + /** @var int */ private $caching = 0; @@ -141,6 +144,25 @@ class Document extends ACore implements JsonSerializable { /** + * @return string + */ + public function getResizedCopy(): string { + return $this->resizedCopy; + } + + /** + * @param string $resizedCopy + * + * @return Document + */ + public function setResizedCopy(string $resizedCopy): Document { + $this->resizedCopy = $resizedCopy; + + return $this; + } + + + /** * @return bool */ public function isPublic(): bool { @@ -244,6 +266,7 @@ class Document extends ACore implements JsonSerializable { $this->setPublic(($this->getInt('public', $data, 0) === 1) ? true : false); $this->setError($this->getInt('error', $data, 0)); $this->setLocalCopy($this->get('local_copy', $data, '')); + $this->setResizedCopy($this->get('resized_copy', $data, '')); $this->setMediaType($this->get('media_type', $data, '')); $this->setMimeType($this->get('mime_type', $data, '')); $this->setParentId($this->get('parent_id', $data, '')); @@ -266,9 +289,10 @@ class Document extends ACore implements JsonSerializable { $result = array_merge( parent::jsonSerialize(), [ - 'mediaType' => $this->getMediaType(), - 'mimeType' => $this->getMimeType(), - 'localCopy' => $this->getLocalCopy() + 'mediaType' => $this->getMediaType(), + 'mimeType' => $this->getMimeType(), + 'localCopy' => $this->getLocalCopy(), + 'resizedCopy' => $this->getResizedCopy() ] ); diff --git a/lib/Service/CacheDocumentService.php b/lib/Service/CacheDocumentService.php index 567c934d..b50b827e 100644 --- a/lib/Service/CacheDocumentService.php +++ b/lib/Service/CacheDocumentService.php @@ -47,6 +47,7 @@ use OCA\Social\Exceptions\RequestResultSizeException; use OCA\Social\Exceptions\RequestServerException; use OCA\Social\Exceptions\SocialAppConfigException; use OCA\Social\Exceptions\UnauthorizedFediverseException; +use OCA\Social\Model\ActivityPub\Object\Document; use OCP\Files\IAppData; use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; @@ -93,11 +94,9 @@ class CacheDocumentService { /** - * @param string $url - * + * @param Document $document * @param string $mime * - * @return string * @throws CacheContentMimeTypeException * @throws MalformedArrayException * @throws NotFoundException @@ -110,20 +109,8 @@ class CacheDocumentService { * @throws SocialAppConfigException * @throws UnauthorizedFediverseException */ - public function saveRemoteFileToCache(string $url, &$mime = '') { - - $filename = $this->uuid(); - - // creating a path aa/bb/cc/dd/ from the filename aabbccdd-0123-[...] - $path = chunk_split(substr($filename, 0, 8), 2, '/'); - - try { - $folder = $this->appData->getFolder($path); - } catch (NotFoundException $e) { - $folder = $this->appData->newFolder($path); - } - - $content = $this->retrieveContent($url); + public function saveRemoteFileToCache(Document $document, &$mime = '') { + $content = $this->retrieveContent($document->getUrl()); // To get the mime type, we create a temp file $tmpFile = tmpfile(); @@ -133,7 +120,33 @@ class CacheDocumentService { fclose($tmpFile); $this->filterMimeTypes($mime); + + $filename = $this->saveContentToCache($content); + $document->setLocalCopy($filename); $this->resizeImage($content); + $resized = $this->saveContentToCache($content); + $document->setResizedCopy($resized); + } + + + /** + * @param string $content + * + * @return string + * @throws NotPermittedException + * @throws NotFoundException + */ + private function saveContentToCache(string $content): string { + + $filename = $this->uuid(); + // creating a path aa/bb/cc/dd/ from the filename aabbccdd-0123-[...] + $path = chunk_split(substr($filename, 0, 8), 2, '/'); + + try { + $folder = $this->appData->getFolder($path); + } catch (NotFoundException $e) { + $folder = $this->appData->newFolder($path); + } $cache = $folder->newFile($filename); $cache->putContent($content); @@ -187,7 +200,7 @@ class CacheDocumentService { * @throws CacheContentException * @throws CacheDocumentDoesNotExistException */ - public function getContentFromCache(string $path) { + public function getContentFromCache(string $path): ISimpleFile { if ($path === '') { throw new CacheDocumentDoesNotExistException(); } diff --git a/lib/Service/DocumentService.php b/lib/Service/DocumentService.php index 4fedac0c..d9630955 100644 --- a/lib/Service/DocumentService.php +++ b/lib/Service/DocumentService.php @@ -143,9 +143,7 @@ class DocumentService { $this->cacheDocumentsRequest->initCaching($document); try { - $localCopy = $this->cacheService->saveRemoteFileToCache($document->getUrl(), $mime); - $document->setMimeType($mime); - $document->setLocalCopy($localCopy); + $this->cacheService->saveRemoteFileToCache($document, $mime); $this->cacheDocumentsRequest->endCaching($document); $this->streamRequest->updateAttachments($document); @@ -192,8 +190,26 @@ class DocumentService { /** * @param string $id + * @param bool $public * + * @return ISimpleFile + * @throws CacheContentException + * @throws CacheDocumentDoesNotExistException + * @throws MalformedArrayException + * @throws RequestResultNotJsonException + * @throws SocialAppConfigException + */ + public function getResizedFromCache(string $id, bool $public = false) { + $document = $this->cacheRemoteDocument($id, $public); + + return $this->cacheService->getContentFromCache($document->getResizedCopy()); + } + + + /** + * @param string $id * @param bool $public + * @param string $mimeType * * @return ISimpleFile * @throws CacheContentException @@ -202,8 +218,9 @@ class DocumentService { * @throws RequestResultNotJsonException * @throws SocialAppConfigException */ - public function getFromCache(string $id, bool $public = false) { + public function getFromCache(string $id, bool $public = false, string &$mimeType = '') { $document = $this->cacheRemoteDocument($id, $public); + $mimeType = $document->getMimeType(); return $this->cacheService->getContentFromCache($document->getLocalCopy()); } |