Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
Signed-off-by: Louis Chemineau <louis@chmn.me>
  • Loading branch information
artonge committed Sep 7, 2023
1 parent 43bca79 commit 3ca48c1
Show file tree
Hide file tree
Showing 8 changed files with 458 additions and 55 deletions.
8 changes: 7 additions & 1 deletion lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
use OCA\GroupFolders\Trash\TrashBackend;
use OCA\GroupFolders\Trash\TrashManager;
use OCA\GroupFolders\Versions\GroupVersionsExpireManager;
use OCA\GroupFolders\Versions\GroupVersionsMapper;
use OCA\GroupFolders\Versions\VersionsBackend;
use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IBootContext;
Expand All @@ -55,6 +56,8 @@
use OCP\AppFramework\IAppContainer;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Files\Config\IMountProviderCollection;
use OCP\Files\IMimeTypeLoader;
use OCP\Files\IRootFolder;
use OCP\ICacheFactory;
use OCP\IConfig;
use OCP\IDBConnection;
Expand Down Expand Up @@ -131,10 +134,13 @@ public function register(IRegistrationContext $context): void {

$context->registerService(VersionsBackend::class, function (IAppContainer $c): VersionsBackend {
return new VersionsBackend(
$c->get(IRootFolder::class),
$c->get('GroupAppFolder'),
$c->get(MountProvider::class),
$c->get(ITimeFactory::class),
$c->get(LoggerInterface::class)
$c->get(LoggerInterface::class),
$c->get(GroupVersionsMapper::class),
$c->get(IMimeTypeLoader::class),
);
});

Expand Down
4 changes: 4 additions & 0 deletions lib/Helper/LazyFolder.php
Original file line number Diff line number Diff line change
Expand Up @@ -266,4 +266,8 @@ public function changeLock($targetType) {
public function unlock($type) {
return $this->__call(__FUNCTION__, func_get_args());
}

public function getParentId(): int {
return $this->__call(__FUNCTION__, func_get_args());
}
}
87 changes: 87 additions & 0 deletions lib/Migration/Version16000Date20230821085801.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright (c) 2023 Louis Chmn <louis@chmn.me>
*
* @author Louis Chmn <louis@chmn.me>
*
* @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\GroupFolders\Migration;

use Closure;
use OCP\DB\ISchemaWrapper;
use OCP\DB\Types;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;

/**
* Auto-generated migration step: Please modify to your needs!
* TODO: check if this is enough, no need for real fileid?
*/
class Version16000Date20230821085801 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): ?ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();

if ($schema->hasTable("group_folders_versions")) {
return null;
}

$table = $schema->createTable("group_folders_versions");
$table->addColumn('id', Types::BIGINT, [
'autoincrement' => true,
'notnull' => true,
'length' => 20,
]);
$table->addColumn('file_id', Types::BIGINT, [
'notnull' => true,
'length' => 20,
]);
$table->addColumn('timestamp', Types::BIGINT, [
'notnull' => true,
'length' => 20,
]);
$table->addColumn('size', Types::BIGINT, [
'notnull' => true,
'length' => 20,
]);
$table->addColumn('mimetype', Types::BIGINT, [
'notnull' => true,
'length' => 20,
]);
$table->addColumn('metadata', Types::TEXT, [
'notnull' => true,
'default' => '{}',
]);

$table->setPrimaryKey(['id']);
$table->addUniqueIndex(['file_id', 'timestamp'], 'gf_versions_uniq_index');

return $schema;
}
}
14 changes: 4 additions & 10 deletions lib/Versions/GroupVersion.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,6 @@
use OCP\IUser;

