Use same lock values as mobile clients
[ProtonMail-WebClient.git] / packages / docs-core / lib / UseCase / DuplicateDocument.ts
blobe7466d0f8f3841cb404d6467999f1bd64e157fe7
1 import type { DocumentNodeMeta, DriveCompat } from '@proton/drive-store'
2 import type { UseCaseInterface } from '../Domain/UseCase/UseCaseInterface'
3 import { Result } from '../Domain/Result/Result'
5 import type { NodeMeta } from '@proton/drive-store'
6 import type { SeedInitialCommit } from './SeedInitialCommit'
7 import type { GetDocumentMeta } from './GetDocumentMeta'
8 import { getErrorString } from '../Util/GetErrorString'
10 export class DuplicateDocument implements UseCaseInterface<DocumentNodeMeta> {
11   constructor(
12     private driveCompat: DriveCompat,
13     private getDocumentMeta: GetDocumentMeta,
14     private seedInitialCommit: SeedInitialCommit,
15   ) {}
17   async execute(newName: string, lookup: NodeMeta, state: Uint8Array): Promise<Result<DocumentNodeMeta>> {
18     try {
19       const node = await this.driveCompat.getNode(lookup)
21       const parentMeta: NodeMeta = node.parentNodeId
22         ? {
23             volumeId: node.volumeId,
24             linkId: node.parentNodeId,
25           }
26         : await this.driveCompat.getMyFilesNodeMeta()
28       const name = await this.driveCompat.findAvailableNodeName(parentMeta, newName)
29       const shellResult = await this.driveCompat.createDocumentNode(parentMeta, name)
31       const documentMetaResult = await this.getDocumentMeta.execute({
32         volumeId: shellResult.volumeId,
33         linkId: shellResult.linkId,
34       })
35       if (documentMetaResult.isFailed()) {
36         return Result.fail(documentMetaResult.getError())
37       }
39       const newDoc = documentMetaResult.getValue()
41       const commitResult = await this.seedInitialCommit.execute(newDoc, state, shellResult.keys)
42       if (commitResult.isFailed()) {
43         return Result.fail(commitResult.getError())
44       }
46       return Result.ok(shellResult)
47     } catch (error) {
48       return Result.fail(getErrorString(error) ?? 'Failed to duplicate document')
49     }
50   }