From 497440477492b6e7df8ca1eb6c79eb7100a2fe24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Tue, 12 Jan 2021 11:28:04 +0100 Subject: files: Create files from template API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- apps/files/appinfo/routes.php | 15 +++++ apps/files/composer/composer/autoload_classmap.php | 1 + apps/files/composer/composer/autoload_static.php | 1 + apps/files/lib/Controller/TemplateController.php | 76 ++++++++++++++++++++++ apps/files/lib/Controller/ViewController.php | 14 +++- apps/files/tests/Controller/ViewControllerTest.php | 10 +++ 6 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 apps/files/lib/Controller/TemplateController.php (limited to 'apps/files') diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php index 65c8deb4427..03a025cadf5 100644 --- a/apps/files/appinfo/routes.php +++ b/apps/files/appinfo/routes.php @@ -138,6 +138,21 @@ $application->registerRoutes( 'url' => '/api/v1/directEditing/create', 'verb' => 'POST' ], + [ + 'name' => 'Template#list', + 'url' => '/api/v1/templates', + 'verb' => 'GET' + ], + [ + 'name' => 'Template#create', + 'url' => '/api/v1/templates/create', + 'verb' => 'POST' + ], + [ + 'name' => 'Template#path', + 'url' => '/api/v1/templates/path', + 'verb' => 'POST' + ], [ 'name' => 'TransferOwnership#transfer', 'url' => '/api/v1/transferownership', diff --git a/apps/files/composer/composer/autoload_classmap.php b/apps/files/composer/composer/autoload_classmap.php index 53fccf702bf..bc2e496294b 100644 --- a/apps/files/composer/composer/autoload_classmap.php +++ b/apps/files/composer/composer/autoload_classmap.php @@ -35,6 +35,7 @@ return array( 'OCA\\Files\\Controller\\ApiController' => $baseDir . '/../lib/Controller/ApiController.php', 'OCA\\Files\\Controller\\DirectEditingController' => $baseDir . '/../lib/Controller/DirectEditingController.php', 'OCA\\Files\\Controller\\DirectEditingViewController' => $baseDir . '/../lib/Controller/DirectEditingViewController.php', + 'OCA\\Files\\Controller\\TemplateController' => $baseDir . '/../lib/Controller/TemplateController.php', 'OCA\\Files\\Controller\\TransferOwnershipController' => $baseDir . '/../lib/Controller/TransferOwnershipController.php', 'OCA\\Files\\Controller\\ViewController' => $baseDir . '/../lib/Controller/ViewController.php', 'OCA\\Files\\Db\\TransferOwnership' => $baseDir . '/../lib/Db/TransferOwnership.php', diff --git a/apps/files/composer/composer/autoload_static.php b/apps/files/composer/composer/autoload_static.php index 635ed27c1bb..ba39b2c5707 100644 --- a/apps/files/composer/composer/autoload_static.php +++ b/apps/files/composer/composer/autoload_static.php @@ -50,6 +50,7 @@ class ComposerStaticInitFiles 'OCA\\Files\\Controller\\ApiController' => __DIR__ . '/..' . '/../lib/Controller/ApiController.php', 'OCA\\Files\\Controller\\DirectEditingController' => __DIR__ . '/..' . '/../lib/Controller/DirectEditingController.php', 'OCA\\Files\\Controller\\DirectEditingViewController' => __DIR__ . '/..' . '/../lib/Controller/DirectEditingViewController.php', + 'OCA\\Files\\Controller\\TemplateController' => __DIR__ . '/..' . '/../lib/Controller/TemplateController.php', 'OCA\\Files\\Controller\\TransferOwnershipController' => __DIR__ . '/..' . '/../lib/Controller/TransferOwnershipController.php', 'OCA\\Files\\Controller\\ViewController' => __DIR__ . '/..' . '/../lib/Controller/ViewController.php', 'OCA\\Files\\Db\\TransferOwnership' => __DIR__ . '/..' . '/../lib/Db/TransferOwnership.php', diff --git a/apps/files/lib/Controller/TemplateController.php b/apps/files/lib/Controller/TemplateController.php new file mode 100644 index 00000000000..69d2790df1a --- /dev/null +++ b/apps/files/lib/Controller/TemplateController.php @@ -0,0 +1,76 @@ + + * + * @author Julius Härtl + * + * @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 . + * + */ + +declare(strict_types=1); + +namespace OCA\Files\Controller; + +use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\OCS\OCSForbiddenException; +use OCP\AppFramework\OCSController; +use OCP\Files\GenericFileException; +use OCP\Files\Template\ITemplateManager; +use OCP\IRequest; + +class TemplateController extends OCSController { + protected $templateManager; + + public function __construct($appName, IRequest $request, ITemplateManager $templateManager) { + parent::__construct($appName, $request); + $this->templateManager = $templateManager; + } + + /** + * @NoAdminRequired + */ + public function list(): DataResponse { + return new DataResponse($this->templateManager->listCreators()); + } + + /** + * @NoAdminRequired + * @throws OCSForbiddenException + */ + public function create(string $filePath, string $templatePath = '', string $templateType = 'user'): DataResponse { + try { + return new DataResponse($this->templateManager->createFromTemplate($filePath, $templatePath, $templateType)); + } catch (GenericFileException $e) { + throw new OCSForbiddenException($e->getMessage()); + } + } + + /** + * @NoAdminRequired + */ + public function path(string $templatePath = '', bool $copySystemTemplates = false) { + try { + $this->templateManager->setTemplatePath($templatePath); + if ($copySystemTemplates) { + $this->templateManager->initializeTemplateDirectory($templatePath); + } + return new DataResponse(); + } catch (GenericFileException $e) { + throw new OCSForbiddenException($e->getMessage()); + } + } +} diff --git a/apps/files/lib/Controller/ViewController.php b/apps/files/lib/Controller/ViewController.php index 364735437e4..124363f07bb 100644 --- a/apps/files/lib/Controller/ViewController.php +++ b/apps/files/lib/Controller/ViewController.php @@ -44,10 +44,12 @@ use OCP\AppFramework\Http\ContentSecurityPolicy; use OCP\AppFramework\Http\RedirectResponse; use OCP\AppFramework\Http\Response; use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Services\IInitialState; use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Folder; use OCP\Files\IRootFolder; use OCP\Files\NotFoundException; +use OCP\Files\Template\ITemplateManager; use OCP\IConfig; use OCP\IL10N; use OCP\IRequest; @@ -80,6 +82,10 @@ class ViewController extends Controller { protected $rootFolder; /** @var Helper */ protected $activityHelper; + /** @var IInitialState */ + private $initialState; + /** @var ITemplateManager */ + private $templateManager; public function __construct(string $appName, IRequest $request, @@ -90,7 +96,9 @@ class ViewController extends Controller { IUserSession $userSession, IAppManager $appManager, IRootFolder $rootFolder, - Helper $activityHelper + Helper $activityHelper, + IInitialState $initialState, + ITemplateManager $templateManager ) { parent::__construct($appName, $request); $this->appName = $appName; @@ -103,6 +111,8 @@ class ViewController extends Controller { $this->appManager = $appManager; $this->rootFolder = $rootFolder; $this->activityHelper = $activityHelper; + $this->initialState = $initialState; + $this->templateManager = $templateManager; } /** @@ -283,6 +293,8 @@ class ViewController extends Controller { if (class_exists(LoadViewer::class)) { $this->eventDispatcher->dispatchTyped(new LoadViewer()); } + $this->initialState->provideInitialState('template_path', $this->templateManager->hasTemplateDirectory() ? $this->templateManager->getTemplatePath() : null); + $this->initialState->provideInitialState('templates', $this->templateManager->listCreators()); $params = []; $params['usedSpacePercent'] = (int) $storageInfo['relative']; diff --git a/apps/files/tests/Controller/ViewControllerTest.php b/apps/files/tests/Controller/ViewControllerTest.php index fc2b82de9c8..bc233599e34 100644 --- a/apps/files/tests/Controller/ViewControllerTest.php +++ b/apps/files/tests/Controller/ViewControllerTest.php @@ -36,10 +36,12 @@ use OCA\Files\Activity\Helper; use OCA\Files\Controller\ViewController; use OCP\App\IAppManager; use OCP\AppFramework\Http; +use OCP\AppFramework\Services\IInitialState; use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\File; use OCP\Files\Folder; use OCP\Files\IRootFolder; +use OCP\Files\Template\ITemplateManager; use OCP\IConfig; use OCP\IL10N; use OCP\IRequest; @@ -78,6 +80,10 @@ class ViewControllerTest extends TestCase { private $rootFolder; /** @var Helper|\PHPUnit\Framework\MockObject\MockObject */ private $activityHelper; + /** @var IInitialState|\PHPUnit\Framework\MockObject\MockObject */ + private $initialState; + /** @var ITemplateManager|\PHPUnit\Framework\MockObject\MockObject */ + private $templateManager; protected function setUp(): void { parent::setUp(); @@ -97,6 +103,8 @@ class ViewControllerTest extends TestCase { ->willReturn($this->user); $this->rootFolder = $this->getMockBuilder('\OCP\Files\IRootFolder')->getMock(); $this->activityHelper = $this->createMock(Helper::class); + $this->initialState = $this->createMock(IInitialState::class); + $this->templateManager = $this->createMock(ITemplateManager::class); $this->viewController = $this->getMockBuilder('\OCA\Files\Controller\ViewController') ->setConstructorArgs([ 'files', @@ -109,6 +117,8 @@ class ViewControllerTest extends TestCase { $this->appManager, $this->rootFolder, $this->activityHelper, + $this->initialState, + $this->templateManager, ]) ->setMethods([ 'getStorageInfo', -- cgit v1.2.3