Use same lock values as mobile clients
[ProtonMail-WebClient.git] / packages / docs-core / lib / UseCase / LoadDocument.ts
blob46345d651fa4d6c6d87c6d5a542c1aec33b791ea
1 import type { UseCaseInterface } from '../Domain/UseCase/UseCaseInterface'
2 import { Result } from '../Domain/Result/Result'
3 import type { DocumentMetaInterface } from '@proton/docs-shared'
4 import type { DriveCompat, NodeMeta } from '@proton/drive-store'
5 import type { GetDocumentMeta } from './GetDocumentMeta'
6 import { getErrorString } from '../Util/GetErrorString'
7 import type { DocumentEntitlements } from '../Types/DocumentEntitlements'
8 import { rawPermissionToRole } from '../Types/DocumentEntitlements'
10 type LoadDocumentResult = {
11   entitlements: DocumentEntitlements
12   meta: DocumentMetaInterface
13   lastCommitId?: string
16 /**
17  * Performs initial loading procedure for document, including fetching keys and latest commit binary from DX.
18  */
19 export class LoadDocument implements UseCaseInterface<LoadDocumentResult> {
20   constructor(
21     private driveCompat: DriveCompat,
22     private getDocumentMeta: GetDocumentMeta,
23   ) {}
25   async execute(lookup: NodeMeta): Promise<Result<LoadDocumentResult>> {
26     try {
27       const [keysResult, fetchResult, permissionsResult] = await Promise.all([
28         this.driveCompat.getDocumentKeys(lookup).catch((error) => {
29           throw new Error(`Failed to load keys: ${error}`)
30         }),
31         this.getDocumentMeta.execute(lookup).catch((error) => {
32           throw new Error(`Failed to fetch document metadata: ${error}`)
33         }),
34         this.driveCompat.getNodePermissions(lookup).catch((error) => {
35           throw new Error(`Failed to load permissions: ${error}`)
36         }),
37       ])
39       if (fetchResult.isFailed()) {
40         return Result.fail(fetchResult.getError())
41       }
43       const meta: DocumentMetaInterface = fetchResult.getValue()
44       if (!meta) {
45         return Result.fail('Document meta not found')
46       }
48       if (!keysResult || !permissionsResult) {
49         return Result.fail('Unable to load all necessary data')
50       }
52       const entitlements: DocumentEntitlements = {
53         keys: keysResult,
54         role: rawPermissionToRole(permissionsResult),
55       }
57       return Result.ok({ entitlements, meta, lastCommitId: meta.latestCommitId() })
58     } catch (error) {
59       return Result.fail(getErrorString(error) ?? 'Failed to load document')
60     }
61   }