Rewrite app
This commit is contained in:
parent
3abce1dd99
commit
174ffd462e
@ -1,20 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ownCloud - Epubreader App
|
|
||||||
*
|
|
||||||
* @author Frank de Lange
|
|
||||||
* @copyright 2015 - 2017 Frank de Lange
|
|
||||||
*
|
|
||||||
* This file is licensed under the Affero General Public License version 3 or
|
|
||||||
* later.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace OCA\Epubreader\AppInfo;
|
|
||||||
|
|
||||||
use OCP\Util;
|
|
||||||
|
|
||||||
$l = \OC::$server->getL10N('epubreader');
|
|
||||||
|
|
||||||
\OCA\Epubreader\Hooks::register();
|
|
||||||
Util::addscript('epubreader', 'plugin');
|
|
30
lib/AppInfo/Application.php
Normal file
30
lib/AppInfo/Application.php
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ownCloud - Epubreader App
|
||||||
|
*
|
||||||
|
* @author Frank de Lange
|
||||||
|
* @copyright 2015 - 2017 Frank de Lange
|
||||||
|
*
|
||||||
|
* This file is licensed under the Affero General Public License version 3 or
|
||||||
|
* later.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace OCA\Epubreader\AppInfo;
|
||||||
|
|
||||||
|
use OCA\Epubreader\Hooks;
|
||||||
|
use OCP\AppFramework\App;
|
||||||
|
use OCP\Util;
|
||||||
|
|
||||||
|
class Application extends App {
|
||||||
|
|
||||||
|
public const APP_ID = 'epubreader';
|
||||||
|
|
||||||
|
public function __construct() {
|
||||||
|
parent::__construct(self::APP_ID);
|
||||||
|
|
||||||
|
$l = \OC::$server->getL10N('epubreader');
|
||||||
|
Hooks::register();
|
||||||
|
Util::addscript('epubreader', 'plugin');
|
||||||
|
}
|
||||||
|
}
|
@ -75,15 +75,15 @@ class PageController extends Controller {
|
|||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* $fileInfo = [
|
* @var array{
|
||||||
* fileId => null,
|
* fileId: int,
|
||||||
* fileName => null,
|
* fileName: string,
|
||||||
* fileType => null
|
* fileType: string
|
||||||
* ];
|
* } $fileInfo
|
||||||
*/
|
*/
|
||||||
$fileInfo = $this->getFileInfo($this->request->getParam('file'));
|
$fileInfo = $this->getFileInfo((string) $this->request->getParam('file'));
|
||||||
$fileId = $fileInfo['fileId'];
|
$fileId = $fileInfo['fileId'];
|
||||||
$type = $this->request->getParam('type');
|
$type = (string) $this->request->getParam('type');
|
||||||
$scope = $template = $templates[$type];
|
$scope = $template = $templates[$type];
|
||||||
|
|
||||||
$params = [
|
$params = [
|
||||||
@ -139,7 +139,7 @@ class PageController extends Controller {
|
|||||||
if ($type == FileInfo::TYPE_FOLDER && $node instanceof Folder) {
|
if ($type == FileInfo::TYPE_FOLDER && $node instanceof Folder) {
|
||||||
$query = [];
|
$query = [];
|
||||||
parse_str(parse_url($path, PHP_URL_QUERY), $query);
|
parse_str(parse_url($path, PHP_URL_QUERY), $query);
|
||||||
if (isset($query['path'])) {
|
if (isset($query['path']) && is_string($query['path'])) {
|
||||||
$node = $node->get($query['path']);
|
$node = $node->get($query['path']);
|
||||||
} else {
|
} else {
|
||||||
throw new NotFoundException('Shared file path or name not set');
|
throw new NotFoundException('Shared file path or name not set');
|
||||||
@ -150,11 +150,11 @@ class PageController extends Controller {
|
|||||||
} else {
|
} else {
|
||||||
$filePath = $path;
|
$filePath = $path;
|
||||||
$fileId = $this->rootFolder->getUserFolder($this->userId)
|
$fileId = $this->rootFolder->getUserFolder($this->userId)
|
||||||
->get(preg_replace("/.*\/remote.php\/webdav(.*)/", "$1", rawurldecode($this->request->getParam('file'))))
|
->get(preg_replace("/.*\/remote.php\/webdav(.*)/", "$1", rawurldecode((string) $this->request->getParam('file'))))
|
||||||
->getId();
|
->getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var array<string> $pathInfo */
|
/** @var string[] $pathInfo */
|
||||||
$pathInfo = pathInfo($filePath);
|
$pathInfo = pathInfo($filePath);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
@ -57,10 +57,8 @@ class PreferenceController extends Controller {
|
|||||||
* @param int $fileId
|
* @param int $fileId
|
||||||
* @param string $name
|
* @param string $name
|
||||||
* @param string $value
|
* @param string $value
|
||||||
*
|
|
||||||
* @return array|\OCP\AppFramework\Http\JSONResponse
|
|
||||||
*/
|
*/
|
||||||
public function set(string $scope, int $fileId, string $name, string $value) {
|
public function set(string $scope, int $fileId, string $name, string $value): JSONResponse {
|
||||||
return new JSONResponse($this->preferenceService->set($scope, $fileId, $name, $value));
|
return new JSONResponse($this->preferenceService->set($scope, $fileId, $name, $value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,10 +34,10 @@ class SettingsController extends Controller {
|
|||||||
Config::set('pdf_enable', $PdfEnable);
|
Config::set('pdf_enable', $PdfEnable);
|
||||||
Config::set('cbx_enable', $CbxEnable);
|
Config::set('cbx_enable', $CbxEnable);
|
||||||
|
|
||||||
$response = array(
|
$response = [
|
||||||
'data' => array('message' => $l->t('Settings updated successfully.')),
|
'data' => ['message' => $l->t('Settings updated successfully.')],
|
||||||
'status' => 'success'
|
'status' => 'success'
|
||||||
);
|
];
|
||||||
|
|
||||||
return new JSONResponse($response);
|
return new JSONResponse($response);
|
||||||
}
|
}
|
||||||
|
@ -12,12 +12,20 @@ namespace OCA\Epubreader\Db;
|
|||||||
|
|
||||||
use OCP\AppFramework\Db\Entity;
|
use OCP\AppFramework\Db\Entity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @psalm-type SerializedEntity = array<string|int|array>
|
||||||
|
*/
|
||||||
abstract class ReaderEntity extends Entity {
|
abstract class ReaderEntity extends Entity {
|
||||||
|
|
||||||
protected int $lastModified; // modification timestamp
|
protected int $lastModified; // modification timestamp
|
||||||
|
|
||||||
/* returns decoded json if input is json, otherwise returns input */
|
/**
|
||||||
|
* returns decoded json if input is json, otherwise returns input
|
||||||
|
*
|
||||||
|
* @return string|array
|
||||||
|
*/
|
||||||
public static function conditional_json_decode(string $el): mixed {
|
public static function conditional_json_decode(string $el): mixed {
|
||||||
|
/** @var array $result */
|
||||||
$result = json_decode($el);
|
$result = json_decode($el);
|
||||||
if (json_last_error() === JSON_ERROR_NONE) {
|
if (json_last_error() === JSON_ERROR_NONE) {
|
||||||
return $result;
|
return $result;
|
||||||
@ -34,5 +42,13 @@ abstract class ReaderEntity extends Entity {
|
|||||||
$this->lastModified = $lastModified;
|
$this->lastModified = $lastModified;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @psalm-return SerializedEntity
|
||||||
|
*/
|
||||||
abstract public function toService(): array;
|
abstract public function toService(): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @psalm-return SerializedEntity
|
||||||
|
*/
|
||||||
|
abstract public function jsonSerialize(): array;
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ use OCP\Util;
|
|||||||
class Hooks {
|
class Hooks {
|
||||||
|
|
||||||
public static function register(): void {
|
public static function register(): void {
|
||||||
|
/** @psalm-suppress DeprecatedMethod */
|
||||||
Util::connectHook('\OCP\Config', 'js', 'OCA\Epubreader\Hooks', 'announce_settings');
|
Util::connectHook('\OCP\Config', 'js', 'OCA\Epubreader\Hooks', 'announce_settings');
|
||||||
|
|
||||||
\OC::$server->getRootFolder()->listen('\OC\Files', 'preDelete', function (Node $node) {
|
\OC::$server->getRootFolder()->listen('\OC\Files', 'preDelete', function (Node $node) {
|
||||||
@ -35,12 +36,20 @@ class Hooks {
|
|||||||
public static function announce_settings(array $settings): void {
|
public static function announce_settings(array $settings): void {
|
||||||
// Nextcloud encodes this as JSON, Owncloud does not (yet) (#75)
|
// Nextcloud encodes this as JSON, Owncloud does not (yet) (#75)
|
||||||
// TODO: rmeove this when Owncloud starts encoding oc_appconfig as JSON just like it already encodes most other properties
|
// TODO: rmeove this when Owncloud starts encoding oc_appconfig as JSON just like it already encodes most other properties
|
||||||
$isJson = self::isJson($settings['array']['oc_appconfig']);
|
if (array_key_exists('array', $settings) &&
|
||||||
$array = ($isJson) ? json_decode($settings['array']['oc_appconfig'], true) : $settings['array']['oc_appconfig'];
|
is_array($settings['array']) &&
|
||||||
$array['filesReader']['enableEpub'] = Config::get('epub_enable', 'true');
|
array_key_exists('oc_appconfig', $settings['array'])
|
||||||
$array['filesReader']['enablePdf'] = Config::get('pdf_enable', 'true');
|
) {
|
||||||
$array['filesReader']['enableCbx'] = Config::get('cbx_enable', 'true');
|
$isJson = self::isJson($settings['array']['oc_appconfig']);
|
||||||
$settings['array']['oc_appconfig'] = ($isJson) ? json_encode($array) : $array;
|
/** @var array $array */
|
||||||
|
$array = ($isJson) ? json_decode((string) $settings['array']['oc_appconfig'], true) : $settings['array']['oc_appconfig'];
|
||||||
|
$array['filesReader'] = [
|
||||||
|
'enableEpub' => Config::get('epub_enable', 'true'),
|
||||||
|
'enablePdf' => Config::get('pdf_enable', 'true'),
|
||||||
|
'enableCbx' => Config::get('cbx_enable', 'true'),
|
||||||
|
];
|
||||||
|
$settings['array']['oc_appconfig'] = ($isJson) ? json_encode($array) : $array;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function deleteFile(IDBConnection $connection, int $fileId): void {
|
protected static function deleteFile(IDBConnection $connection, int $fileId): void {
|
||||||
|
@ -13,6 +13,9 @@ namespace OCA\Epubreader\Service;
|
|||||||
use OCA\Epubreader\Db\BookmarkMapper;
|
use OCA\Epubreader\Db\BookmarkMapper;
|
||||||
use OCA\Epubreader\Db\ReaderEntity;
|
use OCA\Epubreader\Db\ReaderEntity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @psalm-import-type SerializedEntity from ReaderEntity
|
||||||
|
*/
|
||||||
class BookmarkService extends Service {
|
class BookmarkService extends Service {
|
||||||
|
|
||||||
// "bookmark" name to use for the cursor (current reading position)
|
// "bookmark" name to use for the cursor (current reading position)
|
||||||
@ -34,11 +37,13 @@ class BookmarkService extends Service {
|
|||||||
* @param int $fileId
|
* @param int $fileId
|
||||||
* @param ?string $name
|
* @param ?string $name
|
||||||
* @param ?string $type
|
* @param ?string $type
|
||||||
|
*
|
||||||
|
* @psalm-return SerializedEntity[]
|
||||||
*/
|
*/
|
||||||
public function get($fileId, ?string $name = null, ?string $type = null): array {
|
public function get($fileId, ?string $name = null, ?string $type = null): array {
|
||||||
$result = $this->bookmarkMapper->get($fileId, $name, $type);
|
$result = $this->bookmarkMapper->get($fileId, $name, $type);
|
||||||
return array_map(
|
return array_map(
|
||||||
function (ReaderEntity $entity) {
|
function (ReaderEntity $entity): array {
|
||||||
return $entity->toService();
|
return $entity->toService();
|
||||||
}, $result);
|
}, $result);
|
||||||
}
|
}
|
||||||
@ -62,9 +67,11 @@ class BookmarkService extends Service {
|
|||||||
* @brief get cursor (current position in book)
|
* @brief get cursor (current position in book)
|
||||||
*
|
*
|
||||||
* @param int $fileId
|
* @param int $fileId
|
||||||
|
*
|
||||||
|
* @psalm-return SerializedEntity
|
||||||
*/
|
*/
|
||||||
public function getCursor(int $fileId): array {
|
public function getCursor(int $fileId): array {
|
||||||
$result = $this->get($fileId, static::CURSOR);
|
$result = $this->get($fileId, self::CURSOR);
|
||||||
if (count($result) === 1) {
|
if (count($result) === 1) {
|
||||||
return $result[0];
|
return $result[0];
|
||||||
}
|
}
|
||||||
@ -78,7 +85,7 @@ class BookmarkService extends Service {
|
|||||||
* @param string $value
|
* @param string $value
|
||||||
*/
|
*/
|
||||||
public function setCursor(int $fileId, string $value): ReaderEntity {
|
public function setCursor(int $fileId, string $value): ReaderEntity {
|
||||||
return $this->bookmarkMapper->set($fileId, static::CURSOR, $value, static::bookmark_type);
|
return $this->bookmarkMapper->set($fileId, self::CURSOR, $value, self::bookmark_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -100,6 +107,6 @@ class BookmarkService extends Service {
|
|||||||
* @param int $fileId
|
* @param int $fileId
|
||||||
*/
|
*/
|
||||||
public function deleteCursor(int $fileId): void {
|
public function deleteCursor(int $fileId): void {
|
||||||
$this->delete($fileId, static::CURSOR, static::bookmark_type);
|
$this->delete($fileId, self::CURSOR, self::bookmark_type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,9 @@ namespace OCA\Epubreader\Service;
|
|||||||
use OCA\Epubreader\Db\PreferenceMapper;
|
use OCA\Epubreader\Db\PreferenceMapper;
|
||||||
use OCA\Epubreader\Db\ReaderEntity;
|
use OCA\Epubreader\Db\ReaderEntity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @psalm-import-type SerializedEntity from ReaderEntity
|
||||||
|
*/
|
||||||
class PreferenceService extends Service {
|
class PreferenceService extends Service {
|
||||||
|
|
||||||
// (ab)use the fact that $fileId never goes below 1 by using the
|
// (ab)use the fact that $fileId never goes below 1 by using the
|
||||||
@ -39,12 +42,12 @@ class PreferenceService extends Service {
|
|||||||
* @param int $fileId
|
* @param int $fileId
|
||||||
* @param ?string $name
|
* @param ?string $name
|
||||||
*
|
*
|
||||||
* @return array
|
* @psalm-return SerializedEntity
|
||||||
*/
|
*/
|
||||||
public function get(string $scope, int $fileId, ?string $name = null): array {
|
public function get(string $scope, int $fileId, ?string $name = null): array {
|
||||||
$result = $this->preferenceMapper->get($scope, $fileId, $name);
|
$result = $this->preferenceMapper->get($scope, $fileId, $name);
|
||||||
return array_map(
|
return array_map(
|
||||||
function ($entity) {
|
function (ReaderEntity $entity): array {
|
||||||
return $entity->toService();
|
return $entity->toService();
|
||||||
}, $result);
|
}, $result);
|
||||||
}
|
}
|
||||||
@ -71,7 +74,7 @@ class PreferenceService extends Service {
|
|||||||
* @param ?string $name
|
* @param ?string $name
|
||||||
*/
|
*/
|
||||||
public function getDefault(string $scope, ?string $name = null): array {
|
public function getDefault(string $scope, ?string $name = null): array {
|
||||||
return $this->get($scope, static::DEFAULTS, $name);
|
return $this->get($scope, self::DEFAULTS, $name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -82,7 +85,7 @@ class PreferenceService extends Service {
|
|||||||
* @param string $value
|
* @param string $value
|
||||||
*/
|
*/
|
||||||
public function setDefault($scope, $name, $value): ReaderEntity {
|
public function setDefault($scope, $name, $value): ReaderEntity {
|
||||||
return $this->preferenceMapper->set($scope, static::DEFAULTS, $name, $value);
|
return $this->preferenceMapper->set($scope, self::DEFAULTS, $name, $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -107,6 +110,6 @@ class PreferenceService extends Service {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public function deleteDefault(string $scope, ?string $name = null): void {
|
public function deleteDefault(string $scope, ?string $name = null): void {
|
||||||
$this->delete($scope, static::DEFAULTS, $name);
|
$this->delete($scope, self::DEFAULTS, $name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,11 +34,6 @@
|
|||||||
<referencedClass name="OC" />
|
<referencedClass name="OC" />
|
||||||
</errorLevel>
|
</errorLevel>
|
||||||
</UndefinedClass>
|
</UndefinedClass>
|
||||||
<DeprecatedMethod>
|
|
||||||
<errorLevel type="info">
|
|
||||||
<referencedMethod name="OCP\Util::connectHook" />
|
|
||||||
</errorLevel>
|
|
||||||
</DeprecatedMethod>
|
|
||||||
<PropertyNotSetInConstructor errorLevel="suppress" />
|
<PropertyNotSetInConstructor errorLevel="suppress" />
|
||||||
</issueHandlers>
|
</issueHandlers>
|
||||||
</psalm>
|
</psalm>
|
||||||
|
Reference in New Issue
Block a user