first commit

This commit is contained in:
root
2022-03-06 11:49:27 +00:00
commit 1984e55837
1387 changed files with 121949 additions and 0 deletions

33
lib/Controller/Errors.php Normal file
View File

@ -0,0 +1,33 @@
<?php
namespace OCA\MyWiki\Controller;
use Closure;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
use OCA\MyWiki\Service\NotFoundException;
use OCA\MyWiki\Service\ReadOnlyException;
trait Errors {
protected function handleNotFound (Closure $callback) {
try {
return new DataResponse($callback());
} catch(NotFoundException $e) {
$message = ['message' => $e->getMessage()];
return new DataResponse($message, Http::STATUS_NOT_FOUND);
}
}
protected function handleReadOnly (Closure $callback) {
try {
return new DataResponse($callback());
} catch(ReadOnlyException $e) {
$message = ['message' => $e->getMessage()];
return new DataResponse($message, Http::STATUS_NOT_FOUND);
}
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace OCA\MyWiki\Controller;
use OCP\IRequest;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\Controller;
class PageController extends Controller {
private $userId;
public function __construct($AppName, IRequest $request, $UserId){
parent::__construct($AppName, $request);
$this->userId = $UserId;
}
/**
* CAUTION: the @Stuff turns off security checks; for this page no admin is
* required and no CSRF check. If you don't know what CSRF is, read
* it up in the docs or you might create a security hole. This is
* basically the only required method to add this exemption, don't
* add it to any other method if you don't exactly know what it does
*
* @NoAdminRequired
* @NoCSRFRequired
*/
public function index() {
return new TemplateResponse('mywiki', 'index'); // templates/index.php
}
}

View File

@ -0,0 +1,81 @@
<?php
namespace OCA\MyWiki\Controller;
use OCP\IRequest;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\Controller;
use OCA\MyWiki\Service\WikiService;
class WikiController extends Controller {
private $service;
private $userId;
use Errors;
public function __construct(string $AppName, IRequest $request, WikiService $service, $UserId){
parent::__construct($AppName, $request);
$this->service = $service;
$this->userId = $UserId;
}
/**
* @NoAdminRequired
*/
public function index() {
return new DataResponse($this->service->test($this->userId));
return new DataResponse($this->service->findAll($this->userId));
}
/**
* @NoAdminRequired
*
* @param int $id
*/
public function show(int $id) {
return $this->handleNotFound(function () use ($id) {
return $this->service->find($id, $this->userId);
});
}
/**
* @NoAdminRequired
*
* @param string $title
* @param string $fileId
*/
public function create(string $title, int $fileId) {
return $this->handleReadOnly(function () use ($title, $fileId) {
return $this->service->create($title, $fileId, $this->userId);
});
}
/**
* @NoAdminRequired
*
* @param int $id
* @param string $title
*/
public function update(int $id, string $title) {
return $this->handleNotFound(function () use ($id, $title) {
return $this->service->update($id, $title, $this->userId);
});
}
/**
* @NoAdminRequired
*
* @param int $id
* @param bool $removeFiles
*/
public function destroy(int $id, bool $removeFiles) {
return $this->handleNotFound(function () use ($id, $removeFiles) {
return $this->service->delete($id, $removeFiles, $this->userId);
});
}
}

25
lib/Db/Wiki.php Normal file
View File

@ -0,0 +1,25 @@
<?php
namespace OCA\MyWiki\Db;
use JsonSerializable;
use OCP\AppFramework\Db\Entity;
class Wiki extends Entity implements JsonSerializable {
protected $title;
protected $fileId;
protected $userId;
public function __construct() {
$this->addType('id','integer');
}
public function jsonSerialize() {
return [
'id' => $this->id,
'title' => $this->title,
'file_id' => $this->file_id
];
}
}

50
lib/Db/WikiMapper.php Normal file
View File

@ -0,0 +1,50 @@
<?php
namespace OCA\MyWiki\Db;
use OCP\IDBConnection;
use OCP\AppFramework\Db\QBMapper;
class WikiMapper extends QBMapper {
public function __construct(IDBConnection $db) {
parent::__construct($db, 'mywiki_wikis', Note::class);
}
public function usersCount(int $folderId) {
$qb = $this->db->getQueryBuilder();
// ToDo - get the count
$qb->select($qb->createFunction('COUNT()'))
->from($this->getTableName())
->where(
$qb->expr()->eq('folderId', $qb->createNamedParameter($folderId))
);
return $qb->getSQL();
}
public function find(int $id, string $userId) {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from($this->getTableName())
->where(
$qb->expr()->eq('id', $qb->createNamedParameter($id))
)->andWhere(
$qb->expr()->eq('user_id', $qb->createNamedParameter($userId))
);
return $this->findEntity($qb);
}
public function findAll(string $userId) {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from($this->getTableName())
->where(
$qb->expr()->eq('user_id', $qb->createNamedParameter($userId))
);
return $this->findEntities($qb);
}
}

41
lib/Helper/WikiHelper.php Normal file
View File

@ -0,0 +1,41 @@
<?php
namespace OCA\MyWiki\Helper;
use OCP\AppFramework\Files\Folder;
class WikiHelper {
public static function isFolder(int $folderId) :bool {
$mount = \OC\Files\Filesystem::getMountsForFileId($folderId);
/*
isReadable()
getById($folderId)
isCreatable()
isUpdateable()
lock()
$config = new \OC\Config('config/');
$base_path = $config->getValue('datadirectory')
datadirectory is the key in the array defined in config.php that contains the base directory.
$basepath now contains a path like /var/www/html/nextcloud/data.
*/
// ToDo
$nodes = \OC\Files\Node\Folder::getById($folderId);
return true;
}
public static function isWiki(int $folderId) :bool {
return \OC\Files\Filesystem::nodeExists('.wiki');
}
public static function initWiki(int $folderId, string $title) :bool {
// ToDo
// create file ".wiki"
// title: $title
// pages:
return true;
}
public static function removePage(int $folderId, bool $includeSubfolders) {
// ToDo :: Remove this folder and all subfolders
}
}

View File

@ -0,0 +1,72 @@
<?php
namespace OCA\NotesTutorial\Migration;
use Closure;
use OCP\DB\ISchemaWrapper;
use OCP\Migration\SimpleMigrationStep;
use OCP\Migration\IOutput;
class Version1400Date20181013124731 extends SimpleMigrationStep {
/**
* @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) {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
if (!$schema->hasTable('mywiki')) {
$table = $schema->createTable('mywiki');
$table->addColumn('id', 'integer', [
'autoincrement' => true,
'notnull' => true,
]);
$table->addColumn('file_id', 'integer', [
'notnull' => true,
]);
$table->addColumn('title', 'string', [
'notnull' => true,
'length' => 200
]);
$table->addColumn('user_id', 'string', [
'notnull' => true,
'length' => 200,
]);
$table->setPrimaryKey(['id']);
$table->addIndex(['user_id'], 'mywiki_user_id_index');
}
/*
if (!$schema->hasTable('mywiki_pages')) {
$table = $schema->createTable('mywiki_pages');
$table->addColumn('id', 'integer', [
'autoincrement' => true,
'notnull' => true,
]);
$table->addColumn('pid', 'integer', [
'notnull' => true
]);
$table->addColumn('wiki_id', 'integer', [
'notnull' => true
]);
$table->addColumn('title', 'string', [
'notnull' => true,
'length' => 200,
]);
$table->addColumn('path', 'string', [
'notnull' => true,
'length' => 200,
]);
$table->setPrimaryKey(['id']);
$table->addIndex(['wiki_id'], 'mywiki_wiki_id_index');
}
*/
return $schema;
}
}

View File

@ -0,0 +1,4 @@
<?php
namespace OCA\MyWiki\Service;
class NotFoundException extends ServiceException {}

View File

@ -0,0 +1,4 @@
<?php
namespace OCA\MyWiki\Service;
class ReadOnlyException extends ServiceException {}

View File

@ -0,0 +1,6 @@
<?php
namespace OCA\MyWiki\Service;
use Exception;
class ServiceException extends Exception {}

View File

@ -0,0 +1,97 @@
<?php
namespace OCA\MyWiki\Service;
use Exception;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCA\MyWiki\Db\Wiki;
use OCA\MyWiki\Db\WikiMapper;
use OCA\MyWiki\Helper\WikiHelper;
class WikiService {
private $mapper;
private $rootFolder;
public function __construct(WikiMapper $mapper,IRootFolder $rootFolder){
$this->mapper = $mapper;
$this->rootFolder = $rootFolder;
// , IUserSession $userSession
}
public function test(string $userId) {
echo 'JDG :: Test for '.$userId;
}
public function findAll(string $userId) {
return $this->mapper->findAll($userId);
}
private function handleException ($e) {
if ($e instanceof DoesNotExistException ||
$e instanceof MultipleObjectsReturnedException) {
throw new NotFoundException($e->getMessage());
} else {
throw $e;
}
}
public function find(int $id, string $userId) {
try {
return $this->mapper->find($id, $userId);
// in order to be able to plug in different storage backends like files
// for instance it is a good idea to turn storage related exceptions
// into service related exceptions so controllers and service users
// have to deal with only one type of exception
} catch(Exception $e) {
$this->handleException($e);
}
}
public function create(string $title, int $fileId, string $userId) {
if ( !WikiHelper::isFolder($fileId) ) {
throw new ReadOnlyException('The folder is not valid');
}
if ( !WikiHelper::isWiki($fileId) ) {
if ( !WikiHelper::initWiki($fileId, $title) ) {
throw new ReadOnlyException('Error creating wiki');
}
}
$wiki = new Wiki();
$wiki->setTitle($title);
$wiki->setFileId($fileId);
$wiki->setUserId($userId);
return $this->mapper->insert($wiki);
}
public function update(int $id, string $title, string $userId) {
try {
$wiki = $this->mapper->find($id, $userId);
$wiki->setTitle($title);
return $this->mapper->update($wiki);
} catch(Exception $e) {
$this->handleException($e);
}
}
public function delete(int $id, bool $removeFiles, string $userId) {
try {
$wiki = $this->mapper->find($id, $userId);
if ($removeFiles) {
$fileId = $wiki->getFileId();
$this->mapper->usersCount($fileId);
WikiHelper::removePage($fileId, true);
}
$this->mapper->delete($wiki);
return $wiki;
} catch(Exception $e) {
$this->handleException($e);
}
}
}