psalm lvl 2

This commit is contained in:
Michel Roux 2023-06-16 21:20:03 +02:00
parent 2baaae1453
commit 3abce1dd99
23 changed files with 218 additions and 437 deletions

View File

@ -23,10 +23,6 @@ return ['routes' => [
['name' => 'bookmark#set', 'url' => '/bookmark', 'verb' => 'POST'],
['name' => 'bookmark#delete', 'url' => '/bookmark/{fileId}/{name}', 'verb' => 'DELETE'],
// Metadata
['name' => 'metadata#get', 'url' => '/metadata/{fileId}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']],
['name' => 'metadata#set', 'url' => '/metadata/{fileId}/{name}/{value}', 'verb' => 'POST'],
// Preferences
['name' => 'preference#get_default', 'url' => '/preference/default/{scope}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']],
['name' => 'preference#set_default', 'url' => '/preference/default', 'verb' => 'POST'],
@ -34,7 +30,7 @@ return ['routes' => [
['name' => 'preference#get', 'url' => '/preference/{fileId}/{scope}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']],
['name' => 'preference#set', 'url' => '/preference', 'verb' => 'POST'],
['name' => 'preference#delete', 'url' => '/preference/{fileId}/{scope}/{name}', 'verb' => 'DELETE'],
// User Settings
['name' => 'settings#setPreference', 'url' => '/settings/set', 'verb' => 'POST'],
]];

View File

