summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaxence Lange <maxence@artificial-owl.com>2019-07-17 20:34:28 -0100
committerMaxence Lange <maxence@artificial-owl.com>2019-07-17 20:34:28 -0100
commitf41c7efdbe93ce4b4ffbe39ec00a023f5f91e192 (patch)
treeb5917c73da4e25fc951c4d0e1c4464ee7e6856f5
parent31a5b21a6ea85d28903e90ca05f4b3e5922cd053 (diff)
2 sizes available
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
-rw-r--r--appinfo/routes.php2
-rw-r--r--lib/Controller/NavigationController.php48
-rw-r--r--lib/Db/CacheDocumentsRequest.php3
-rw-r--r--lib/Migration/Version0002Date20190717000001.php105
-rw-r--r--lib/Model/ActivityPub/Object/Document.php30
-rw-r--r--lib/Service/CacheDocumentService.php49
-rw-r--r--lib/Service/DocumentService.php25
7 files changed, 233 insertions, 29 deletions
diff --git a/appinfo/routes.php b/appinfo/routes.php
index 93f73171..32306f89 100644
--- a/appinfo/routes.php
+++ b/appinfo/routes.php
@@ -45,6 +45,8 @@ return [
],
['name' => 'Navigation#documentGet', 'url' => '/document/get', 'verb' => 'GET'],
['name' => 'Navigation#documentGetPublic', 'url' => '/document/public', 'verb' => 'GET'],
+ ['name' => 'Navigation#resizedGet', 'url' => '/document/get/resized', 'verb' => 'GET'],
+ ['name' => 'Navigation#resizedGetPublic', 'url' => '/document/public/resized', 'verb' => 'GET'],
['name' => 'ActivityPub#actor', 'url' => '/users/{username}', 'verb' => 'GET'],
['name' => 'ActivityPub#actorAlias', 'url' => '/@{username}/', 'verb' => 'GET'],
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());
}