Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add custom suffix to conflict name #1425

Merged
merged 3 commits into from
Nov 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Erase / rename

*Defined in*

[packages/cozy-client/src/models/file.js:455](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L455)
[packages/cozy-client/src/models/file.js:448](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L448)

***

Expand All @@ -26,7 +26,7 @@ The file Content-Type

*Defined in*

[packages/cozy-client/src/models/file.js:454](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L454)
[packages/cozy-client/src/models/file.js:447](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L447)

***

Expand All @@ -38,7 +38,7 @@ The dirId to upload the file to

*Defined in*

[packages/cozy-client/src/models/file.js:452](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L452)
[packages/cozy-client/src/models/file.js:445](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L445)

***

Expand All @@ -50,7 +50,7 @@ An object containing the metadata to attach

*Defined in*

[packages/cozy-client/src/models/file.js:453](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L453)
[packages/cozy-client/src/models/file.js:446](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L446)

***

Expand All @@ -62,4 +62,4 @@ The file name to upload

*Defined in*

[packages/cozy-client/src/models/file.js:451](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L451)
[packages/cozy-client/src/models/file.js:444](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L444)
22 changes: 11 additions & 11 deletions docs/api/cozy-client/modules/models.file.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ Upload a file on a mobile

*Defined in*

[packages/cozy-client/src/models/file.js:559](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L559)
[packages/cozy-client/src/models/file.js:552](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L552)

***

Expand Down Expand Up @@ -86,7 +86,7 @@ file object with path attribute

*Defined in*

[packages/cozy-client/src/models/file.js:605](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L605)
[packages/cozy-client/src/models/file.js:598](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L598)

***

Expand Down Expand Up @@ -135,13 +135,13 @@ Generate a file name for a revision

*Defined in*

[packages/cozy-client/src/models/file.js:441](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L441)
[packages/cozy-client/src/models/file.js:434](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L434)

***

### generateNewFileNameOnConflict

▸ **generateNewFileNameOnConflict**(`filenameWithoutExtension`, `originalNameFormatRegex`): `string`
▸ **generateNewFileNameOnConflict**(`filenameWithoutExtension`, `conflictOptions`): `string`

Method to generate a new filename if there is a conflict

Expand All @@ -150,7 +150,7 @@ Method to generate a new filename if there is a conflict
| Name | Type | Description |
| :------ | :------ | :------ |
| `filenameWithoutExtension` | `string` | A filename without the extension |
| `originalNameFormatRegex` | `RegExp` | - |
| `conflictOptions` | `ConflictOptions` | - |

*Returns*

Expand Down Expand Up @@ -302,7 +302,7 @@ The mime-type of the target file, or an empty string is the target is not a file

*Defined in*

[packages/cozy-client/src/models/file.js:585](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L585)
[packages/cozy-client/src/models/file.js:578](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L578)

***

Expand Down Expand Up @@ -346,7 +346,7 @@ Whether the file's metadata attribute exists

*Defined in*

[packages/cozy-client/src/models/file.js:577](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L577)
[packages/cozy-client/src/models/file.js:570](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L570)

***

Expand Down Expand Up @@ -428,7 +428,7 @@ Whether the file is client-side encrypted

*Defined in*

[packages/cozy-client/src/models/file.js:596](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L596)
[packages/cozy-client/src/models/file.js:589](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L589)

***

Expand Down Expand Up @@ -493,7 +493,7 @@ Whether the file is supported by Only Office

*Defined in*

[packages/cozy-client/src/models/file.js:569](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L569)
[packages/cozy-client/src/models/file.js:562](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L562)

***

Expand Down Expand Up @@ -711,7 +711,7 @@ Read a file on a mobile

*Defined in*

[packages/cozy-client/src/models/file.js:512](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L512)
[packages/cozy-client/src/models/file.js:505](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L505)

***

