From f41533dd75a6b8e54de456368acc022d57fa8e82 Mon Sep 17 00:00:00 2001 From: Louis Chemineau Date: Fri, 13 Sep 2024 10:01:36 +0200 Subject: [PATCH] fix: Do not expire labeled versions Signed-off-by: Louis Chemineau --- .../files_versions/version_expiration.cy.ts | 75 +++++++++++++++++++ lib/Versions/ExpireManager.php | 11 +++ 2 files changed, 86 insertions(+) create mode 100644 cypress/e2e/files_versions/version_expiration.cy.ts diff --git a/cypress/e2e/files_versions/version_expiration.cy.ts b/cypress/e2e/files_versions/version_expiration.cy.ts new file mode 100644 index 000000000..fb3f6f343 --- /dev/null +++ b/cypress/e2e/files_versions/version_expiration.cy.ts @@ -0,0 +1,75 @@ +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import type { User } from '@nextcloud/cypress' + +import { assertVersionContent, nameVersion, openVersionsPanel, uploadThreeVersions } from './filesVersionsUtils' +import { addUserToGroup, createGroup, createGroupFolder, PERMISSION_DELETE, PERMISSION_READ, PERMISSION_WRITE } from '../groupfoldersUtils' +import { navigateToFolder } from '../files/filesUtils' + +describe('Versions expiration', () => { + let randomGroupName: string + let randomGroupFolderName: string + let randomFileName: string + let randomFilePath: string + let user1: User + + beforeEach(() => { + randomGroupName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + randomGroupFolderName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + randomFileName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + '.txt' + randomFilePath = `${randomGroupFolderName}/${randomFileName}` + + cy.createRandomUser().then(_user => { user1 = _user }) + createGroup(randomGroupName) + + cy.then(() => { + addUserToGroup(randomGroupName, user1.userId) + createGroupFolder(randomGroupFolderName, randomGroupName, [PERMISSION_READ, PERMISSION_WRITE, PERMISSION_DELETE]) + + uploadThreeVersions(user1, randomFilePath) + cy.login(user1) + }) + + cy.visit('/apps/files') + navigateToFolder(randomGroupFolderName) + openVersionsPanel(randomFilePath) + + }) + + it('Expire all versions', () => { + cy.runOccCommand('config:system:set versions_retention_obligation --value "0, 0"') + cy.runOccCommand('versions:expire') + cy.runOccCommand('config:system:set versions_retention_obligation --value auto') + cy.visit('/apps/files') + openVersionsPanel(randomFileName) + + cy.get('#tab-version_vue').within(() => { + cy.get('[data-files-versions-version]').should('have.length', 1) + cy.get('[data-files-versions-version]').eq(0).contains('Current version') + }) + + assertVersionContent(0, 'v3') + }) + + it('Expire versions v2', () => { + nameVersion(2, 'v1') + + cy.runOccCommand('config:system:set versions_retention_obligation --value "0, 0"') + cy.runOccCommand('versions:expire') + cy.runOccCommand('config:system:set versions_retention_obligation --value auto') + cy.visit('/apps/files') + openVersionsPanel(randomFileName) + + cy.get('#tab-version_vue').within(() => { + cy.get('[data-files-versions-version]').should('have.length', 2) + cy.get('[data-files-versions-version]').eq(0).contains('Current version') + cy.get('[data-files-versions-version]').eq(1).contains('v1') + }) + + assertVersionContent(0, 'v3') + assertVersionContent(1, 'v1') + }) +}) diff --git a/lib/Versions/ExpireManager.php b/lib/Versions/ExpireManager.php index 52149fdcf..20f8c9a5a 100644 --- a/lib/Versions/ExpireManager.php +++ b/lib/Versions/ExpireManager.php @@ -9,6 +9,7 @@ namespace OCA\GroupFolders\Versions; use OCA\Files_Versions\Expiration; +use OCA\Files_Versions\Versions\IMetadataVersion; use OCA\Files_Versions\Versions\IVersion; /** @@ -117,6 +118,16 @@ public function getExpiredVersion(array $versions, int $time, bool $quotaExceede }); $expired = array_filter($versionsLeft, function (IVersion $version) use ($quotaExceeded) { + // Do not expire current version. + if ($version->getTimestamp() === $version->getSourceFile()->getMtime()) { + return false; + } + + // Do not expire versions with a label. + if ($version instanceof IMetadataVersion && $version->getMetadataValue('label') !== null && $version->getMetadataValue('label') !== '') { + return false; + } + return $this->expiration->isExpired($version->getTimestamp(), $quotaExceeded); });