Skip to content

Commit 7b13184

Browse files
author
Julien Veyssier
committed
merge '(n)' suffix PR
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2 parents a3724b0 + 1408efd commit 7b13184

4 files changed

Lines changed: 67 additions & 7 deletions

File tree

cypress/integration/images.spec.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@ const clickOnImageAction = (actionIndex, callback) => {
6666
*/
6767
const checkImage = (documentId, imageName, imageId) => {
6868
cy.log('Check the image is visible and well formed')
69-
cy.get('#editor .ProseMirror div.image[data-src="text://image?imageFileName=' + imageName + '"]')
69+
cy.get('#editor .ProseMirror div.image[data-src="text://media?mediaFileName=' + imageName + '"]')
7070
.should('be.visible')
7171
.find('img')
7272
.should('have.attr', 'src')
73-
.should('contain', 'apps/text/image?documentId=' + documentId)
74-
.should('contain', 'imageFileName=' + imageName)
73+
.should('contain', 'apps/text/media?documentId=' + documentId)
74+
.should('contain', 'mediaFileName=' + imageName)
7575
// keep track that we have created this image in the attachment dir
7676
attachmentFileNameToId[imageName] = imageId
7777
}

lib/Service/MediaService.php

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public function uploadMediaFile(int $documentId, string $newFileName, $newFileRe
147147
throw new NotPermittedException('No write permissions');
148148
}
149149
$saveDir = $this->getAttachmentDirectoryForFile($textFile, true);
150-
$fileName = (string) time() . '-' . $newFileName;
150+
$fileName = $this->getUniqueFileName($saveDir, $newFileName);
151151
$savedFile = $saveDir->newFile($fileName, $newFileResource);
152152
return [
153153
'name' => $fileName,
@@ -174,7 +174,7 @@ public function uploadMediaFilePublic(?int $documentId, string $newFileName, $ne
174174
}
175175
$textFile = $this->getTextFilePublic($documentId, $shareToken);
176176
$saveDir = $this->getAttachmentDirectoryForFile($textFile, true);
177-
$fileName = (string) time() . '-' . $newFileName;
177+
$fileName = $this->getUniqueFileName($saveDir, $newFileName);
178178
$savedFile = $saveDir->newFile($fileName, $newFileResource);
179179
return [
180180
'name' => $fileName,
@@ -216,7 +216,7 @@ public function insertMediaFile(int $documentId, string $mediaFilePath, string $
216216
private function copyMediaFile(File $mediaFile, Folder $saveDir, File $textFile): array {
217217
$mimeType = $mediaFile->getMimeType();
218218
if (in_array($mimeType, MediaController::IMAGE_MIME_TYPES, true)) {
219-
$fileName = (string) time() . '-' . $mediaFile->getName();
219+
$fileName = $this->getUniqueFileName($saveDir, $mediaFile->getName());
220220
$targetPath = $saveDir->getPath() . '/' . $fileName;
221221
$targetFile = $mediaFile->copy($targetPath);
222222
// get file type and name
@@ -232,6 +232,30 @@ private function copyMediaFile(File $mediaFile, Folder $saveDir, File $textFile)
232232
];
233233
}
234234

235+
/**
236+
* Get unique file name in a directory. Add '(n)' suffix.
237+
* @param Folder $dir
238+
* @param string $fileName
239+
* @return string
240+
*/
241+
public static function getUniqueFileName(Folder $dir, string $fileName): string {
242+
$extension = pathinfo($fileName, PATHINFO_EXTENSION);
243+
$counter = 1;
244+
$uniqueFileName = $fileName;
245+
if ($extension !== '') {
246+
while ($dir->nodeExists($uniqueFileName)) {
247+
$counter++;
248+
$uniqueFileName = preg_replace('/\.' . $extension . '$/', ' (' . $counter . ').' . $extension, $fileName);
249+
}
250+
} else {
251+
while ($dir->nodeExists($uniqueFileName)) {
252+
$counter++;
253+
$uniqueFileName = preg_replace('/$/', ' (' . $counter . ')', $fileName);
254+
}
255+
}
256+
return $uniqueFileName;
257+
}
258+
235259
/**
236260
* Check if the shared access has write permissions
237261
*

tests/TextTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,40 @@ public function testGetAttachmentNamesFromContent() {
5151
$this->assertContains($contentName, $computedNames);
5252
}
5353
}
54+
55+
public function testGetUniqueFileName() {
56+
$fileNameList = [
57+
'foo.png',
58+
'bar',
59+
'plop.png',
60+
'plop (2).png',
61+
'lala.png',
62+
'lala (2).png',
63+
'lala (3).png',
64+
'yay.png',
65+
'yay (2).png',
66+
'yay (3).png',
67+
'yay (5).png',
68+
'file.ext.ext',
69+
];
70+
71+
$folder = $this->createMock(Folder::class);
72+
$folder->expects(self::any())
73+
->method('nodeExists')
74+
->willReturnCallback(function ($name) use ($fileNameList) {
75+
return in_array($name, $fileNameList);
76+
});
77+
78+
// files that do not exist yet
79+
$this->assertEquals('doesNotExistYet', ImageService::getUniqueFileName($folder, 'doesNotExistYet'));
80+
$this->assertEquals('doesNotExistYet.png', ImageService::getUniqueFileName($folder, 'doesNotExistYet.png'));
81+
82+
// files that already exist
83+
$this->assertEquals('foo (2).png', ImageService::getUniqueFileName($folder, 'foo.png'));
84+
$this->assertEquals('bar (2)', ImageService::getUniqueFileName($folder, 'bar'));
85+
$this->assertEquals('plop (3).png', ImageService::getUniqueFileName($folder, 'plop.png'));
86+
$this->assertEquals('lala (4).png', ImageService::getUniqueFileName($folder, 'lala.png'));
87+
$this->assertEquals('yay (4).png', ImageService::getUniqueFileName($folder, 'yay.png'));
88+
$this->assertEquals('file.ext (2).ext', ImageService::getUniqueFileName($folder, 'file.ext.ext'));
89+
}
5490
}

tests/psalm-baseline.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177
<code>null</code>
178178
</NullableReturnStatement>
179179
</file>
180-
<file src="lib/Service/ImageService.php">
180+
<file src="lib/Service/MediaService.php">
181181
<InvalidCatch occurrences="2"/>
182182
<MissingDependency occurrences="8">
183183
<code>$this-&gt;rootFolder</code>

0 commit comments

Comments
 (0)