@ -12,23 +12,23 @@ namespace OCA\Epubreader\Controller;
use OCA\Epubreader\Service\BookmarkService;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\JSONResponse;
use OCP\IRequest;
class BookmarkController extends Controller {
private $bookmarkService;
private BookmarkService $bookmarkService;
/**
* @param string $AppName
* @param IRequest $request
* @param BookmarkService $bookmarkService
*/
public function __construct($AppName,
public function __construct(
string $AppName,
IRequest $request,
BookmarkService $bookmarkService) {
BookmarkService $bookmarkService
) {
parent::__construct($AppName, $request);
$this->bookmarkService = $bookmarkService;
}
@ -40,12 +40,11 @@ class BookmarkController extends Controller {
* @NoCSRFRequired
*
* @param int $fileId
* @param string $name
*
* @return array|\OCP\AppFramework\Http\JSONResponse
* @param ?string $name
* @param ?string $type
*/
public function get($fileId, $name, $type = null) {
return $this->bookmarkService->get($fileId, $name, $type);
public function get(int $fileId, ?string $name = null, ?string $type = null): JSONResponse {
return new JSONResponse($this->bookmarkService->get($fileId, $name, $type));
}
/**
@ -57,14 +56,13 @@ class BookmarkController extends Controller {
* @param int $fileId
* @param string $name
* @param string $value
*
* @return array|\OCP\AppFramework\Http\JSONResponse
* @param ?string $type
* @param ?string $content
*/
public function set($fileId, $name, $value, $type = null, $content = null) {
return $this->bookmarkService->set($fileId, $name, $value, $type, $content);
public function set(int $fileId, string $name, string $value, ?string $type = null, ?string $content = null): JSONResponse {
return new JSONResponse($this->bookmarkService->set($fileId, $name, $value, $type, $content));
}
/**
* @brief return cursor for $fileId
*
@ -72,11 +70,9 @@ class BookmarkController extends Controller {
* @NoCSRFRequired
*
* @param int $fileId
*
* @return array|\OCP\AppFramework\Http\JSONResponse
*/
public function getCursor($fileId) {
return $this->bookmarkService->getCursor($fileId);
public function getCursor(int $fileId): JSONResponse {
return new JSONResponse($this->bookmarkService->getCursor($fileId));
}
/**
@ -87,11 +83,9 @@ class BookmarkController extends Controller {
*
* @param int $fileId
* @param string $value
*
* @return array|\OCP\AppFramework\Http\JSONResponse
*/
public function setCursor($fileId, $value) {
return $this->bookmarkService->setCursor($fileId, $value);
public function setCursor(int $fileId, string $value): JSONResponse {
return new JSONResponse($this->bookmarkService->setCursor($fileId, $value));
}
/**
@ -102,10 +96,9 @@ class BookmarkController extends Controller {
*
* @param int $fileId
* @param string name
*
*/
public function delete($fileId, $name) {
return $this->bookmarkService->delete($fileId, $name);
public function delete(int $fileId, string $name): void {
$this->bookmarkService->delete($fileId, $name);
}
/**
@ -115,9 +108,8 @@ class BookmarkController extends Controller {
* @NoCSRFRequired
*
* @param int $fileId
*
*/
public function deleteCursor($fileId) {
return $this->bookmarkService->deleteCursor($fileId);
public function deleteCursor(int $fileId): void {
$this->bookmarkService->deleteCursor($fileId);
}
}

View File

@ -1,80 +0,0 @@
<?php
/**
* @author Frank de Lange
* @copyright 2017 Frank de Lange
*
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCA\Epubreader\Controller;
use OCA\Epubreader\Service\MetadataService;
use OCP\AppFramework\Controller;
use OCP\IRequest;
class MetadataController extends Controller {
private $metadataService;
/**
* @param string $AppName
* @param IRequest $request
* @param MetadataService $metadataService
*/
public function __construct($AppName,
IRequest $request,
MetadataService $metadataService) {
parent::__construct($AppName, $request);
$this->metadataService = $metadataService;
}
/**
* @brief write metadata
*
* @NoAdminRequired
*
* @param int $fileId
* @param string $value
*
* @return array|\OCP\AppFramework\Http\JSONResponse
*/
public function setAll($fileId, $value) {
return $this->metadataService->setAll($fileId, $value);
}
/**
* @brief return metadata item
*
* @NoAdminRequired
* @NoCSRFRequired
*
* @param int $fileId
* @param string $name
*
* @return array|\OCP\AppFramework\Http\JSONResponse
*/
public function get($fileId, $name) {
return $this->metadataService->get($fileId, $name);
}
/**
* @brief write metadata item
*
* @NoAdminRequired
*
* @param int $fileId
* @param string $name
* @param string $value
*
* @return array|\OCP\AppFramework\Http\JSONResponse
*/
public function set($fileId, $name, $value) {
return $this->metadataService->set($fileId, $name, $value);
}
}

View File

@ -11,29 +11,26 @@
namespace OCA\Epubreader\Controller;
use OCA\Epubreader\Service\BookmarkService;
use OCA\Epubreader\Service\MetadataService;
use OCA\Epubreader\Service\PreferenceService;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\Files\FileInfo;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\Share\IManager;
class PageController extends Controller {
/** @var IURLGenerator */
private $urlGenerator;
/** @var IRootFolder */
private $rootFolder;
private $shareManager;
private $userId;
private $bookmarkService;
private $metadataService;
private $preferenceService;
private IURLGenerator $urlGenerator;
private IRootFolder $rootFolder;
private IManager $shareManager;
private string $userId;
private BookmarkService $bookmarkService;
private PreferenceService $preferenceService;
/**
* @param string $AppName
@ -44,25 +41,23 @@ class PageController extends Controller {
* @param string $UserId
* @param BookmarkService $bookmarkService
* @param PreferenceService $preferenceService
* @param MetadataService $metadataService
*/
public function __construct(
$AppName,
string $AppName,
IRequest $request,
IURLGenerator $urlGenerator,
IRootFolder $rootFolder,
IManager $shareManager,
$UserId,
string $UserId,
BookmarkService $bookmarkService,
PreferenceService $preferenceService,
MetadataService $metadataService) {
) {
parent::__construct($AppName, $request);
$this->urlGenerator = $urlGenerator;
$this->rootFolder = $rootFolder;
$this->shareManager = $shareManager;
$this->userId = $UserId;
$this->bookmarkService = $bookmarkService;
$this->metadataService = $metadataService;
$this->preferenceService = $preferenceService;
}
@ -72,7 +67,7 @@ class PageController extends Controller {
*
* @return TemplateResponse
*/
public function showReader() {
public function showReader(): TemplateResponse {
$templates = [
'application/epub+zip' => 'epubreader',
'application/x-cbr' => 'cbreader',
@ -101,7 +96,7 @@ class PageController extends Controller {
'cursor' => $this->toJson($this->bookmarkService->getCursor($fileId)),
'defaults' => $this->toJson($this->preferenceService->getDefault($scope)),
'preferences' => $this->toJson($this->preferenceService->get($scope, $fileId)),
'metadata' => $this->toJson($this->metadataService->get($fileId)),
'metadata' => $this->toJson([]),
'annotations' => $this->toJson($this->bookmarkService->get($fileId))
];
@ -110,7 +105,6 @@ class PageController extends Controller {
$policy->addAllowedStyleDomain('blob:');
$policy->addAllowedScriptDomain('\'self\'');
$policy->addAllowedFrameDomain('\'self\'');
$policy->addAllowedChildSrcDomain('\'self\'');
$policy->addAllowedFontDomain('\'self\'');
$policy->addAllowedFontDomain('data:');
$policy->addAllowedFontDomain('blob:');
@ -132,22 +126,21 @@ class PageController extends Controller {
* @return array
* @throws NotFoundException
*/
private function getFileInfo($path) {
private function getFileInfo(string $path): array {
$count = 0;
$shareToken = preg_replace("/(?:\/index\.php)?\/s\/([A-Za-z0-9]{15,32})\/download.*/", "$1", $path, 1, $count);
if ($count === 1) {
/* shared file or directory */
$node = $this->shareManager->getShareByToken($shareToken)->getNode();
$type = $node->getType();
/* shared directory, need file path to continue, */
if ($type == \OCP\Files\FileInfo::TYPE_FOLDER) {
if ($type == FileInfo::TYPE_FOLDER && $node instanceof Folder) {
$query = [];
parse_str(parse_url($path, PHP_URL_QUERY), $query);
if (isset($query['path']) && isset($query['files'])) {
$node = $node->get($query['path'])->get($query['files']);
if (isset($query['path'])) {
$node = $node->get($query['path']);
} else {
throw new NotFoundException('Shared file path or name not set');
}
@ -171,7 +164,10 @@ class PageController extends Controller {
];
}
private function toJson($value) {
/**
* @param mixed $value
*/
private function toJson($value): string {
return htmlspecialchars(json_encode($value), ENT_QUOTES, 'UTF-8');
}
}

View File

@ -12,28 +12,24 @@ namespace OCA\Epubreader\Controller;
use OCA\Epubreader\Service\PreferenceService;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\JSONResponse;
use OCP\IRequest;
use OCP\IURLGenerator;
class PreferenceController extends Controller {
private $urlGenerator;
private $preferenceService;
private PreferenceService $preferenceService;
/**
* @param string $AppName
* @param IRequest $request
* @param IURLGenerator $urlGenerator
* @param PreferenceService $preferenceService
*/
public function __construct($AppName,
public function __construct(
string $AppName,
IRequest $request,
IURLGenerator $urlGenerator,
PreferenceService $preferenceService) {
PreferenceService $preferenceService
) {
parent::__construct($AppName, $request);
$this->urlGenerator = $urlGenerator;
$this->preferenceService = $preferenceService;
}
@ -45,12 +41,10 @@ class PreferenceController extends Controller {
*
* @param string $scope
* @param int $fileId
* @param string $name if null, return all preferences for $scope + $fileId
*
* @return array|\OCP\AppFramework\Http\JSONResponse
* @param ?string $name if null, return all preferences for $scope + $fileId
*/
public function get($scope, $fileId, $name) {
return $this->preferenceService->get($scope, $fileId, $name);
public function get(string $scope, int $fileId, ?string $name = null): JSONResponse {
return new JSONResponse($this->preferenceService->get($scope, $fileId, $name));
}
/**
@ -66,8 +60,8 @@ class PreferenceController extends Controller {
*
* @return array|\OCP\AppFramework\Http\JSONResponse
*/
public function set($scope, $fileId, $name, $value) {
return $this->preferenceService->set($scope, $fileId, $name, $value);
public function set(string $scope, int $fileId, string $name, string $value) {
return new JSONResponse($this->preferenceService->set($scope, $fileId, $name, $value));
}
@ -79,11 +73,9 @@ class PreferenceController extends Controller {
*
* @param string $scope
* @param string $name if null, return all default preferences for scope
*
* @return array|\OCP\AppFramework\Http\JSONResponse
*/
public function getDefault($scope, $name) {
return $this->preferenceService->getDefault($scope, $name);
public function getDefault(string $scope, string $name): JSONResponse {
return new JSONResponse($this->preferenceService->getDefault($scope, $name));
}
/**
@ -95,11 +87,9 @@ class PreferenceController extends Controller {
* @param string $scope
* @param string $name
* @param string $value
*
* @return array|\OCP\AppFramework\Http\JSONResponse
*/
public function setDefault($scope, $name, $value) {
return $this->preferenceService->setDefault($scope, $name, $value);
public function setDefault(string $scope, string $name, string $value): JSONResponse {
return new JSONResponse($this->preferenceService->setDefault($scope, $name, $value));
}
/**
@ -108,20 +98,18 @@ class PreferenceController extends Controller {
* @param string $scope
* @param int $fileId
* @param string $name
*
*/
public function delete($scope, $fileId, $name) {
return $this->preferenceService->delete($scope, $fileId, $name);
public function delete(string $scope, int $fileId, string $name): void {
$this->preferenceService->delete($scope, $fileId, $name);
}
/**
* @brief delete default preference
*
* @param $scope
* @param $name
*
* @param string $scope
* @param string $name
*/
public function deleteDefault($scope, $name) {
return $this->preferenceService->deleteDefault($scope, $name);
public function deleteDefault(string $scope, string $name): void {
$this->preferenceService->deleteDefault($scope, $name);
}
}

View File

@ -13,33 +13,11 @@
namespace OCA\Epubreader\Controller;
use OCA\Epubreader\Config;
use OCA\Epubreader\Service\PreferenceService;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\JSONResponse;
use OCP\IRequest;
use OCP\IURLGenerator;
class SettingsController extends Controller {
private $urlGenerator;
private $preferenceService;
/**
* @param string $AppName
* @param IRequest $request
* @param IURLGenerator $urlGenerator
* @param PreferenceService $preferenceService
*/
public function __construct($AppName,
IRequest $request,
IURLGenerator $urlGenerator,
PreferenceService $preferenceService) {
parent::__construct($AppName, $request);
$this->urlGenerator = $urlGenerator;
$this->preferenceService = $preferenceService;
}
/**
* @brief set preference for file type association
*
@ -48,11 +26,8 @@ class SettingsController extends Controller {
* @param int $EpubEnable
* @param int $PdfEnable
* @param int $CbxEnable
*
* @return array|\OCP\AppFramework\Http\JSONResponse
*/
public function setPreference(int $EpubEnable, int $PdfEnable, int $CbxEnable) {
public function setPreference(int $EpubEnable, int $PdfEnable, int $CbxEnable): JSONResponse {
$l = \OC::$server->getL10N('epubreader');
Config::set('epub_enable', $EpubEnable);

View File

@ -12,13 +12,12 @@ namespace OCA\Epubreader\Db;
class Bookmark extends ReaderEntity implements \JsonSerializable {
protected $userId; // user
protected $fileId; // book (identified by fileId) for which this mark is valid
protected $type; // type, defaults to "bookmark"
protected $name; // name, defaults to $location
protected $value; // bookmark value (format-specific, eg. page number for PDF, CFI for epub, etc)
protected $content; // bookmark content (annotations etc), can be empty
protected $lastModified; // modification timestamp
protected string $userId; // user
protected int $fileId; // book (identified by fileId) for which this mark is valid
protected string $type; // type, defaults to "bookmark"
protected string $name; // name, defaults to $location
protected string $value; // bookmark value (format-specific, eg. page number for PDF, CFI for epub, etc)
protected string $content; // bookmark content (annotations etc), can be empty
public function jsonSerialize(): array {
return [
@ -33,7 +32,7 @@ class Bookmark extends ReaderEntity implements \JsonSerializable {
];
}
public function toService() {
public function toService(): array {
return [
'name' => $this->getName(),
'type' => $this->getType(),
@ -43,59 +42,51 @@ class Bookmark extends ReaderEntity implements \JsonSerializable {
];
}
public function getUserId() {
public function getUserId(): string {
return $this->userId;
}
public function setUserId($userId) {
public function setUserId(string $userId): void {
$this->userId = $userId;
}
public function getFileId() {
public function getFileId(): int {
return $this->fileId;
}
public function setFileId(int $fileId) {
public function setFileId(int $fileId): void {
$this->fileId = $fileId;
}
public function getType() {
public function getType(): string {
return $this->type;
}
public function setType($type) {
public function setType(string $type): void {
$this->type = $type;
}
public function getName() {
public function getName(): string {
return $this->name;
}
public function setName(string $name) {
public function setName(string $name): void {
$this->name = $name;
}
public function getValue() {
public function getValue(): string {
return $this->value;
}
public function setValue(string $value) {
public function setValue(string $value): void {
$this->value = $value;
}
public function getContent() {
public function getContent(): string {
return $this->content;
}
public function setContent($content) {
public function setContent(string $content): void {
$this->content = $content;
}
public function getLastModified() {
return $this->lastModified;
}
public function setLastModified($lastModified) {
$this->lastModified = $lastModified;
}
}

View File

@ -11,31 +11,31 @@
namespace OCA\Epubreader\Db;
use OCA\Epubreader\Utility\Time;
use OCP\AppFramework\Db\Entity;
use OCP\IDBConnection;
class BookmarkMapper extends ReaderMapper {
private $userId;
private string $userId;
/**
* @param IDbConnection $db
* @param $UserId
* @param string $UserId
* @param Time $time
*/
public function __construct(IDBConnection $db, $UserId, Time $time) {
public function __construct(IDBConnection $db, string $UserId, Time $time) {
parent::__construct($db, 'reader_bookmarks', Bookmark::class, $time);
/** @var int $UserId */
$this->userId = $UserId;
}
/**
* @brief get bookmarks for $fileId+$userId(+$name)
* @param $fileId
* @param string $name
* @return array
* @param int $fileId
* @param ?string $name
* @param ?string $type
*
* @return ReaderEntity[]
*/
public function get(int $fileId, $name, $type = null) {
public function get(int $fileId, ?string $name = null, ?string $type = null): array {
$query = $this->db->getQueryBuilder();
$query->select('*')
->from($this->getTableName())
@ -57,17 +57,18 @@ class BookmarkMapper extends ReaderMapper {
* @brief write bookmark to database
*
* @param int $fileId
* @param string $name
* @param ?string $name
* @param string $value
* @param ?string $type
* @param ?string $content
*
* @return Entity the newly created or updated bookmark
* @return ReaderEntity the newly created or updated bookmark
*/
public function set($fileId, $name, $value, $type, $content = null) {
public function set(int $fileId, ?string $name = null, string $value, ?string $type = null, ?string $content = null): ReaderEntity {
/** @var Bookmark[] $result */
$result = $this->get($fileId, $name);
if(empty($result)) {
// anonymous bookmarks are named after their contents
if (null === $name) {
$name = $value;
@ -84,13 +85,13 @@ class BookmarkMapper extends ReaderMapper {
$bookmark->setType($type);
$bookmark->setName($name);
$bookmark->setValue($value);
$bookmark->setContent($content);
$bookmark->setContent($content ?? '');
$this->insert($bookmark);
} else {
$bookmark = $result[0];
$bookmark->setValue($value);
$bookmark->setContent($content);
$bookmark->setContent($content ?? '');
$this->update($bookmark);
}

View File

@ -12,12 +12,11 @@ namespace OCA\Epubreader\Db;
class Preference extends ReaderEntity implements \JsonSerializable {
protected $userId; // user for whom this preference is valid
protected $scope; // scope (default or specific renderer)
protected $fileId; // file for which this preference is set
protected $name; // preference name
protected $value; // preference value
protected $lastModified; // modification timestamp
protected string $userId; // user for whom this preference is valid
protected string $scope; // scope (default or specific renderer)
protected int $fileId; // file for which this preference is set
protected string $name; // preference name
protected string $value; // preference value
public function jsonSerialize(): array {
return [
@ -30,58 +29,50 @@ class Preference extends ReaderEntity implements \JsonSerializable {
];
}
public function toService() {
public function toService(): array {
return [
'name' => $this->getName(),
'value' => $this->conditional_json_decode($this->getValue()),
];
}
public function getUserId() {
public function getUserId(): string {
return $this->userId;
}
public function setUserId($userId) {
public function setUserId(string $userId): void {
$this->userId = $userId;
}
public function getScope() {
public function getScope(): string {
return $this->scope;
}
public function setScope(string $scope) {
public function setScope(string $scope): void {
$this->scope = $scope;
}
public function getFileId() {
public function getFileId(): int {
return $this->fileId;
}
public function setFileId(int $fileId) {
public function setFileId(int $fileId): void {
$this->fileId = $fileId;
}
public function getName() {
public function getName(): string {
return $this->name;
}
public function setName(string $name) {
public function setName(string $name): void {
$this->name = $name;
}
public function getValue() {
public function getValue(): string {
return $this->value;
}
public function setValue(string $value) {
public function setValue(string $value): void {
$this->value = $value;
}
public function getLastModified() {
return $this->lastModified;
}
public function setLastModified($lastModified) {
$this->lastModified = $lastModified;
}
}

View File

@ -11,14 +11,13 @@
namespace OCA\Epubreader\Db;
use OCA\Epubreader\Utility\Time;
use OCP\AppFramework\Db\Entity;
use OCP\IDBConnection;
class PreferenceMapper extends ReaderMapper {
private $userId;
private string $userId;
public function __construct(IDBConnection $db, $UserId, Time $time) {
public function __construct(IDBConnection $db, string $UserId, Time $time) {
parent::__construct($db, 'reader_prefs', Preference::class, $time);
$this->userId = $UserId;
}
@ -28,10 +27,11 @@ class PreferenceMapper extends ReaderMapper {
*
* @param string $scope
* @param int $fileId
* @param string $name
* @return array
* @param ?string $name
*
* @return ReaderEntity[]
*/
public function get($scope, $fileId, $name = null) {
public function get(string $scope, int $fileId, ?string $name = null): array {
$query = $this->db->getQueryBuilder();
$query->select('*')
->from($this->getTableName())
@ -54,14 +54,13 @@ class PreferenceMapper extends ReaderMapper {
* @param string $name
* @param string $value
*
* @return Entity the newly created or updated preference
* @return ReaderEntity the newly created or updated preference
*/
public function set($scope, $fileId, $name, $value) {
public function set(string $scope, int $fileId, string $name, string $value): ReaderEntity {
/** @var Preference[] $result */
$result = $this->get($scope, $fileId, $name);
if(empty($result)) {
$preference = new Preference();
$preference->setScope($scope);
$preference->setFileId($fileId);

View File

@ -12,12 +12,12 @@ namespace OCA\Epubreader\Db;
use OCP\AppFramework\Db\Entity;
class ReaderEntity extends Entity {
abstract class ReaderEntity extends Entity {
private $lastModified;
protected int $lastModified; // modification timestamp
/* returns decoded json if input is json, otherwise returns input */
public static function conditional_json_decode($el) {
public static function conditional_json_decode(string $el): mixed {
$result = json_decode($el);
if (json_last_error() === JSON_ERROR_NONE) {
return $result;
@ -26,12 +26,13 @@ class ReaderEntity extends Entity {
}
}
public function getLastModified() {
public function getLastModified(): int {
return $this->lastModified;
}
public function setLastModified(string $lastModified) {
public function setLastModified(int $lastModified): void {
$this->lastModified = $lastModified;
}
abstract public function toService(): array;
}

View File

@ -13,7 +13,6 @@ namespace OCA\Epubreader\Db;
use OCA\Epubreader\Utility\Time;
use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\QBMapper;
use OCP\IDBConnection;
/**
@ -21,12 +20,15 @@ use OCP\IDBConnection;
*/
abstract class ReaderMapper extends QBMapper {
/**
* @var Time
*/
private $time;
private Time $time;
public function __construct(IDBConnection $db, $table, $entity, Time $time) {
/**
* @param IDBConnection $db Instance of the Db abstraction layer
* @param string $table the name of the table. set this to allow entity
* @param class-string<ReaderEntity>|null $entity the name of the entity that the sql should be mapped to queries without using sql
* @param Time $time
*/
public function __construct(IDBConnection $db, string $table, ?string $entity = null, Time $time) {
parent::__construct($db, $table, $entity);
$this->time = $time;
}

View File

@ -17,7 +17,7 @@ use OCP\Util;
class Hooks {
public static function register() {
public static function register(): void {
Util::connectHook('\OCP\Config', 'js', 'OCA\Epubreader\Hooks', 'announce_settings');
\OC::$server->getRootFolder()->listen('\OC\Files', 'preDelete', function (Node $node) {
@ -32,7 +32,7 @@ class Hooks {
});
}
public static function announce_settings(array $settings) {
public static function announce_settings(array $settings): void {
// 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
$isJson = self::isJson($settings['array']['oc_appconfig']);
@ -43,27 +43,27 @@ class Hooks {
$settings['array']['oc_appconfig'] = ($isJson) ? json_encode($array) : $array;
}
protected static function deleteFile(IDBConnection $connection, $fileId) {
protected static function deleteFile(IDBConnection $connection, int $fileId): void {
$queryBuilder = $connection->getQueryBuilder();
$queryBuilder->delete('reader_bookmarks')->where('file_id = file_id')->setParameter('file_id', $fileId);
$queryBuilder->execute();
$queryBuilder->executeStatement();
$queryBuilder = $connection->getQueryBuilder();
$queryBuilder->delete('reader_prefs')->where('file_id = file_id')->setParameter('file_id', $fileId);
$queryBuilder->execute();
$queryBuilder->executeStatement();
}
protected static function deleteUser(IDBConnection $connection, $userId) {
protected static function deleteUser(IDBConnection $connection, string $userId): void {
$queryBuilder = $connection->getQueryBuilder();
$queryBuilder->delete('reader_bookmarks')->where('user_id = user_id')->setParameter('user_id', $userId);
$queryBuilder->execute();
$queryBuilder->executeStatement();
$queryBuilder = $connection->getQueryBuilder();
$queryBuilder->delete('reader_prefs')->where('user_id = user_id')->setParameter('user_id', $userId);
$queryBuilder->execute();
$queryBuilder->executeStatement();
}
private static function isJson($string) {
private static function isJson(mixed $string): bool {
return is_string($string) && is_array(json_decode($string, true)) && (json_last_error() == JSON_ERROR_NONE) ? true : false;
}
}

View File

@ -19,16 +19,15 @@ class Version010404Date20201030180941 extends SimpleMigrationStep {
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*/
public function preSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
public function preSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
* @return null|ISchemaWrapper
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options) {
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
@ -138,6 +137,6 @@ class Version010404Date20201030180941 extends SimpleMigrationStep {
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
}
}

View File

@ -11,6 +11,7 @@
namespace OCA\Epubreader\Service;
use OCA\Epubreader\Db\BookmarkMapper;
use OCA\Epubreader\Db\ReaderEntity;
class BookmarkService extends Service {
@ -18,13 +19,11 @@ class BookmarkService extends Service {
public const CURSOR = '__CURSOR__';
public const bookmark_type = 'bookmark';
private $bookmarkMapper;
private $userId;
private BookmarkMapper $bookmarkMapper;
public function __construct(BookmarkMapper $bookmarkMapper, $UserId) {
public function __construct(BookmarkMapper $bookmarkMapper) {
parent::__construct($bookmarkMapper);
$this->bookmarkMapper = $bookmarkMapper;
$this->userId = $UserId;
}
/**
@ -33,14 +32,13 @@ class BookmarkService extends Service {
* bookmark type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc
*
* @param int $fileId
* @param string $name
*
* @return array
* @param ?string $name
* @param ?string $type
*/
public function get($fileId, $name = null, $type = null) {
public function get($fileId, ?string $name = null, ?string $type = null): array {
$result = $this->bookmarkMapper->get($fileId, $name, $type);
return array_map(
function ($entity) {
function (ReaderEntity $entity) {
return $entity->toService();
}, $result);
}
@ -51,12 +49,12 @@ class BookmarkService extends Service {
* position type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc
*
* @param int $fileId
* @param string $name
* @param ?string $name
* @param string $value
*
* @return array
* @param ?string $type
* @param ?string $content
*/
public function set($fileId, $name, $value, $type = null, $content = null) {
public function set(int $fileId, ?string $name = null, string $value, ?string $type = null, ?string $content = null): ReaderEntity {
return $this->bookmarkMapper->set($fileId, $name, $value, $type, $content);
}
@ -64,14 +62,13 @@ class BookmarkService extends Service {
* @brief get cursor (current position in book)
*
* @param int $fileId
*
* @return array
*/
public function getCursor($fileId) {
public function getCursor(int $fileId): array {
$result = $this->get($fileId, static::CURSOR);
if (count($result) === 1) {
return $result[0];
}
return [];
}
/**
@ -79,10 +76,8 @@ class BookmarkService extends Service {
*
* @param int $fileId
* @param string $value
*
* @return array
*/
public function setCursor($fileId, $value) {
public function setCursor(int $fileId, string $value): ReaderEntity {
return $this->bookmarkMapper->set($fileId, static::CURSOR, $value, static::bookmark_type);
}
@ -90,10 +85,10 @@ class BookmarkService extends Service {
* @brief delete bookmark
*
* @param int $fileId
* @param string $name
*
* @param ?string $name
* @param ?string $type
*/
public function delete($fileId, $name, $type = null) {
public function delete($fileId, ?string $name = null, ?string $type = null): void {
foreach ($this->bookmarkMapper->get($fileId, $name, $type) as $bookmark) {
$this->bookmarkMapper->delete($bookmark);
}
@ -103,9 +98,8 @@ class BookmarkService extends Service {
* @brief delete cursor
*
* @param int $fileId
*
*/
public function deleteCursor($fileId) {
public function deleteCursor(int $fileId): void {
$this->delete($fileId, static::CURSOR, static::bookmark_type);
}
}

View File

@ -1,64 +0,0 @@
<?php
/**
* @author Frank de Lange
* @copyright 2017 Frank de Lange
*
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCA\Epubreader\Service;
use OCP\App\IAppManager;
class MetadataService {
private $appManager;
/**
* @param IAppManager $appManager
*/
public function __construct(IAppManager $appManager) {
$this->appManager = $appManager;
}
/**
* @brief get metadata item(s)
*
* @param int $fileId
* @param string $name
*
* @return array
*/
public function get($fileId, $name = null) {
return [];
}
/**
* @brief write metadata to database
*
* @param int $fileId
* @param array $value
*
* @return array
*/
public function setAll($fileId, $value) {
// no-op for now
return [];
}
/**
* @brief write metadata item to database
*
* @param int $fileId
* @param string $name
* @param array $value
*
* @return array
*/
public function set($fileId, $name, $value) {
// no-op for now
return [];
}
}

View File

@ -11,6 +11,7 @@
namespace OCA\Epubreader\Service;
use OCA\Epubreader\Db\PreferenceMapper;
use OCA\Epubreader\Db\ReaderEntity;
class PreferenceService extends Service {
@ -18,7 +19,7 @@ class PreferenceService extends Service {
// value 0 to indicate a default preference
public const DEFAULTS = 0;
private $preferenceMapper;
private PreferenceMapper $preferenceMapper;
/**
* @param PreferenceMapper $preferenceMapper
@ -36,11 +37,11 @@ class PreferenceService extends Service {
*
* @param string $scope
* @param int $fileId
* @param string $name
* @param ?string $name
*
* @return array
*/
public function get($scope, $fileId, $name = null) {
public function get(string $scope, int $fileId, ?string $name = null): array {
$result = $this->preferenceMapper->get($scope, $fileId, $name);
return array_map(
function ($entity) {
@ -58,10 +59,8 @@ class PreferenceService extends Service {
* @param int $fileId
* @param string $name
* @param string $value
*
* @return array
*/
public function set($scope, $fileId, $name, $value) {
public function set(string $scope, int $fileId, string $name, string $value): ReaderEntity {
return $this->preferenceMapper->set($scope, $fileId, $name, $value);
}
@ -69,11 +68,9 @@ class PreferenceService extends Service {
* @brief get default preference
*
* @param string $scope
* @param string $name
*
* @return array
* @param ?string $name
*/
public function getDefault($scope, $name = null) {
public function getDefault(string $scope, ?string $name = null): array {
return $this->get($scope, static::DEFAULTS, $name);
}
@ -83,10 +80,8 @@ class PreferenceService extends Service {
* @param string $scope
* @param string $name
* @param string $value
*
* @return array
*/
public function setDefault($scope, $name, $value) {
public function setDefault($scope, $name, $value): ReaderEntity {
return $this->preferenceMapper->set($scope, static::DEFAULTS, $name, $value);
}
@ -95,10 +90,10 @@ class PreferenceService extends Service {
*
* @param string $scope
* @param int $fileId
* @param string $name
* @param ?string $name
*
*/
public function delete($scope, $fileId, $name) {
public function delete(string $scope, int $fileId, ?string $name = null): void {
foreach($this->preferenceMapper->get($scope, $fileId, $name) as $preference) {
$this->preferenceMapper->delete($preference);
}
@ -108,10 +103,10 @@ class PreferenceService extends Service {
* @brief delete default
*
* @param string $scope
* @param string $name
* @param ?string $name
*
*/
public function deleteDefault($scope, $name) {
public function deleteDefault(string $scope, ?string $name = null): void {
$this->delete($scope, static::DEFAULTS, $name);
}
}

View File

@ -13,8 +13,7 @@ namespace OCA\Epubreader\Service;
use OCA\Epubreader\Db\ReaderMapper;
abstract class Service {
protected $mapper;
protected ReaderMapper $mapper;
public function __construct(ReaderMapper $mapper) {
$this->mapper = $mapper;

View File

@ -17,11 +17,11 @@ use OCP\Settings\ISettings;
class Personal implements ISettings {
private $userId;
private $configManager;
private string $userId;
private IConfig $configManager;
public function __construct(
$userId,
string $userId,
IConfig $configManager
) {
$this->userId = $userId;
@ -32,13 +32,13 @@ class Personal implements ISettings {
* @return TemplateResponse returns the instance with all parameters set, ready to be rendered
* @since 9.1
*/
public function getForm() {
public function getForm(): TemplateResponse {
$parameters = [
'EpubEnable' => $this->configManager->getUserValue($this->userId, 'epubreader', 'epub_enable'),
'PdfEnable' => $this->configManager->getUserValue($this->userId, 'epubreader', 'pdf_enable'),
'CbxEnable' => $this->configManager->getUserValue($this->userId, 'epubreader', 'cbx_enable'),
];
return new TemplateResponse('epubreader', 'settings-personal', $parameters, '');
}
@ -47,7 +47,7 @@ class Personal implements ISettings {
*
* @return TemplateResponse
*/
public function getPanel() {
public function getPanel(): TemplateResponse {
return $this->getForm();
}
@ -55,7 +55,7 @@ class Personal implements ISettings {
* @return string the section ID, e.g. 'sharing'
* @since 9.1
*/
public function getSection() {
public function getSection(): string {
return 'epubreader';
}
@ -64,7 +64,7 @@ class Personal implements ISettings {
*
* @return string
*/
public function getSectionID() {
public function getSectionID(): string {
return 'epubreader';
}
@ -76,7 +76,7 @@ class Personal implements ISettings {
* E.g.: 70
* @since 9.1
*/
public function getPriority() {
public function getPriority(): int {
return 10;
}
}

View File

@ -16,10 +16,9 @@ use OCP\IURLGenerator;
use OCP\Settings\IIconSection;
class PersonalSection implements IIconSection {
/** @var IURLGenerator */
private $urlGenerator;
/** @var IL10N */
private $l;
private IURLGenerator $urlGenerator;
private IL10N $l;
public function __construct(IURLGenerator $urlGenerator, IL10N $l) {
$this->urlGenerator = $urlGenerator;
@ -29,18 +28,18 @@ class PersonalSection implements IIconSection {
/**
* returns the relative path to an 16*16 icon describing the section.
*
* @returns string
* @return string
*/
public function getIcon() {
public function getIcon(): string {
return $this->urlGenerator->imagePath('epubreader', 'app.svg');
}
/**
* returns the ID of the section. It is supposed to be a lower case string,
*
* @returns string
* @return string
*/
public function getID() {
public function getID(): string {
return 'epubreader';
}
@ -49,7 +48,7 @@ class PersonalSection implements IIconSection {
*
* @return string
*/
public function getName() {
public function getName(): string {
return $this->l->t('EPUB/CBZ/PDF ebook reader');
}
@ -58,7 +57,7 @@ class PersonalSection implements IIconSection {
*
* @return int
*/
public function getPriority() {
public function getPriority(): int {
return 20;
}
}

View File

@ -11,16 +11,16 @@
namespace OCA\Epubreader\Utility;
class Time {
public function getTime() {
public function getTime(): int {
return time();
}
/**
* @return string the current unix time in miliseconds
* @return int the current unix time in miliseconds
*/
public function getMicroTime(): string {
public function getMicroTime(): int {
list($millisecs, $secs) = explode(" ", microtime());
return $secs . substr($millisecs, 2, 6);
return (int) ($secs . substr($millisecs, 2, 6));
}
}

View File

@ -16,6 +16,7 @@ namespace OCA\Epubreader;
* Config class for Reader
*/
class Config {
/**
* @brief get user config value
*
@ -23,7 +24,7 @@ class Config {
* @param string $default default value to use
* @return string retrieved value or default
*/
public static function get($key, $default) {
public static function get(string $key, string $default): string {
return \OC::$server->getConfig()->getUserValue(\OC_User::getUser(), 'epubreader', $key, $default);
}
@ -34,7 +35,7 @@ class Config {
* @param string $value value to use
* @return bool success
*/
public static function set($key, $value) {
public static function set(string $key, string $value): bool {
return \OC::$server->getConfig()->setUserValue(\OC_User::getUser(), 'epubreader', $key, $value);
}
@ -45,7 +46,7 @@ class Config {
* @param string $default default value to use
* @return string retrieved value or default
*/
public static function getApp($key, $default) {
public static function getApp(string $key, string $default): string {
return \OC::$server->getConfig()->getAppValue('epubreader', $key, $default);
}
@ -56,7 +57,7 @@ class Config {
* @param string $value value to use
* @return bool success
*/
public static function setApp($key, $value) {
public static function setApp(string $key, string $value): bool {
return \OC::$server->getConfig()->setAppValue('epubreader', $key, $value);
}
}

View File

@ -34,5 +34,11 @@
<referencedClass name="OC" />
</errorLevel>
</UndefinedClass>
<DeprecatedMethod>
<errorLevel type="info">
<referencedMethod name="OCP\Util::connectHook" />
</errorLevel>
</DeprecatedMethod>
<PropertyNotSetInConstructor errorLevel="suppress" />
</issueHandlers>
</psalm>