Skip to content

Commit

Permalink
Add dav plugin for rich workspaces
Browse files Browse the repository at this point in the history
Signed-off-by: Julius Härtl <jus@bitgrid.net>
  • Loading branch information
juliusknorr committed Nov 13, 2019
1 parent 35bdf79 commit 32f13da
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 20 deletions.
10 changes: 9 additions & 1 deletion appinfo/info.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
- **💾 Open format:** Files are saved as [Markdown](https://en.wikipedia.org/wiki/Markdown), so you can edit them from any other text app too.
- **✊ Strong foundation:** We use [🐈 tiptap](https://tiptap.scrumpy.io) which is based on [🦉 ProseMirror](https://prosemirror.net) – huge thanks to them!
]]></description>
<version>1.2.0</version>
<version>1.2.3</version>
<licence>agpl</licence>
<author mail="jus@bitgrid.net">Julius Härtl</author>
<namespace>Text</namespace>
Expand All @@ -23,10 +23,18 @@
<screenshot>https://raw.githubusercontent.com/nextcloud/text/master/img/screenshots/screenshot1.png</screenshot>
<screenshot>https://raw.githubusercontent.com/nextcloud/text/master/img/screenshots/screenshot2.png</screenshot>
<screenshot>https://raw.githubusercontent.com/nextcloud/text/master/img/screenshots/screenshot3.gff</screenshot>
<types>
<dav />
</types>
<dependencies>
<nextcloud min-version="18" max-version="18" />
</dependencies>
<background-jobs>
<job>OCA\Text\Cron\Cleanup</job>
</background-jobs>
<sabre>
<plugins>
<plugin>OCA\Text\DAV\WorkspacePlugin</plugin>
</plugins>
</sabre>
</info>
29 changes: 10 additions & 19 deletions lib/Controller/WorkspaceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@

use OCA\Text\AppInfo\Application;
use OCA\Text\Service\SessionService;
use OCA\Text\Service\WorkspaceService;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
Expand All @@ -68,17 +69,18 @@ class WorkspaceController extends OCSController {
/** @var IManager */
private $shareManager;

private const SUPPORTED_FILENAMES = [
'README.md',
'Readme.md',
'readme.md'
];
/** @var WorkspaceService */
private $workspaceService;

/** @var string */
private $userId;

public function __construct($appName, IRequest $request, IRootFolder $rootFolder, IManager $shareManager, $userId) {

public function __construct($appName, IRequest $request, IRootFolder $rootFolder, IManager $shareManager, WorkspaceService $workspaceService, $userId) {
parent::__construct($appName, $request);
$this->rootFolder = $rootFolder;
$this->shareManager = $shareManager;
$this->workspaceService = $workspaceService;
$this->userId = $userId;
}

Expand All @@ -92,7 +94,7 @@ public function folder(string $path = '/'): DataResponse {
try {
$folder = $this->rootFolder->getUserFolder($this->userId)->get($path);
if ($folder instanceof Folder) {
$file = $this->getFile($folder);
$file = $this->workspaceService->getFile($folder);
if ($file === null) {
return new DataResponse(['message' => 'No workspace file found'], Http::STATUS_NOT_FOUND);
}
Expand Down Expand Up @@ -122,7 +124,7 @@ public function publicFolder(string $shareToken, string $path = '/'): DataRespon
$share = $this->shareManager->getShareByToken($shareToken);
$folder = $share->getNode()->get($path);
if ($folder instanceof Folder) {
$file = $this->getFile($folder);
$file = $this->workspaceService->getFile($folder);
if ($file === null) {
return new DataResponse(['message' => 'No workspace file found'], Http::STATUS_NOT_FOUND);
}
Expand All @@ -143,15 +145,4 @@ public function publicFolder(string $shareToken, string $path = '/'): DataRespon
}
}

private function getFile(Folder $folder) {
$file = null;
foreach (self::SUPPORTED_FILENAMES as $filename) {
if ($folder->nodeExists($filename)) {
$file = $folder->get($filename);
continue;
}
}
return $file;
}

}
60 changes: 60 additions & 0 deletions lib/DAV/WorkspacePlugin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

namespace OCA\Text\DAV;


use OC\Files\Node\File;
use OCA\DAV\Connector\Sabre\Directory;
use OCA\DAV\Files\FilesHome;
use OCA\Text\Service\WorkspaceService;
use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;


class WorkspacePlugin extends ServerPlugin {

const WORKSPACE = '{http://nextcloud.org/ns}workspace';
/**
* @var Server
*/
private $server;

/**
* This initializes the plugin.
*
* This function is called by Sabre\DAV\Server, after
* addPlugin is called.
*
* This method should set up the required event subscriptions.
*
* @param Server $server
* @return void
*/
function initialize(Server $server) {
$this->server = $server;

$this->server->on('propFind', [$this, 'propFind']);
}


public function propFind(PropFind $propFind, INode $node) {
if (!$node instanceof Directory && !$node instanceof FilesHome) {
return;
}

$propFind->handle(self::WORKSPACE, function () use ($node) {
$folder = \OC::$server->getUserFolder()->getById($node->getId())[0];
/** @var WorkspaceService $workspaceService */
$workspaceService = \OC::$server->query(WorkspaceService::class);
/** @var File $file */
$file = $workspaceService->getFile($folder);
if ($file instanceof File) {
return $file->getContent();
}
});

}

}
31 changes: 31 additions & 0 deletions lib/Service/WorkspaceService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php


namespace OCA\Text\Service;


use OCP\Files\Folder;
use OCP\Files\NotFoundException;

class WorkspaceService {

private const SUPPORTED_FILENAMES = [
'README.md',
'Readme.md',
'readme.md'
];

public function getFile(Folder $folder) {
$file = null;
foreach (self::SUPPORTED_FILENAMES as $filename) {
if ($folder->nodeExists($filename)) {
try {
$file = $folder->get($filename);
} catch (NotFoundException $e) {
}
continue;
}
}
return $file;
}
}

0 comments on commit 32f13da

Please sign in to comment.