Expand Down Expand Up @@ -818,4 +818,4 @@ If there is a conflict, then we apply the conflict strategy : `erase` or `rename

*Defined in*

[packages/cozy-client/src/models/file.js:473](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L473)
[packages/cozy-client/src/models/file.js:466](https://github.com/cozy/cozy-client/blob/master/packages/cozy-client/src/models/file.js#L466)
23 changes: 8 additions & 15 deletions packages/cozy-client/src/models/file.js
Original file line number Diff line number Diff line change
Expand Up @@ -398,36 +398,29 @@ export const overrideFileForPath = async (client, dirPath, file, metadata) => {
* Method to generate a new filename if there is a conflict
*
* @param {string} filenameWithoutExtension - A filename without the extension
* @param {RegExp} [originalNameFormatRegex] - A regex to check if the name is still in his original format
* @param {import('../types').ConflictOptions} [conflictOptions] - Conflict options
* @returns {string} A filename with the right suffix
*/
export const generateNewFileNameOnConflict = (
filenameWithoutExtension,
originalNameFormatRegex
conflictOptions
) => {
let isOriginalNameFormat = false
if (
originalNameFormatRegex &&
originalNameFormatRegex.test(filenameWithoutExtension)
) {
isOriginalNameFormat = true
}
const delimiter = conflictOptions?.delimiter || '_'

//Check if the string ends by _1
const regex = new RegExp('(_)([0-9]+)$')
const regex = new RegExp(`(${delimiter})([0-9]+)$`)
const matches = filenameWithoutExtension.match(regex)
const shouldIncrement = matches && !isOriginalNameFormat
if (shouldIncrement) {
if (matches) {
let versionNumber = parseInt(matches[2])
//increment versionNumber
versionNumber++
const newFilenameWithoutExtension = filenameWithoutExtension.replace(
new RegExp('(_)([0-9]+)$'),
`_${versionNumber}`
new RegExp(`(${delimiter})([0-9]+)$`),
`${delimiter}${versionNumber}`
)
return newFilenameWithoutExtension
} else {
return `${filenameWithoutExtension}_1`
return `${filenameWithoutExtension}${delimiter}1`
}
}

Expand Down
49 changes: 31 additions & 18 deletions packages/cozy-client/src/models/file.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -569,31 +569,44 @@ describe('File Model', () => {
expect(filename2).toEqual('test_2')
const filename3 = fileModel.generateNewFileNameOnConflict('test_1_1_test')
expect(filename3).toEqual('test_1_1_test_1')
const filename4 = fileModel.generateNewFileNameOnConflict('test_')
expect(filename4).toEqual('test__1')
const filename5 = fileModel.generateNewFileNameOnConflict('test_1_1')
expect(filename5).toEqual('test_1_2')
const filename4 = fileModel.generateNewFileNameOnConflict(
'test_1_1_test_1'
)
expect(filename4).toEqual('test_1_1_test_2')
const filename5 = fileModel.generateNewFileNameOnConflict('test_')
expect(filename5).toEqual('test__1')
})

it('should generate the right file name with _X when passing a format', () => {
const regex = new RegExp('^([a-z]+)(_)([0-9]+)$') // test_1
it('should generate the right file name with _cozyX', () => {
const conflictOptions = {
delimiter: '_cozy'
}

const filename1 = fileModel.generateNewFileNameOnConflict('test', regex)
expect(filename1).toEqual('test_1')
const filename2 = fileModel.generateNewFileNameOnConflict('test_1', regex)
expect(filename2).toEqual('test_1_1')
const filename1 = fileModel.generateNewFileNameOnConflict(
'test',
conflictOptions
)
expect(filename1).toEqual('test_cozy1')
const filename2 = fileModel.generateNewFileNameOnConflict(
'test_cozy1',
conflictOptions
)
expect(filename2).toEqual('test_cozy2')
const filename3 = fileModel.generateNewFileNameOnConflict(
'test_1_1_test',
regex
'test_cozy1_test',
conflictOptions
)
expect(filename3).toEqual('test_1_1_test_1')
const filename4 = fileModel.generateNewFileNameOnConflict('test_', regex)
expect(filename4).toEqual('test__1')
expect(filename3).toEqual('test_cozy1_test_cozy1')
const filename4 = fileModel.generateNewFileNameOnConflict(
'test_cozy1_test_cozy1',
conflictOptions
)
expect(filename4).toEqual('test_cozy1_test_cozy2')
const filename5 = fileModel.generateNewFileNameOnConflict(
'test_1_1',
regex
'test_',
conflictOptions
)
expect(filename5).toEqual('test_1_2')
expect(filename5).toEqual('test__cozy1')
})
})

Expand Down
7 changes: 7 additions & 0 deletions packages/cozy-client/src/types.js
Original file line number Diff line number Diff line change
Expand Up @@ -645,6 +645,13 @@ import { QueryDefinition } from './queries/dsl'
* @property {string} hash - The redirect link's path (i.e. '/folder/SOME_FOLDER_ID')
*/

/**
* Represents available options of generateNewFileNameOnConflict method
*
* @typedef {object} ConflictOptions
* @property {string} [delimiter] - Delimiter before the incremented number. Default to '_'
*/

/**
* Template to type useState
*
Expand Down
2 changes: 1 addition & 1 deletion packages/cozy-client/types/models/file.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export function move(client: CozyClient, fileId: string, destination: {
path: string;
}, force?: boolean): Promise<any>;
export function overrideFileForPath(client: CozyClient, dirPath: string, file: object, metadata: object): Promise<import("../types").IOCozyFile>;
export function generateNewFileNameOnConflict(filenameWithoutExtension: string, originalNameFormatRegex?: RegExp): string;
export function generateNewFileNameOnConflict(filenameWithoutExtension: string, conflictOptions?: import('../types').ConflictOptions): string;
export function generateFileNameForRevision(file: import("../types").IOCozyFile, revision: object, f: Function): string;
export function uploadFileWithConflictStrategy(client: CozyClient, file: string | ArrayBuffer, options: FileUploadOptions): any;
export function readMobileFile(fileURL: string): Promise<any>;
Expand Down
9 changes: 9 additions & 0 deletions packages/cozy-client/types/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1092,6 +1092,15 @@ export type RedirectLinkData = {
*/
hash: string;
};
/**
* Represents available options of generateNewFileNameOnConflict method
*/
export type ConflictOptions = {
/**
* - Delimiter before the incremented number. Default to '_'
*/
delimiter?: string;
};
/**
* Template to type useState
*/
Expand Down