Skip to content

Commit 6294c15

Browse files
committed
Support setting metadata in PROPPATCH requests
Signed-off-by: Louis Chemineau <louis@chmn.me>
1 parent 4b4a122 commit 6294c15

2 files changed

Lines changed: 54 additions & 1 deletion

File tree

apps/dav/lib/Connector/Sabre/FilesPlugin.php

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@
3434
namespace OCA\DAV\Connector\Sabre;
3535

3636
use OC\AppFramework\Http\Request;
37+
use OC\FilesMetadata\Model\MetadataValueWrapper;
3738
use OCP\Constants;
3839
use OCP\Files\ForbiddenException;
3940
use OCP\Files\StorageNotAvailableException;
41+
use OCP\FilesMetadata\IFilesMetadataManager;
4042
use OCP\IConfig;
4143
use OCP\IPreview;
4244
use OCP\IRequest;
@@ -516,6 +518,57 @@ public function handleUpdateProperties($path, PropPatch $propPatch) {
516518
$node->setCreationTime((int) $time);
517519
return true;
518520
});
521+
522+
523+
/** @var IFilesMetadataManager */
524+
$filesMetadataManager = \OCP\Server::get(IFilesMetadataManager::class);
525+
$metadata = $filesMetadataManager->getMetadata((int)$node->getFileId());
526+
527+
foreach ($metadata->getKeys() as $metadataKey) {
528+
$propPatch->handle(self::FILE_METADATA_PREFIX.$metadataKey, function (mixed $value) use ($metadata, $metadataKey, $filesMetadataManager) {
529+
switch ($metadata->getType($metadataKey)) {
530+
case MetadataValueWrapper::TYPE_STRING:
531+
$metadata->set($metadataKey, $value);
532+
break;
533+
case MetadataValueWrapper::TYPE_INT:
534+
$metadata->setInt($metadataKey, $value);
535+
break;
536+
case MetadataValueWrapper::TYPE_FLOAT:
537+
$metadata->setFloat($metadataKey, $value);
538+
break;
539+
case MetadataValueWrapper::TYPE_BOOL:
540+
$metadata->setBool($metadataKey, $value);
541+
break;
542+
case MetadataValueWrapper::TYPE_ARRAY:
543+
$metadata->setArray($metadataKey, $value);
544+
break;
545+
case MetadataValueWrapper::TYPE_STRING_LIST:
546+
$metadata->setStringList($metadataKey, $value);
547+
break;
548+
case MetadataValueWrapper::TYPE_INT_LIST:
549+
$metadata->setIntList($metadataKey, $value);
550+
break;
551+
}
552+
553+
$filesMetadataManager->saveMetadata($metadata);
554+
return true;
555+
});
556+
}
557+
558+
foreach ($propPatch->getRemainingMutations() as $mutation) {
559+
if (!str_starts_with($mutation, self::FILE_METADATA_PREFIX)) {
560+
continue;
561+
}
562+
563+
$propPatch->handle($mutation, function (string $value) use ($metadata, $mutation, $filesMetadataManager) {
564+
$metadataKey = substr($mutation, strlen(self::FILE_METADATA_PREFIX));
565+
$metadata->set($metadataKey, $value);
566+
$filesMetadataManager->saveMetadata($metadata);
567+
return true;
568+
});
569+
}
570+
571+
519572
/**
520573
* Disable modification of the displayname property for files and
521574
* folders via PROPPATCH. See PROPFIND for more information.

lib/public/Files/FileInfo.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
*/
2929
namespace OCP\Files;
3030

31+
use OC\FilesMetadata\Model\MetadataValueWrapper;
3132
use OCP\Files\Storage\IStorage;
3233

3334
/**
@@ -312,7 +313,6 @@ public function getParentId(): int;
312313
/**
313314
* Get the metadata, if available
314315
*
315-
* @return array
316316
* @since 28.0.0
317317
*/
318318
public function getMetadata(): array;

0 commit comments

Comments
 (0)