diff --git a/apps/sharing/composer/composer/autoload_classmap.php b/apps/sharing/composer/composer/autoload_classmap.php index cd25fd6f28b58..d2b48b8753319 100644 --- a/apps/sharing/composer/composer/autoload_classmap.php +++ b/apps/sharing/composer/composer/autoload_classmap.php @@ -32,5 +32,6 @@ 'OCA\\Sharing\\Migration\\Version1000Date20260826073021' => $baseDir . '/../lib/Migration/Version1000Date20260826073021.php', 'OCA\\Sharing\\Migration\\Version1000Date20260826115938' => $baseDir . '/../lib/Migration/Version1000Date20260826115938.php', 'OCA\\Sharing\\Migration\\Version1000Date20260826122228' => $baseDir . '/../lib/Migration/Version1000Date20260826122228.php', + 'OCA\\Sharing\\Migration\\Version2000Date20261013142538' => $baseDir . '/../lib/Migration/Version2000Date20261013142538.php', 'OCA\\Sharing\\ResponseDefinitions' => $baseDir . '/../lib/ResponseDefinitions.php', ); diff --git a/apps/sharing/composer/composer/autoload_static.php b/apps/sharing/composer/composer/autoload_static.php index 35b44813420c3..60852a2cd612b 100644 --- a/apps/sharing/composer/composer/autoload_static.php +++ b/apps/sharing/composer/composer/autoload_static.php @@ -47,6 +47,7 @@ class ComposerStaticInitSharing 'OCA\\Sharing\\Migration\\Version1000Date20260826073021' => __DIR__ . '/..' . '/../lib/Migration/Version1000Date20260826073021.php', 'OCA\\Sharing\\Migration\\Version1000Date20260826115938' => __DIR__ . '/..' . '/../lib/Migration/Version1000Date20260826115938.php', 'OCA\\Sharing\\Migration\\Version1000Date20260826122228' => __DIR__ . '/..' . '/../lib/Migration/Version1000Date20260826122228.php', + 'OCA\\Sharing\\Migration\\Version2000Date20261013142538' => __DIR__ . '/..' . '/../lib/Migration/Version2000Date20261013142538.php', 'OCA\\Sharing\\ResponseDefinitions' => __DIR__ . '/..' . '/../lib/ResponseDefinitions.php', ); diff --git a/apps/sharing/lib/Migration/Version2000Date20261013142538.php b/apps/sharing/lib/Migration/Version2000Date20261013142538.php new file mode 100644 index 0000000000000..7d87ab1729f82 --- /dev/null +++ b/apps/sharing/lib/Migration/Version2000Date20261013142538.php @@ -0,0 +1,49 @@ +getTable('sharing_share'); + $userStatusTable = $schema->getTable('sharing_share_user_status'); + $changed = false; + + if ($shareTable->hasColumn('state')) { + $shareTable->dropColumn('state'); + $changed = true; + } + + if (!$shareTable->hasColumn('state_id')) { + $shareTable->addColumn('state_id', Types::INTEGER); + $changed = true; + } + + if ($userStatusTable->hasColumn('status')) { + $userStatusTable->dropColumn('status'); + $changed = true; + } + + if (!$userStatusTable->hasColumn('status_id')) { + $userStatusTable->addColumn('status_id', Types::INTEGER); + $changed = true; + } + + return $changed ? $schema : null; + } +} diff --git a/lib/private/Sharing/SharingBackend.php b/lib/private/Sharing/SharingBackend.php index 1811f6fdeac3f..1e3bcc1ee321b 100644 --- a/lib/private/Sharing/SharingBackend.php +++ b/lib/private/Sharing/SharingBackend.php @@ -75,7 +75,7 @@ public function createShare(string $id, ShareUser $owner, \DateTimeImmutable $la 'owner_user_id' => $qb->createNamedParameter($owner->userId), 'owner_instance' => $qb->createNamedParameter($owner->instance), 'last_updated' => $qb->createNamedParameter(SharingManager::timeToMs($lastUpdated)), - 'state' => $qb->createNamedParameter(ShareState::Draft->value), + 'state_id' => $qb->createNamedParameter(ShareState::Draft->encode(), IQueryBuilder::PARAM_INT), ]) ->executeStatement(); } @@ -119,7 +119,7 @@ public function updateShareState(string $id, ShareState $state): void { $qb = $this->connection->getQueryBuilder(); $rowCount = $qb ->update('sharing_share') - ->set('state', $qb->createNamedParameter($state->value)) + ->set('state_id', $qb->createNamedParameter($state->encode(), IQueryBuilder::PARAM_INT)) ->where($qb->expr()->eq('id', $qb->createNamedParameter($id))) ->executeStatement(); if ($rowCount === 0) { @@ -134,7 +134,7 @@ public function updateShareUserStatus(string $id, string $userId, ShareUserStatu $qb = $this->connection->getQueryBuilder(); $rowCount = $qb ->update('sharing_share_user_status') - ->set('status', $qb->createNamedParameter($userStatus->value)) + ->set('status_id', $qb->createNamedParameter($userStatus->encode(), IQueryBuilder::PARAM_INT)) ->where($qb->expr()->eq('share_id', $qb->createNamedParameter($id))) ->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($userId))) ->executeStatement(); @@ -145,7 +145,7 @@ public function updateShareUserStatus(string $id, string $userId, ShareUserStatu ->values([ 'share_id' => $qb->createNamedParameter($id), 'user_id' => $qb->createNamedParameter($userId), - 'status' => $qb->createNamedParameter($userStatus->value), + 'status_id' => $qb->createNamedParameter($userStatus->encode(), IQueryBuilder::PARAM_INT), ]) ->executeStatement(); } @@ -695,7 +695,7 @@ private function list( $qb = $this->connection->getQueryBuilder(); $qb->innerJoin( 's', 'sharing_share_recipients', 'sr', $qb->expr()->andX( - $qb->expr()->eq('s.state', $qb->createNamedParameter(ShareState::Active->value)), + $qb->expr()->eq('s.state_id', $qb->createNamedParameter(ShareState::Active->encode())), $qb->expr()->eq('s.id', 'sr.share_id'), ) ); @@ -721,7 +721,7 @@ private function list( $qb = $this->connection->getQueryBuilder(); $qb->innerJoin( 's', 'sharing_share_recipients', 'sr', $qb->expr()->andX( - $qb->expr()->eq('s.state', $qb->createNamedParameter(ShareState::Active->value)), + $qb->expr()->eq('s.state_id', $qb->createNamedParameter(ShareState::Active->encode())), $qb->expr()->eq('s.id', 'sr.share_id'), $qb->expr()->eq('sr.recipient_secret', $qb->createNamedParameter($accessContext->secret)), ) @@ -741,7 +741,7 @@ private function list( 's.owner_user_id', 's.owner_instance', 's.last_updated', - 's.state', + 's.state_id', ) ->from('sharing_share', 's') ->orderBy('s.id', 'ASC'); @@ -766,7 +766,7 @@ private function list( } if ($filterState instanceof \NCU\Sharing\ShareState) { - $qb->andWhere($qb->expr()->eq('s.state', $qb->createNamedParameter($filterState->value))); + $qb->andWhere($qb->expr()->eq('s.state_id', $qb->createNamedParameter($filterState->encode()))); } if ($lastShareID !== null) { @@ -796,13 +796,12 @@ private function list( $shareId = (string)$row['id']; /** @var numeric-string $lastUpdated */ $lastUpdated = (string)$row['last_updated']; - /** @var string $state */ - $state = $row['state']; + $state = (int)$row['state_id']; $shares[$shareId] ??= [ 'id' => $shareId, 'owner' => new ShareUser($ownerUserId, $ownerInstance), 'last_updated' => $lastUpdated, - 'state' => ShareState::from($state), + 'state' => ShareState::decode($state), 'user_status' => null, 'sources' => [], 'recipients' => [], @@ -831,18 +830,18 @@ private function list( $qb = $this->connection->getQueryBuilder(); $qb - ->select('share_id', 'status') + ->select('share_id', 'status_id') ->from('sharing_share_user_status') ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($accessContext->currentUser->getUID()))) ->andWhere($qb->expr()->in('share_id', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_STR_ARRAY))); $result = $qb->executeQuery(); - /** @var list $rows */ + /** @var list $rows */ $rows = $result->fetchAll(); foreach ($rows as $row) { $id = $row['share_id']; - $userStatus = $row['status']; - $shares[$id]['user_status'] = ShareUserStatus::from($userStatus); + $userStatus = (int)$row['status_id']; + $shares[$id]['user_status'] = ShareUserStatus::decode($userStatus); } foreach ($chunk as $id) { diff --git a/lib/unstable/Sharing/ShareState.php b/lib/unstable/Sharing/ShareState.php index 86b31237aaa84..ac9b73afd5204 100644 --- a/lib/unstable/Sharing/ShareState.php +++ b/lib/unstable/Sharing/ShareState.php @@ -28,4 +28,27 @@ enum ShareState: string { * @experimental 35.0.0 */ case Deleted = 'deleted'; + + /** + * @experimental 35.0.0 + */ + public function encode(): int { + return match ($this) { + self::Active => 1, + self::Draft => 2, + self::Deleted => 3, + }; + } + + /** + * @experimental 35.0.0 + */ + public static function decode(int $value): self { + return match ($value) { + 1 => self::Active, + 2 => self::Draft, + 3 => self::Deleted, + default => throw new \ValueError('Invalid share state ' . $value) + }; + } } diff --git a/lib/unstable/Sharing/ShareUserStatus.php b/lib/unstable/Sharing/ShareUserStatus.php index f3878bb7f9dc9..bbb84211cf88d 100644 --- a/lib/unstable/Sharing/ShareUserStatus.php +++ b/lib/unstable/Sharing/ShareUserStatus.php @@ -28,4 +28,27 @@ enum ShareUserStatus: string { * @experimental 35.0.0 */ case Rejected = 'rejected'; + + /** + * @experimental 35.0.0 + */ + public function encode(): int { + return match ($this) { + self::Pending => 1, + self::Accepted => 2, + self::Rejected => 3, + }; + } + + /** + * @experimental 35.0.0 + */ + public static function decode(int $value): self { + return match ($value) { + 1 => self::Pending, + 2 => self::Accepted, + 3 => self::Rejected, + default => throw new \ValueError('Invalid user share status ' . $value) + }; + } }