Skip to content

Commit

Permalink
Implement direct editing API
Browse files Browse the repository at this point in the history
Signed-off-by: Raul <[email protected]>
  • Loading branch information
Raudius committed Aug 24, 2022
1 parent 46d811d commit eeda34b
Show file tree
Hide file tree
Showing 7 changed files with 421 additions and 0 deletions.
3 changes: 3 additions & 0 deletions lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
use OCA\Richdocuments\Listener\CSPListener;
use OCA\Richdocuments\Listener\LoadViewerListener;
use OCA\Richdocuments\Listener\ShareLinkListener;
use OCA\Richdocuments\Listeners\RegisterDirectEditorEventListener;
use OCA\Richdocuments\Middleware\WOPIMiddleware;
use OCA\Richdocuments\Listener\FileCreatedFromTemplateListener;
use OCA\Richdocuments\Preview\MSExcel;
Expand All @@ -45,6 +46,7 @@
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
use OCP\DirectEditing\RegisterDirectEditorEvent;
use OCP\Files\Template\FileCreatedFromTemplateEvent;
use OCP\Files\Template\ITemplateManager;
use OCP\Files\Template\TemplateFileCreator;
Expand All @@ -69,6 +71,7 @@ public function register(IRegistrationContext $context): void {
$context->registerEventListener(AddContentSecurityPolicyEvent::class, CSPListener::class);
$context->registerEventListener(LoadViewer::class, LoadViewerListener::class);
$context->registerEventListener(ShareLinkAccessedEvent::class, ShareLinkListener::class);
$context->registerEventListener(RegisterDirectEditorEvent::class, RegisterDirectEditorEventListener::class);
}

public function boot(IBootContext $context): void {
Expand Down
149 changes: 149 additions & 0 deletions lib/DirectEditing/DirectEditor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
<?php
/**
* @copyright Copyright (c) 2022 Raul Ferreira Fuentes <[email protected]>
*
* @author Raul Ferreira Fuentes <[email protected]>
*
* @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\Richdocuments\DirectEditing;

use OCA\Richdocuments\AppInfo\Application;
use OCA\Richdocuments\Capabilities;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\DirectEditing\IEditor;
use OCP\DirectEditing\IToken;
use OCP\Files\InvalidPathException;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\IInitialStateService;
use OCP\IL10N;

class DirectEditor implements IEditor {

/** @var IL10N */
private $l10n;

/** @var IInitialStateService */
private $initialStateService;

/** @var string[] */
private $mimetypes;


public function __construct(IL10N $l10n, IInitialStateService $initialStateService, Capabilities $capabilities) {
$this->l10n = $l10n;
$this->initialStateService = $initialStateService;
$this->mimetypes = $capabilities->getCapabilities()[Application::APPNAME]['mimetypes'];
}

/**
* Return a unique identifier for the editor
*
* e.g. richdocuments
*
* @return string
*/
public function getId(): string {
return Application::APPNAME;
}

/**
* Return a readable name for the editor
*
* e.g. Collabora Online
*
* @return string
*/
public function getName(): string {
return $this->l10n->t('Nextcloud Office');
}

/**
* A list of mimetypes that should open the editor by default
*
* @return array
*/
public function getMimetypes(): array {
return $this->mimetypes;
}

/**
* A list of mimetypes that can be opened in the editor optionally
*
* @return array
*/
public function getMimetypesOptional(): array {
return [];
}

/**
* Return a list of file creation options to be presented to the user
*
* @return array of ACreateFromTemplate|ACreateEmpty
*/
public function getCreators(): array {
return [
new GraphicsCreator($this->l10n),
new PresentationCreator($this->l10n),
new SpreadsheetCreator($this->l10n),
new TextCreator($this->l10n),
];
}

/**
* Return if the view is able to securely view a file without downloading it to the browser
*
* @return bool
*/
public function isSecure(): bool {
return true;
}

/**
* Return a template response for displaying the editor
*
* open can only be called once when the client requests the editor with a one-time-use token
* For handling editing and later requests, editors need to impelement their own token handling and take care of invalidation
*
* This behavior is similar to the current direct editing implementation in collabora where we generate a one-time token and switch over to the regular wopi token for the actual editing/saving process
*
* @param IToken $token
* @return Response
*/
public function open(IToken $token): Response {
$token->useTokenScope();
try {
$session = $this->apiService->create($token->getFile()->getId());
$this->initialStateService->provideInitialState('text', 'file', [
'fileId' => $token->getFile()->getId(),
'mimetype' => $token->getFile()->getMimeType(),
'content' => $token->getFile()->getContent(),
'session' => \json_encode($session->getData())
]);
$this->initialStateService->provideInitialState('text', 'directEditingToken', $token->getToken());
return new TemplateResponse(Application::APPNAME, 'main', [], 'base');
} catch (InvalidPathException $e) {
} catch (NotFoundException $e) {
} catch (NotPermittedException $e) {
}
return new NotFoundResponse();
}
}
55 changes: 55 additions & 0 deletions lib/DirectEditing/GraphicsCreator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php
/**
* @copyright Copyright (c) 2022 Raul Ferreira Fuentes <[email protected]>
*
* @author Raul Ferreira Fuentes <[email protected]>
*
* @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\Richdocuments\DirectEditing;

use OCP\DirectEditing\ACreateEmpty;
use OCP\IL10N;

class GraphicsCreator extends ACreateEmpty {

/**
* @var IL10N
*/
private $l10n;

