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> {
12 private driveCompat: DriveCompat,
13 private getDocumentMeta: GetDocumentMeta,
14 private seedInitialCommit: SeedInitialCommit,
17 async execute(newName: string, lookup: NodeMeta, state: Uint8Array): Promise<Result<DocumentNodeMeta>> {
19 const node = await this.driveCompat.getNode(lookup)
21 const parentMeta: NodeMeta = node.parentNodeId
23 volumeId: node.volumeId,
24 linkId: node.parentNodeId,
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,
35 if (documentMetaResult.isFailed()) {
36 return Result.fail(documentMetaResult.getError())
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())
46 return Result.ok(shellResult)
48 return Result.fail(getErrorString(error) ?? 'Failed to duplicate document')