class GroupVersion extends Version {
/** @var File */
private $versionFile;

/** @var int */
private $folderId;

public function __construct(
int $timestamp,
Expand All @@ -46,12 +41,11 @@ public function __construct(
FileInfo $sourceFileInfo,
IVersionBackend $backend,
IUser $user,
File $versionFile,
int $folderId
string $label,
private File $versionFile,
private int $folderId,
) {
parent::__construct($timestamp, $revisionId, $name, $size, $mimetype, $path, $sourceFileInfo, $backend, $user);
$this->versionFile = $versionFile;
$this->folderId = $folderId;
parent::__construct($timestamp, $revisionId, $name, $size, $mimetype, $path, $sourceFileInfo, $backend, $user, $label);
}

public function getVersionFile(): File {
Expand Down
92 changes: 92 additions & 0 deletions lib/Versions/GroupVersionEntity.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright (c) 2023 Louis Chmn <louis@chmn.me>
*
* @author Louis Chmn <louis@chmn.me>
*
* @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\GroupFolders\Versions;

use JsonSerializable;

use OCP\AppFramework\Db\Entity;
use OCP\DB\Types;

/**
* @method int getFileId()
* @method void setFileId(int $fileId)
* @method int getTimestamp()
* @method void setTimestamp(int $timestamp)
* @method int|float getSize()
* @method void setSize(int|float $size)
* @method int getMimetype()
* @method void setMimetype(int $mimetype)
* @method string getMetadata()
* @method void setMetadata(string $metadata)
*/
class GroupVersionEntity extends Entity implements JsonSerializable {
protected ?int $fileId = null;
protected ?int $timestamp = null;
protected ?int $size = null;
protected ?int $mimetype = null;
protected ?string $metadata = null;

public function __construct() {
$this->addType('id', Types::INTEGER);
$this->addType('file_id', Types::INTEGER);
$this->addType('timestamp', Types::INTEGER);
$this->addType('size', Types::INTEGER);
$this->addType('mimetype', Types::INTEGER);
$this->addType('metadata', Types::STRING);
}

public function jsonSerialize(): array {
return [
'id' => $this->id,
'file_id' => $this->fileId,
'timestamp' => $this->timestamp,
'size' => $this->size,
'mimetype' => $this->mimetype,
'metadata' => $this->metadata,
];
}

public function getLabel(): string {
return $this->getDecodedMetadata()['label'] ?? '';
}

public function setLabel(string $label): void {
$metadata = $this->getDecodedMetadata();
$metadata['label'] = $label;
$this->setDecodedMetadata($metadata);
$this->markFieldUpdated('metadata');
}

public function getDecodedMetadata(): array {
return json_decode($this->metadata ?? '', true) ?? [];
}

public function setDecodedMetadata(array $value): void {
$this->metadata = json_encode($value, JSON_THROW_ON_ERROR);
$this->markFieldUpdated('metadata');
}
}
86 changes: 86 additions & 0 deletions lib/Versions/GroupVersionsMapper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright (c) 2023 Louis Chmn <louis@chmn.me>
*
* @author Louis Chmn <louis@chmn.me>
*
* @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\GroupFolders\Versions;

use OCP\AppFramework\Db\QBMapper;
use OCP\IDBConnection;

/**
* @extends QBMapper<GroupVersionEntity>
*/
class GroupVersionsMapper extends QBMapper {
public function __construct(IDBConnection $db) {
parent::__construct($db, 'group_folders_versions', GroupVersionEntity::class);
}

/**
* @return GroupVersionEntity[]
*/
public function findAllVersionsForFileId(int $fileId): array {
$qb = $this->db->getQueryBuilder();

$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('file_id', $qb->createNamedParameter($fileId)));

return $this->findEntities($qb);
}

/**
* @return GroupVersionEntity
*/
public function findCurrentVersionForFileId(int $fileId): GroupVersionEntity {
$qb = $this->db->getQueryBuilder();

$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('file_id', $qb->createNamedParameter($fileId)))
->orderBy('timestamp', 'DESC')
->setMaxResults(1);

return $this->findEntity($qb);
}

public function findVersionForFileId(int $fileId, int $timestamp): GroupVersionEntity {
$qb = $this->db->getQueryBuilder();

$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('file_id', $qb->createNamedParameter($fileId)))
->andWhere($qb->expr()->eq('timestamp', $qb->createNamedParameter($timestamp)));

return $this->findEntity($qb);
}

public function deleteAllVersionsForFileId(int $fileId): int {
$qb = $this->db->getQueryBuilder();

return $qb->delete($this->getTableName())
->where($qb->expr()->eq('file_id', $qb->createNamedParameter($fileId)))
->executeStatement();
}
}
Loading

0 comments on commit 3ca48c1

Please sign in to comment.