public function __construct(IL10N $l10n) {
$this->l10n = $l10n;
}

public function getId(): string {
return 'richdocuments_graphics';
}

public function getName(): string {
return $this->l10n->t('diagram');
}

public function getExtension(): string {
return 'odg';
}

public function getMimetype(): string {
return 'application/vnd.oasis.opendocument.graphics';
}
}
55 changes: 55 additions & 0 deletions lib/DirectEditing/PresentationCreator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php
/**
* @copyright Copyright (c) 2022 Raul Ferreira Fuentes <[email protected]>
*
* @author Raul Ferreira Fuentes <[email protected]>
*
* @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\Richdocuments\DirectEditing;

use OCP\DirectEditing\ACreateEmpty;
use OCP\IL10N;

class PresentationCreator extends ACreateEmpty {

/**
* @var IL10N
*/
private $l10n;

public function __construct(IL10N $l10n) {
$this->l10n = $l10n;
}

public function getId(): string {
return 'richdocuments_presentation';
}

public function getName(): string {
return $this->l10n->t('presentation');
}

public function getExtension(): string {
return 'odp';
}

public function getMimetype(): string {
return 'application/vnd.oasis.opendocument.presentation';
}
}
55 changes: 55 additions & 0 deletions lib/DirectEditing/SpreadsheetCreator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php
/**
* @copyright Copyright (c) 2022 Raul Ferreira Fuentes <[email protected]>
*
* @author Raul Ferreira Fuentes <[email protected]>
*
* @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\Richdocuments\DirectEditing;

use OCP\DirectEditing\ACreateEmpty;
use OCP\IL10N;

class SpreadsheetCreator extends ACreateEmpty {

/**
* @var IL10N
*/
private $l10n;

public function __construct(IL10N $l10n) {
$this->l10n = $l10n;
}

public function getId(): string {
return 'richdocuments_spreadsheet';
}

public function getName(): string {
return $this->l10n->t('spreadsheet');
}

public function getExtension(): string {
return 'ods';
}

public function getMimetype(): string {
return 'application/vnd.oasis.opendocument.spreadsheet';
}
}
56 changes: 56 additions & 0 deletions lib/DirectEditing/TextCreator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php
/**
* @copyright Copyright (c) 2022 Raul Ferreira Fuentes <[email protected]>
*
* @author Raul Ferreira Fuentes <[email protected]>
*
* @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\Richdocuments\DirectEditing;

use OCP\DirectEditing\ACreateEmpty;
use OCP\IL10N;

class TextCreator extends ACreateEmpty {

/**
* @var IL10N
*/
private $l10n;

public function __construct(IL10N $l10n) {
$this->l10n = $l10n;
}

public function getId(): string {
return 'richdocuments_text';
}

public function getName(): string {
return $this->l10n->t('document');
}

public function getExtension(): string {
return 'odt';
}

public function getMimetype(): string {
return 'application/vnd.oasis.opendocument.text';
}
}
Loading

0 comments on commit eeda34b

Please sign in to comment.